๐Ÿค– Backend

์ด์ „ ๋…ธ์…˜ ๋ธ”๋กœ๊ทธ์˜ ์Šคํ”„๋ง์˜ application.properties ์„ค์ • (+ ddl ์„ค์ •, DB url/port) (2021.07.26)๋กœ๋ถ€ํ„ฐ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜๋œ ๊ธ€์ž…๋‹ˆ๋‹ค. application.properties spring.jpa.hibernate.ddl-auto=update spring.jpa.generate-ddl=false spring.datasource.url=jdbc:mariadb//{PATH}/{DATABASE} spring.datasource.username={USERNAME} spring.datasource.driver-class-name=org.mariadb.jdbc.Driver jpa ddl ์„ค์ • ddl-auto update : ๊ธฐ์กด์˜ ์Šคํ‚ค๋งˆ๋ฅผ ์œ ์ง€ํ•˜๋ฉฐ JPA์— ์˜ํ•ด ๋ณ€๊ฒฝ๋œ ๋ถ€๋ถ„๋งŒ ์ถ”..
์ด์ „ ๋…ธ์…˜ ๋ธ”๋กœ๊ทธ์˜ [MySQL] DB Authentication ๋ฌธ์ œ | ERROR 1698 | Access denied for user 'root' (2021.07.26)๋กœ๋ถ€ํ„ฐ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜๋œ ๊ธ€์ž…๋‹ˆ๋‹ค. MariaDB 10.0 ๋ฒ„์ „๋ถ€ํ„ฐ๋Š” ๋ณด์•ˆ ๋ฐฉ์‹์ด 'Unix Socket' ๋ฐฉ์‹์ด ์ ์šฉ๋œ๋‹ค. mysql -u root -p password spring datasource ์ ‘์† ๋”ฐ๋ผ์„œ ์ด ๋‘ ๊ฐ€์ง€๋ฅผ ์œ„ํ•ด์„œ๋Š” plugin ์„ ๋ฐ”๊ฟ”์•ผํ•œ๋‹ค. ๋งŒ์•ฝ ์ดˆ๊ธฐ ์ ‘์†์ด๋ผ๋ฉด, ๋น„๋ฐ€๋ฒˆํ˜ธ๋„ ์„ค์ •ํ•ด์ค˜์•ผํ•œ๋‹ค. $ sudo mysql mysql> use mysql; mysql> CREATE USER 'user'@'localhost' IDENTIFIED BY 'password'; mysql> CREATE USER 'user'@'%' ..
์ด์ „ ๋…ธ์…˜ ๋ธ”๋กœ๊ทธ์˜ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ์™€ ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ (2023.03.13)๋กœ๋ถ€ํ„ฐ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜๋œ ๊ธ€์ž…๋‹ˆ๋‹ค. ๋‹จ์œ„ ํ…Œ์ŠคํŠธ vs ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ(Unit Test)๋Š” ํ•˜๋‚˜์˜ ๋ชจ๋“ˆ์„ ๊ธฐ์ค€์œผ๋กœ ๋…๋ฆฝ์ ์œผ๋กœ ์ง„ํ–‰๋˜๋Š” ๊ฐ€์žฅ ์ž‘์€ ๋‹จ์œ„์˜ ํ…Œ์ŠคํŠธ์ด๋‹ค. ์—ฌ๊ธฐ์„œ ๋ชจ๋“ˆ์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์ž‘๋™ํ•˜๋Š” ํ•˜๋‚˜์˜ ๊ธฐ๋Šฅ ๋˜๋Š” ๋ฉ”์†Œ๋“œ๋กœ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์›น์—์„œ ๋กœ๊ทธ์ธ ๋ฉ”์†Œ๋“œ์— ๋Œ€ํ•œ ๋…๋ฆฝ์ ์ธ ํ…Œ์ŠคํŠธ๊ฐ€ 1๊ฐœ์˜ ๋‹จ์œ„ํ…Œ์ŠคํŠธ๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค. ์ฆ‰, ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋Š” “์–ด๋–ค ๊ธฐ๋Šฅ์ด ์‹คํ–‰๋˜๋ฉด ์–ด๋–ค ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜จ๋‹ค" ์ •๋„๋กœ ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•œ๋‹ค. ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ(Integration Test)๋Š” ๋ชจ๋“ˆ์„ ํ†ตํ•ฉํ•˜๋Š” ๊ณผ์ •์—์„œ ๋ชจ๋“ˆ ๊ฐ„์˜ ํ˜ธํ™˜์„ฑ์„ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ์ˆ˜ํ–‰๋˜๋Š” ํ…Œ์ŠคํŠธ์ด๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ชจ๋“ˆ๋“ค๋กœ ๊ตฌ์„ฑ์ด ๋˜๊ณ , ๋ชจ๋“ˆ๋“ค๋ผ๋ฆฌ ์ƒํ˜ธ์ž‘์šฉํ•œ๋‹ค..
์ด์ „ ๋…ธ์…˜ ๋ธ”๋กœ๊ทธ์˜ ์†Œ๋‚˜ํ๋ธŒ์™€ Jacoco๋กœ ์ฝ”๋“œ๋ฅผ ๊นจ๋—ํ•˜๊ฒŒ ์œ ์ง€ํ•˜๊ธฐ (2023.09.07)๋กœ๋ถ€ํ„ฐ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜๋œ ๊ธ€์ž…๋‹ˆ๋‹ค. โš™๏ธ Setup EC2 ์„œ๋ฒ„์— SonarQube ์„ค์น˜ ๋ฐ ์„ค์ • 1. ๋ฉ”๋ชจ๋ฆฌ ์ฆ๊ฐ€๋ฅผ ์œ„ํ•œ Swap ์„ค์ • ํŒŒ์ผ ์ƒ์„ฑ ๋ฐ ์„ค์น˜ touch ~/swapfile sudo fallocate -l 2G ~/swapfile sudo chmod 600 ~/swapfile sudo mkswap ~/swapfile sudo swapon ~/swapfile sudo yum install java-17-amazon-corretto-headless ์•„๋ž˜ ํŒŒ์ผ๋“ค์„ ์—ด์–ด์„œ ๊ฐ€์žฅ ์•„๋ž˜์— ์ถ”๊ฐ€ /etc/fstab ~/swapfile swap swap defaults 0 0 /etc/sysctl.conf vm.max..
์ด์ „ ๋…ธ์…˜ ๋ธ”๋กœ๊ทธ์˜ Transaction ์ด๋ž€? (2023.08.11)๋กœ๋ถ€ํ„ฐ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜๋œ ๊ธ€์ž…๋‹ˆ๋‹ค. ์ €๋Š” ๋Š˜ Swagger์˜ ์ž๋™ํ™”์™€ ๊ฐ„๋‹จํ•œ ์–ด๋…ธํ…Œ์ด์…˜์„ ํ†ตํ•ด ๋น ๋ฅธ API ๋ฌธ์„œ ๋ฐฐํฌ๋งŒ ํ•ด๋ดค์Šต๋‹ˆ๋‹ค. ๋น ๋ฅด๊ฒŒ ์ž‘์—…๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ์žฅ์ ์€ ์žˆ์—ˆ์ง€๋งŒ, ๋ชจ๋“  ์š”์ฒญ์„ Postman์œผ๋กœ ํ…Œ์ŠคํŠธํ•˜๋Š” ๊ณผ์ •์—์„œ ์‹ค์ˆ˜๊ฐ€ ์žˆ์„ ์ˆ˜ ๋ฐ–์— ์—†์—ˆ๊ณ  Swagger์˜ ์ž๋™ ์ƒ์„ฑ ๋ฌธ์„œ๊ฐ€ ์นœ์ ˆํ•œ ํŽธ์€ ์•„๋‹ˆ๊ธฐ์— ์ฝ๋Š” ์‚ฌ๋žŒ๋งˆ๋‹ค ๋‹ค๋ฅด๊ฒŒ ์ดํ•ด๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํ”„๋ก ํŠธ์—์„œ API๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ๊ณผ์ •์—์„œ ์‹ค์ˆ˜๊ฐ€ ์ž์ฃผ ๋ฐœ์ƒํ•˜๊ฑฐ๋‚˜, ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋”๋ผ๋„ ์ €์—๊ฒŒ ์ง์ ‘ ๋ฌผ์–ด๋ณด๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์•˜์Šต๋‹ˆ๋‹ค. API ๋ฌธ์„œ๋ฅผ ์ž‘์„ฑํ•œ ์˜์˜๊ฐ€ ์‚ฌ๋ผ์ ธ๋ฒ„๋ฆฌ๋Š” ์ผ์ด ๋งŽ์•˜์Šต๋‹ˆ๋‹ค… ๐Ÿ˜” ์ด๋ฒˆ ๋ฆฌ๋ทฐ๋ฉ”์ดํŠธ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ์ œํ•œ๋œ ์‹œ๊ฐ„ ๋‚ด์— FE์™€ AI ๋ชจ๋‘๊ฐ€ ์‚ฌ์šฉํ•  ์„œ๋ฒ„๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ•˜๋ฏ€๋กœ..
์ด์ „ ๋…ธ์…˜ ๋ธ”๋กœ๊ทธ์˜ Swagger์—์„œ MultipartFile๊ณผ DTO ํ•œ ๋ฒˆ์— ๋ฐ›๋Š” @RequestPart ์š”์ฒญ์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“ค๊ธฐ (2023.08.29)๋กœ๋ถ€ํ„ฐ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜๋œ ๊ธ€์ž…๋‹ˆ๋‹ค. ๋ฒˆ๊ฑฐ๋กญ๊ฒŒ ์š”์ฒญ์„ ์š”์ฒญํ•  ํ•„์š” ์—†์ด ํ•˜๋‚˜์˜ ์š”์ฒญ์—์„œ ํŒŒ์ผ๊ณผ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•  ์ˆ˜ ์žˆ๋„๋ก ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ํž˜๋“ค๊ฒŒ ๊ตฌํ˜„ํ–ˆ๋”๋‹ˆ, ํ”„๋ก ํŠธ์—์„œ ์‚ฌ์šฉํ•  ๋•Œ ์š”์ฒญ์ด ๋ฐœ์ƒํ•˜๊ณ  Swagger์—์„œ ์ œ๋Œ€๋กœ ๋™์ž‘ํ•˜์ง€ ์•Š์•˜๋‹ค. ๋ณธ ํฌ์ŠคํŒ…์€ ๋…ธ๋ ฅ์ด ํ—›๋˜์ง€ ์•Š๋„๋ก ๋ฌธ์ œ๋ฅผ ํ•˜๋‚˜์”ฉ ๊ณ ์ณ๋‚˜๊ฐ„ ๊ธฐ๋ก๋“ค์ด๋‹ค. 1. Request body์˜ Content-type์ด ์˜ฌ๋ฐ”๋ฅด์ง€ ์•Š์Œ ๋ฌธ์ œ ์ƒํ™ฉ MultipartFile์™€ DTO๋ฅผ ํ•œ ๋ฒˆ์— ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ์š”์ฒญ์„ ๋งŒ๋“ค๋•Œ, ๋‹ค๋ฅธ ์—ฌํƒ€ ์š”์ฒญ๋“ค์ฒ˜๋Ÿผ @PostMapping์— URL๋งŒ ์„ค์ •ํ•˜๋ฉด Swagger์˜ Request b..
์ด์ „ ๋…ธ์…˜ ๋ธ”๋กœ๊ทธ์˜ enum ํ•„๋“œ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌํ•˜๊ธฐ (2022.02.20)๋กœ๋ถ€ํ„ฐ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜๋œ ๊ธ€์ž…๋‹ˆ๋‹ค. public enum Tier { BRONZE, // 0 SILVER, // 1 GOLD, // 2 DIAMOND // 3 } @Entity public class User { @Enumerated(EnumType.ORDINAL) // Default Setting private Tier tier; } enum์˜ ordinal ๊ฐ’์€ 0๋ถ€ํ„ฐ ์‹œ์ž‘ BRONZE : 0 SILVER : 1 ... Default Setting์ธ @Enumerated(EnumType.ORDINAL) ์€ enum์˜ ordinal ๊ฐ’์„ DB์— ์ €์žฅ ⇒ Integer ํ•„๋“œ์ฒ˜๋Ÿผ ์˜ค๋ฆ„์ฐจ์ˆœ, ๋‚ด๋ฆผ์ฐจ์ˆœ ์ •๋ ฌํ•˜๋ฉด ๋จ.
์ด์ „ Velog์˜ ์™ธ๋ถ€ ์„œ๋น„์Šค ์š”์ฒญ ๊ฒฐ๊ณผ์— ๋”ฐ๋ผ ๋ฆฌ๋ทฐ ์—…๋กœ๋“œ ์š”์ฒญ ๊ฒฐ๊ณผ๊ฐ€ ๋‹ฌ๋ผ์ง€๋Š” ๊ฐ•๊ฒฐํ•ฉ ๊ตฌ์กฐ๋ฅผ ๊ฐœ์„ ํ•ด๋ณด์ž. (2023.11.02) ๋กœ๋ถ€ํ„ฐ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜๋œ ๊ธ€์ž…๋‹ˆ๋‹ค. ๋™๊ธฐ ๋ฆฌ๋ทฐ๋Š” ๋ณธ ํ”„๋กœ์ ํŠธ์˜ ํ•ต์‹ฌ์œผ๋กœ์„œ, ์ตœ๋Œ€ํ•œ ๋งŽ์€ ๋ฆฌ๋ทฐ๋ฅผ ์ž…๋ ฅ๋ฐ›๊ณ  ์ด๋ฅผ ๋ถ„์„ํ•ด ๊ฐ€์น˜์žˆ๋Š” ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฆฌ๋ทฐ์˜ ์—…๋กœ๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ณผ์ •์„ ํ†ตํ•ด ์ง„ํ–‰๋ฉ๋‹ˆ๋‹ค. AWS S3๋ฅผ ํ†ตํ•œ ์‚ฌ์ง„ ์—…๋กœ๋“œ์™€ AI ๋ฆฌ๋ทฐ ๋ถ„์„ ๋ชจ๋ธ์„ ํ†ตํ•œ ๋ฆฌ๋ทฐ ๋ถ„์„ ์š”์ฒญ์ด๋ผ๋Š” 2๊ฐœ์˜ ์™ธ๋ถ€ ์„œ๋น„์Šค๋ฅผ ๊ฑฐ์นœ ํ›„ ใ„นใ…ฃ๋ทฐ ๋ฐ์ดํ„ฐ๊ฐ€ DB์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. ์ฆ‰, ๋™๊ธฐ๋กœ ์ž‘๋™ํ•˜๊ณ  ํ•˜๋‚˜์˜ ํŠธ๋žœ์žญ์…˜์œผ๋กœ ๋ฌถ์ด๊ธฐ ๋•Œ๋ฌธ์—, ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ฆฌ๋ทฐ๋ฅผ ์—…๋กœ๋“œํ•  ๋•Œ ์„ธ ๊ฐ€์ง€ ๊ณผ์ •์ด ๋ชจ๋‘ ์™„๋ฃŒ๋˜๋Š” ๊ธด ์‹œ๊ฐ„์„ ๊ธฐ๋‹ค๋ ค์•ผ ํ•˜๊ณ  ์™ธ๋ถ€ ์„œ๋น„์Šค ์ค‘ ํ•˜๋‚˜๋ผ๋„ ์‹คํŒจํ•˜๋ฉด ๋ฆฌ๋ทฐ ์—…๋กœ๋“œ๊ฐ€ ์‹คํŒจํ•˜๋Š” ๊ฐ•๊ฒฐํ•ฉ ๊ตฌ์กฐ์ด๋‹ค. ..
์ด์ „ Velog์˜ ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์กฐํšŒ ์„ฑ๋Šฅ์„ ๊ฐœ์„ ํ•ด๋ณด์ž (2) : ์ธ๋ฑ์Šค ํŠœ๋‹ (2023.11.12) ๋กœ๋ถ€ํ„ฐ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜๋œ ๊ธ€์ž…๋‹ˆ๋‹ค. Github main repo / Github server repo ๋™๊ธฐ 1ํŽธ์˜ ์นดํ…Œ๊ณ ๋ฆฌ๋ณ„ ๋ฆฌ๋ทฐ ์กฐํšŒ๋ฅผ ์‹œ์ž‘์œผ๋กœ 500ms๊ฐ€ ๋„˜์–ด๊ฐ€๋Š” ์š”์ฒญ๋“ค์„ ์œ„์ฃผ๋กœ Cardinality/Selectivity๋ฅผ ๊ณ ๋ คํ•˜์—ฌ ์ธ๋ฑ์Šค๋ฅผ ์ƒ์„ฑํ–ˆ๋‹ค. ํ•˜์ง€๋งŒ 1ํŽธ๊นŒ์ง€๋Š” ์ง„์งœ ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ์•„๋‹ˆ์˜€๋‹ค. 2ํŽธ๋ถ€ํ„ฐ ์—ฌ๊ธฐ์–ด๋•Œ์ปดํผ๋‹ˆ ๋ฒค์ฒ˜ ํ”„๋กœ์ ํŠธ์ธ๋งŒํผ ์—ฌ๊ธฐ์–ด๋•Œ ํ™๋ณด์ž๋ฃŒ์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ ๊ทœ๋ชจ์—์„œ ์„ฑ๋Šฅ์„ ์ธก์ •ํ•ด๋ณด๊ณ  ํ•„์š”ํ•˜๋‹ค๋ฉด ๊ฐœ์„ ๊นŒ์ง€ ์ง„ํ–‰ํ•ด๋ณด์ž. ๊ธฐ์กด ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ ์Šค์ผ€์ผ ์—ฌํ–‰์ƒํ’ˆ: 30 (๊ฐ ์นดํ…Œ๊ณ ๋ฆฌ 10๊ฐœ์”ฉ, ์ˆ™์†Œ, ์‹๋‹น, ๋ Œํ„ฐ์นด) ์˜ˆ์•ฝ: 540,000 (์นดํ…Œ๊ณ ๋ฆฌ ๋ณ„ 180,000) - ์—ฌํ–‰์ƒํ’ˆ ๋งˆ..
์ด์ „ Velog์˜ ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์กฐํšŒ ์„ฑ๋Šฅ์„ ๊ฐœ์„ ํ•ด๋ณด์ž (1) : ์ธ๋ฑ์Šค ์ ์šฉ (2023.10.27) ๋กœ๋ถ€ํ„ฐ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜๋œ ๊ธ€์ž…๋‹ˆ๋‹ค. Github main repo / Github server repo ๋™๊ธฐ ์ง€๋‚œ ๋ฒˆ์— ๋‹ค์–‘ํ•œ JPA ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ  ๋น„ํšจ์œจ์ ์œผ๋กœ ์ƒ์„ฑ๋˜๋Š” ์ฟผ๋ฆฌ๋ฅผ ์ตœ์ ํ™”ํ•ด ์ „์ฒด์ ์ธ ์„œ๋ฒ„ ์„ฑ๋Šฅ์ด ๋Œ€ํญ ํ–ฅ์ƒ๋˜์—ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋ฆฌ๋ทฐ ์กฐํšŒ API์˜ ์ผ๋ถ€ ์š”์ฒญ์˜ ๊ฒฝ์šฐ ๋Œ€ํญ ํ–ฅ์ƒ๋˜์—ˆ์Œ์—๋„ ๋งŒ์กฑ์Šค๋Ÿฌ์šด ์ฟผ๋ฆฌ ์ฒ˜๋ฆฌ ์‹œ๊ฐ„์— ๋„๋‹ฌํ•˜์ง€ ๋ชปํ–ˆ๋‹ค. ๋‹ค์–‘ํ•œ ์ •๋ ฌ๊ณผ ํ•„ํ„ฐ๋ง์„ ์ง€์›ํ•˜๋Š” ์กฐํšŒ ์ฟผ๋ฆฌ์ธ๋งŒํผ ๋Œ€๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐ๊ฑด์ ˆ, ์ •๋ ฌ ์ ์šฉํ•˜๋Š”๋ฐ ๋งŽ์€ ๋น„์šฉ์ด ๋“ค๊ณ , ํŠนํžˆ ๋ฆฌ๋ทฐ์˜ ๋ถ„์„ ๊ฒฐ๊ณผ ์ค‘ '์ฒญ๊ฒฐ' ์†์„ฑ์ด ํฌํ•จ๋œ ๋ฆฌ๋ทฐ๋“ค์ด๋‚˜ ๋ฆฌ๋ทฐ์˜ ๋ถ„์„ ๊ฒฐ๊ณผ ์ค‘ '์ฒญ๊ฒฐ' ์†์„ฑ์˜ '๋จผ์ง€' ํ‚ค์›Œ๋“œ๊ฐ€ ํฌํ•จ๋œ ๋ฆฌ๋ทฐ๋“ค๊ณผ ๊ฐ™์ด review ํ…Œ์ด๋ธ”๊ณผ..
sckwon770
'๐Ÿค– Backend' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๊ธ€ ๋ชฉ๋ก (2 Page)