์ธํ”„๋Ÿฐ ์˜๋ฌธ ๋ธŒ๋žœ๋“œ ๋กœ๊ณ 
์ธํ”„๋Ÿฐ ์˜๋ฌธ ๋ธŒ๋žœ๋“œ ๋กœ๊ณ 
BEST

[์ฝ”๋“œํŒฉํ† ๋ฆฌ] [์ดˆ๊ธ‰] NestJS REST API ๋ฐฑ์—”๋“œ ์™„์ „ ์ •๋ณต ๋งˆ์Šคํ„ฐ ํด๋ž˜์Šค - NestJS Core

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ, ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ๋‹ค์Œ์€ ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ! NestJS๋ฅผ ์ด์šฉํ•œ REST API ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ, Socket IO ๊ฐœ๋ฐœ ๋ฐ ๋ฐฐํฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์ดˆ๊ธ‰์ž๋ฅผ ์œ„ํ•ด ์ค€๋น„ํ•œ
[์›น ๊ฐœ๋ฐœ] ๊ฐ•์˜์ž…๋‹ˆ๋‹ค.

์ด๋Ÿฐ ๊ฑธ ๋ฐฐ์šธ ์ˆ˜ ์žˆ์–ด์š”

  • NestJS

  • TypeORM

  • Postgresql

  • Docker

  • Docker Compose

  • REST API

๋ฐฑ์—”๋“œ๊ฐ€ ์ฒ˜์Œ์ด์–ด๋„ ๋ˆ„๊ตฌ๋‚˜ OK! 
ํŠธ๋ Œ๋””ํ•œ NestJS๋กœ ์„œ๋ฒ„ ๊ฐœ๋ฐœ์„ ๋ฐฐ์›Œ๋ณด์„ธ์š”.

NestJS ํ”„๋ ˆ์ž„์›Œํฌ ๋งˆ์Šคํ„ฐ ํด๋ž˜์Šค : Part 1

Node.js ๊ธฐ๋ฐ˜ ๋ฐฑ์—”๋“œ ์„œ๋ฒ„ ํ”„๋ ˆ์ž„์›Œํฌ, NestJS์˜ ๋ผ์ดํ”„์‚ฌ์ดํด์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๋ชจ๋“  ์ฝ”์–ด ๊ธฐ๋Šฅ์„ ๋ฐฐ์šฐ๋Š” ๋ฐ ์ง‘์ค‘ํ•ฉ๋‹ˆ๋‹ค.

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ, ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋ฐฐ์› ๋‹ค๋ฉด 
์ด์ œ๋Š” ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž…๋‹ˆ๋‹ค!

  • โœ… NestJS์˜ ์„ธ์„ธํ•œ ๊ธฐ๋Šฅ๊ณผ ๋‹ค์–‘ํ•œ Annotation์„ ์ œ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ๋ฐฐ์›๋‹ˆ๋‹ค.
  • โœ… Documentation์— ์ถฉ์‹คํ•œ, ๋””ํ…Œ์ผํ•œ ๊ฐ•์˜๋ฅผ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

Javascript์™€ Typescript๋งŒ ์•Œ๊ณ  ์žˆ๋‹ค๋ฉด ์ด ๊ฐ•์˜๋ฅผ ํ†ตํ•ด์„œ NestJS๋กœ REST API๋ฅผ ๊ตฌ์„ฑํ•˜๊ณ , Socket IO๋ฅผ ์‚ฌ์šฉํ•ด AWS์— ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ํ”„๋กœ๋•์…˜ ๋ฐฐํฌํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ๋ฐฐ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Node.js ๊ธฐ๋ฐ˜ ๋ฐฑ์—”๋“œ ์„œ๋ฒ„ ๊ธฐ์ˆ ์„ ๋ฐฐ์šฐ๊ณ  ์‹ถ์€ ๋ถ„

JS/TS ํ•™์Šต ์ดํ›„ ํ›„์† ๊ฐ•์˜๋ฅผ ์ฐพ๋Š” ๋ถ„

ํŠธ๋ Œ๋””ํ•˜๊ณ  ์ธ๊ธฐ์žˆ๋Š” ๋ฐฑ์—”๋“œ ๊ธฐ์ˆ ์„ ๋ฐฐ์šฐ๊ณ  ์‹ถ์€ ๋ถ„

์ด ๊ฐ•์˜๋Š” ๋‹จ์ˆœํžˆ ๊ฒ‰ํ•ฅ๊ธฐ์‹์˜ NestJS ์ดˆ๋ณด ํƒˆ์ถœ ๊ฐ•์˜๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. NestJS์—์„œ ์ œ๊ณตํ•ด ์ฃผ๋Š” ๊ธฐ๋Šฅ๋“ค์„ ์ „๋ฐ˜์ ์œผ๋กœ ๋ชจ๋‘ ํฌํ•จํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ์ฐจ๊ทผ์ฐจ๊ทผ ๋‚œ์ด๋„๋ฅผ ์˜ฌ๋ ค๊ฐ€๋ฉฐ ์–ด๋–ค ์ƒํ™ฉ์—์„œ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ๊ธฐ๋Šฅ์ธ์ง€ ์˜ˆ์ œ๋ฅผ ํ†ตํ•ด ํ•™์Šตํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ฐ€๋ฅด์นฉ๋‹ˆ๋‹ค.

JS/TS ๊ธฐ์ดˆ๊ฐ€ ๊ถ๊ธˆํ•˜๋‹ค๋ฉด


๋ฐฐ์šฐ๋Š” ๋‚ด์šฉ์„ 
ํ™•์ธํ•ด๋ณด์„ธ์š”.

๐Ÿ’ก ๋ฐฑ์—”๋“œ์™€ REST API ์„ค๊ณ„๋ฅผ ์ฒ˜์Œ ๋ฐฐ์šฐ๋Š” ํ•™์ƒ๋“ค๋„ ์ฐจ๊ทผ์ฐจ๊ทผ ๋”ฐ๋ผ์˜ฌ ์ˆ˜ ์žˆ๋„๋ก ์ฒœ์ฒœํžˆ ๋‚œ์ด๋„๋ฅผ ์˜ฌ๋ฆฌ๋Š” ์„ฌ์„ธํ•œ ์ปค๋ฆฌํ˜๋Ÿผ์„ ์ œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฐ€์žฅ ์ธ๊ธฐ์žˆ๋Š” SNS ์ค‘ ํ•˜๋‚˜์ธ ์ธ์Šคํƒ€๊ทธ๋žจ์„ ๋ชจ๋ฐฉํ•œ ๋ฐฑ์—”๋“œ๋ฅผ ์„ค๊ณ„ํ•˜๋ฉฐ ๋ฐฑ์—”๋“œ ์„ค๊ณ„๋ฅผ ๋ฐฐ์›๋‹ˆ๋‹ค.

NestJS๋ฅผ ์ด์šฉํ•ด์„œ REST API ๋ฐฑ์—”๋“œ๋ฅผ ๊ตฌ์ถ•ํ•˜๊ณ  ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

TypeORM์„ ์ด์šฉํ•œ ๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„ค๊ณ„๋ฅผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Socket.IO(์†Œ์ผ“IO)๋ฅผ ์ด์šฉํ•œ ์‹ค์‹œ๊ฐ„ ์ฑ„ํŒ… ์„œ๋น„์Šค ๊ฐœ๋ฐœ ๋ฐ ๊ตฌํ˜„์„ ํ•ด๋ด…๋‹ˆ๋‹ค.

Docker(๋„์ปค)๋ฅผ ์ด์šฉํ•œ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ์„ธํŒ… ๋ฐ ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ ์„ธํŒ…์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ƒ์„ธ ์ปค๋ฆฌํ˜๋Ÿผ

1. ๊ฐ•์˜ ์†Œ๊ฐœ ๋ฐ ๊ฐ์ข… ์ด๋ก 

NestJS ๊ฐ•์˜๋ฅผ ํ•™์Šตํ•˜๊ธฐ ์œ„ํ•œ ๊ธฐ๋ณธ ์ง€์‹๋“ค์„ ์Šต๋“ํ•ฉ๋‹ˆ๋‹ค. ํ‚ค๋…ธํŠธ ๊ธฐ๋ฐ˜์œผ๋กœ ์ง„ํ–‰๋˜๋ฉฐ ๋‹จ์ˆœํžˆ NestJS์— ๋Œ€ํ•œ ๋‚ด์šฉ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋ฐฑ์—”๋“œ ์—”์ง€๋‹ˆ์–ด ๊ฐ€์ด๋“œ, Node.js ๊ฐ„๋‹จ ์˜ค๋ฒ„๋ทฐ ๋ฐ ๊ธฐ์ˆ ์  ์„ค๋ช…, HTTP, NestJS ์†Œ๊ฐœ ๋“ฑ ์‹ค๋ฌด๋ฅผ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์— ๊ผญ ํ•„์š”ํ•œ ์ง€์‹๋“ค์„ ๋‹ด์•˜์Šต๋‹ˆ๋‹ค.

2. ํ™˜๊ฒฝ์„ค์ •

NestJS๋ฅผ ๋ฐฐ์šฐ๊ธฐ ์œ„ํ•ด macOS์™€ Windows์—์„œ์˜ ํ™˜๊ฒฝ์„ค์ •์„ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

3. Node.js์™€ Express๋ฅผ ์ด์šฉํ•œ ์„œ๋ฒ„ ๊ตฌ์„ฑ 

Node.js์—์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ œ๊ณตํ•ด์ฃผ๋Š” ํŒจํ‚ค์ง€์ธ HTTP๋ฅผ ์ด์šฉํ•ด์„œ ์„œ๋ฒ„๋ฅผ ๊ตฌ์„ฑํ•ด๋ณด๊ณ  NestJS๊ฐ€ ๋‚ด๋ถ€์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” ๋…ธ๋“œ ์ธ๊ธฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ธ Express๋ฅผ ์ด์šฉํ•œ ์„œ๋ฒ„ ๊ตฌ์„ฑ์„ ๊ฐ„๋‹จํžˆ ์ง„ํ–‰ํ•ด๋ณด๋ฉฐ ์žฅ๋‹จ์ ์„ ์‚ดํŽด๋ด…๋‹ˆ๋‹ค.

4. ํ”„๋กœ์ ํŠธ ์ปจ์…‰ ์ •๋ฆฌ

๊ฐ•์˜์—์„œ ์‚ฌ์šฉํ•  ์ธ์Šคํƒ€๊ทธ๋žจ SNS ์ปจ์…‰์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

5. ์ปจํŠธ๋กค๋Ÿฌ (Controller)

NestJS์˜ REST API๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ์ตœ์ „๋ฐฉ ์š”์†Œ ์ค‘ ํ•˜๋‚˜์ธ ์ปจํŠธ๋กค๋Ÿฌ์— ๋Œ€ํ•ด ๋ฐฐ์›Œ๋ด…๋‹ˆ๋‹ค.

6. ์ฟผ๋ฆฌ์™€ ํŒŒ๋ผ๋ฏธํ„ฐ (Query and Parameters)

์ปจํŠธ๋กค๋Ÿฌ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ์—ฌ๋Ÿฌ ๋ฐฉ๋ฒ• ์ค‘ Query์™€ Parameter๋ฅผ ์ด์šฉํ•œ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ๋ฐฐ์›Œ๋ด…๋‹ˆ๋‹ค.

7. ์„œ๋น„์Šค (Service)

์ปจํŠธ๋กค๋Ÿฌ์—์„œ ์‹คํ–‰ํ•  ๋กœ์ง์„ ๋‹ด๋‹นํ•˜๋Š” ์„œ๋น„์Šค๋ฅผ ๊ตฌํ˜„ํ•ด ๋ด…๋‹ˆ๋‹ค.

8. Module, Provider and Inversion of Control (IoC)

API๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ์—ฌ๋Ÿฌ ์ปดํฌ๋„ŒํŠธ๋“ค์„ ํ•˜๋‚˜๋กœ ๋ฌถ๋Š” ์—ญํ• ์ธ ๋ชจ๋“ˆ์— ๋Œ€ํ•ด ๋ฐฐ์›Œ๋ณด๊ณ  IoC ์ปจํ…Œ์ด๋„ˆ๋ฅผ ํ†ตํ•œ Provider Dependency Injection์ด ์–ด๋–ป๊ฒŒ ์ด๋ค„์ง€๋Š”์ง€ ์•Œ์•„๋ด…๋‹ˆ๋‹ค. 

9. SQL๊ณผ Docker

๋„ค์ŠคํŠธ์—์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์—ฐ๋™ํ•˜๊ธฐ ์œ„ํ•œ ๊ธฐ๋ณธ์ ์ธ SQL ์ง€์‹์„ ๋ฐฐ์›๋‹ˆ๋‹ค. ์ถ”๊ฐ€๋กœ Postgresql์„ ์‹คํ–‰ํ• ๋•Œ ์‚ฌ์šฉํ•  ๋„์ปค ์‚ฌ์šฉ๋ฒ•์„ ๊ฐ„๋‹จํžˆ ๋ฐฐ์›Œ๋ด…๋‹ˆ๋‹ค.

10. TypeORM์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๋™ํ•˜๊ธฐ

๊ธฐ์กด ๋ฉ”๋ชจ๋ฆฌ์—์„œ๋งŒ ๊ด€๋ฆฌํ•˜๋˜ ๋ฐ์ดํ„ฐ๋ฅผ ์žฅ๊ธฐ์ ์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก TypeORM์„ ์ด์šฉํ•ด Postgresql๊ณผ ์—ฐ๋™ํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ๋ฐฐ์›Œ๋ด…๋‹ˆ๋‹ค.

11. TypeORM ์ด๋ก  (๊ธฐ๋Šฅ ์ •๋ฆฌ)

TypeORM ๊ธฐ๋Šฅ์— ๋Œ€ํ•ด ์ „๋ฐ˜์ ์œผ๋กœ ์•Œ์•„๋ณด๋Š” ์ด๋ก  ๊ฐ•์˜์ž…๋‹ˆ๋‹ค. ํ”ํžˆ ์‚ฌ์šฉ๋˜๋Š” ํ•จ์ˆ˜๋“ค๊ณผ ํŒŒ๋ผ๋ฏธํ„ฐ๋“ค์— ๋Œ€ํ•ด ๋ฐฐ์›๋‹ˆ๋‹ค.

12. Table Relation (๊ด€๊ณ„)

One to One Relationship, One to Many Relationship, Many to One Relationship, Many to Many Relationship์— ๋Œ€ํ•ด ์ด๋ก ๊ณผ TypeORM์„ ์ด์šฉํ•œ ๊ตฌํ˜„๋ฒ•์„ ๋ฐฐ์›Œ๋ด…๋‹ˆ๋‹ค.

13. ๋””๋ฒ„๊ฑฐ ์‚ฌ์šฉํ•˜๊ธฐ

VSCode์—์„œ NestJS ๋””๋ฒ„๊ฑฐ๋ฅผ ์„ธํŒ…ํ•˜๊ณ  ๋””๋ฒ„๊ฑฐ๋ฅผ ์ด์šฉํ•ด์„œ ๋””๋ฒ„๊น…์„ ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ๋ฐฐ์›Œ๋ด…๋‹ˆ๋‹ค.

14. Authentication (์ธ์ฆ)

ํ† ํฐ(Token)์„ ์ด์šฉํ•œ ์ธ์ฆ ์ ˆ์ฐจ ๋ฐ ๋กœ๊ทธ์ธ ํšŒ์›๊ฐ€์ž… ์‹œ์Šคํ…œ ๊ตฌ์ถ•๋ฒ•์— ๋Œ€ํ•ด ๋ฐฐ์›Œ๋ด…๋‹ˆ๋‹ค.

15. Pipe (ํŒŒ์ดํ”„)

๊ฐ’์„ ๊ฒ€์ฆํ•˜๊ณ  ๋ณ€ํ™˜ํ•˜๋Š” Pipe์˜ ๋‹ค์–‘ํ•œ ์‚ฌ์šฉ๋ฒ•์„ ํƒ๊ตฌํ•ด๋ด…๋‹ˆ๋‹ค.

16. ์ƒ์†์„ ์ด์šฉํ•œ BaseModel ๊ตฌํ˜„

TypeORM์œผ๋กœ ํ…Œ์ด๋ธ”์„ ๊ตฌํ˜„ํ•  ๋•Œ ๋ฐ˜๋ณต๋˜๋Š” ํ”„๋กœํผํ‹ฐ ๋ฐ Column์„ ์ž‘์„ฑํ•˜์ง€ ์•Š๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ๋ฐฐ์›๋‹ˆ๋‹ค.

17. PgAdmin

PgAdmin์„ ์ด์šฉํ•œ Postgresql ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ…Œ์ด๋ธ” ์กฐํšŒ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ด…๋‹ˆ๋‹ค.

18. Guard (๊ฐ€๋“œ)

์—”๋“œํฌ์ธํŠธ์™€ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ๋ณดํ˜ธํ•˜๋Š” ์—ญํ• ์„ ํ•˜๋Š” Guard์— ๋Œ€ํ•ด ๋ฐฐ์›Œ๋ด…๋‹ˆ๋‹ค.

19. Custom Decorator (์ปค์Šคํ…€ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ)

์ง์ ‘ Decorator๋ฅผ ๋งŒ๋“ค๊ณ  ์–ด๋–ค ๋กœ์ง๋“ค์„ Decorator๋ฅผ ์ด์šฉํ•ด์„œ ๊ตฌํ˜„ ํ•ด๋ณผ ์ˆ˜ ์žˆ๋Š”์ง€ ํƒ๊ตฌํ•ด๋ด…๋‹ˆ๋‹ค.

20. Postman ๊ธฐ๋Šฅ ์‹ฌํ™”

๋‹จ์ˆœํžˆ ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” ๊ธฐ๋Šฅ ์™ธ์— ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์‚ฌ์šฉ๋ฒ•, Environment ์„ค์ •๋ฒ•, Test ์„ค์ •๋ฒ•, ํ† ํฐ ํƒ‘์žฌ๋ฒ• ๋“ฑ API ํ…Œ์ŠคํŠธ๋ฅผ ๋”์šฑ ํšจ์œจ์ ์œผ๋กœ ๋งŒ๋“ค์–ด์ฃผ๋Š” ๊ธฐ๋Šฅ๋“ค์„ ๋ฐฐ์›Œ๋ด…๋‹ˆ๋‹ค.

21. Class Validator

ํด๋ž˜์Šค์˜ ํ”„๋กœํผํ‹ฐ๋ฅผ Decorator๋ฅผ ์ด์šฉํ•ด์„œ ๊ฒ€์ฆํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์ธ Class Validator์— ๋Œ€ํ•ด์„œ ๋ฐฐ์›Œ๋ด…๋‹ˆ๋‹ค.

22. Class Transformer

ํด๋ž˜์Šค ํ”„๋กœํผํ‹ฐ๋ฅผ Decorator๋ฅผ ์ด์šฉํ•ด์„œ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์ธ Class Transformer์— ๋Œ€ํ•ด์„œ ๋ฐฐ์›Œ๋ด…๋‹ˆ๋‹ค.

23. Pagination ๊ธฐ๋ณธ๊ธฐ - Cursor Pagination

์ปค์„œ ๊ธฐ๋ฐ˜ ํŽ˜์ด์ง€๋„ค์ด์…˜์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ๋ฐฐ์›Œ๋ด…๋‹ˆ๋‹ค.

24. Pagination ๊ธฐ๋ณธ๊ธฐ - Page Pagination

ํŽ˜์ด์ง€ ๊ธฐ๋ฐ˜ ํŽ˜์ด์ง€๋„ค์ด์…˜์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ๋ฐฐ์›Œ๋ด…๋‹ˆ๋‹ค.

25. Pagination ์‹ฌํ™” - ์ผ๋ฐ˜ํ™” ํ•˜๊ธฐ

๋‹ค์–‘ํ•œ ์—”๋“œํฌ์ธํŠธ์—์„œ ์‰ฝ๊ฒŒ ํŽ˜์ด์ง€๋„ค์ด์…˜์„ ๊ตฌํ˜„ ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋กœ์ง์„ ์ผ๋ฐ˜ํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ๋ฐฐ์›Œ๋ด…๋‹ˆ๋‹ค.

26. Config ๋ชจ๋“ˆ ์‚ฌ์šฉํ•˜๊ธฐ

NestJS ํ”„๋ ˆ์ž„์›Œํฌ์— ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์ฃผ์ž…ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ธ Config ๋ชจ๋“ˆ ์‚ฌ์šฉ๋ฒ•์— ๋Œ€ํ•ด ๋ฐฐ์›Œ๋ด…๋‹ˆ๋‹ค.

27. File Upload - ํด๋ž˜์‹ ๋ฐฉ๋ฒ•

๊ฐ€์žฅ ํด๋ž˜์‹ํ•œ ํŒŒ์ผ ์—…๋กœ๋“œ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ๋ฐฐ์›Œ๋ด…๋‹ˆ๋‹ค.

28. Static File Serving (์Šคํƒœํ‹ฑ ํŒŒ์ผ ์„œ๋น™ํ•˜๊ธฐ)

NestJS์—์„œ ์Šคํƒœํ‹ฑ ํŒŒ์ผ์„ ์™ธ๋ถ€๋กœ ์„œ๋น™ํ•  ์ˆ˜ ์žˆ๋Š” ์„ธํŒ…๋ฒ•์— ๋Œ€ํ•ด ๋ฐฐ์›Œ๋ด…๋‹ˆ๋‹ค. ์ด์ „ ์„น์…˜๊ณผ ์—ฐ๊ณ„๋˜์–ด ์—…๋กœ๋“œํ•œ ํŒŒ์ผ์„ ๋งํฌ๋ฅผ ํ†ตํ•ด ์กฐํšŒํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ด…๋‹ˆ๋‹ค.

29. ํŒŒ์ผ ์—…๋กœ๋“œ - ์„  ์—…๋กœ๋“œ ๋ฐฉ๋ฒ•

Form Data๋กœ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ํ•œ๋ฒˆ์— ๋ฌถ๋Š” ํ˜•ํƒœ๊ฐ€ ์•„๋‹Œ ํŒŒ์ผ์„ ๋จผ์ € ์—…๋กœ๋“œํ•œ ํ›„ ํŒŒ์ผ์˜ ๊ฒฝ๋กœ๋งŒ ์ œ๊ณตํ•ด์„œ ํด๋ž˜์‹ํ•œ ๋ฐฉ๋ฒ•๋ณด๋‹ค ๋น„๊ต์  ๋น ๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ ํŒŒ์ผ ์—…๋กœ๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ด…๋‹ˆ๋‹ค.

30. Transaction (ํŠธ๋žœ์žญ์…˜)

All or Nothing ๊ธฐ๋Šฅ์ธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ํŠธ๋žœ์ ์…˜ ๊ธฐ๋Šฅ์„ TypeORM์„ ์ด์šฉํ•ด์„œ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ด…๋‹ˆ๋‹ค.

31. Interceptor (์ธํ„ฐ์…‰ํ„ฐ)

NestJS์˜ ์ธํ„ฐ์…‰ํ„ฐ ์‚ฌ์šฉ ๋ฐฉ๋ฒ•๊ณผ ๊ฐ„๋‹จํ•œ RxJS ์‚ฌ์šฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ด…๋‹ˆ๋‹ค. ์‚ฌ์šฉํ•˜๊ธฐ ์ข‹์€ ์˜ˆ์ œ๋กœ ํŠธ๋žœ์žญ์…˜์„ ์ธํ„ฐ์…‰ํ„ฐ๋กœ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ด…๋‹ˆ๋‹ค.

32. Exception Filter (์ต์…‰์…˜ ํ•„ํ„ฐ)

NestJS์—์„œ ๋Œ€ํ‘œ์ ์œผ๋กœ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๋Š” ๋ฐฉ๋ฒ•์ธ Exception Filter ์‚ฌ์šฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ด…๋‹ˆ๋‹ค.

33. Middleware (๋ฏธ๋“ค์›จ์–ด)

NestJS์— ๋“ค์–ด์˜ค๋Š” ์š”์ฒญ์— ๊ฐ€์žฅ ๋จผ์ € ์ ์šฉ๋˜๋Š” ๋ฏธ๋“ค์›จ์–ด์— ๋Œ€ํ•ด ์•Œ์•„๋ด…๋‹ˆ๋‹ค.

34. Websocket Socket.IO - ๊ธฐ๋ณธ๊ธฐ

Socket.IO ๊ธฐ๋ณธ ์‚ฌ์šฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ด…๋‹ˆ๋‹ค.

35. Websocket Socket.IO - ์‹ฌํ™”

NestJS์—์„œ ์ œ๊ณตํ•ด ์ฃผ๋Š” Socket IO ๊ด€๋ จ ๊ฐ์ข… Decorator์— ๋Œ€ํ•ด ์•Œ์•„๋ด…๋‹ˆ๋‹ค.

36. ๋ชจ๋“ˆ ๋„ค์ŠคํŒ…

Post - Comment ์˜ˆ์ œ๋ฅผ ์ด์šฉํ•ด์„œ ํ•˜์œ„ ๋ชจ๋“ˆ ์ƒ์„ฑ์— ๋Œ€ํ•œ ํ•„์š”์„ฑ์„ ์•Œ์•„๋ด…๋‹ˆ๋‹ค.

37. RBAC - Role Based Access Control

์–ด๋“œ๋ฏผ ํŽ˜์ด์ง€ ๊ด€๋ จ ์„œ๋ฒ„ ๊ธฐ๋Šฅ์„ ์ œ์ž‘ํ•  ๋•Œ ํŠนํžˆ๋‚˜ ์ค‘์š”ํ•œ RBAC ๊ธฐ๋ฐ˜์˜ API๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ด…๋‹ˆ๋‹ค.

38. Authorization

NestJS ์Šคํƒ€์ผ๋กœ ๊ถŒํ•œ ๋ถ€์—ฌ ๊ธฐ๋Šฅ์„ ์ œ์ž‘ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ด…๋‹ˆ๋‹ค.

39. Following System

ํŒ”๋กœ์ž‰ ์‹œ์Šคํ…œ์„ ๊ตฌํ˜„ํ•ด ๋ด…๋‹ˆ๋‹ค.

40. Follow Count, Comment Count ์ž‘์—…ํ•˜๊ธฐ

๊ฐ์ข… Count ๊ธฐ๋Šฅ ๊ด€๋ จ ๋กœ์ง์„ ๊ตฌํ˜„ํ•ด ๋ด…๋‹ˆ๋‹ค.


๋ˆ„์  ์ˆ˜๊ฐ•์ƒ 9,000๋ช… ์ด์ƒ 
์ง€์‹๊ณต์œ ์ž ์ฝ”๋“œํŒฉํ† ๋ฆฌ์ž…๋‹ˆ๋‹ค!

์ €๋Š” 2022๋…„ ํ”Œ๋Ÿฌํ„ฐ ๊ฐ•์˜๋ฅผ ์‹œ์ž‘์œผ๋กœ ์ธํ”„๋Ÿฐ ๋ฐ ์œ ํŠœ๋ธŒ์—์„œ ๊พธ์ค€ํžˆ ํ™œ๋™์„ ํ•ด์™”์Šต๋‹ˆ๋‹ค. ๋น„๊ต์  ์ž‘์€ ์ƒํƒœ๊ณ„์ธ ํ”Œ๋Ÿฌํ„ฐ ๊ฐ•์˜๋งŒ์œผ๋กœ ์ธํ”„๋Ÿฐ 2022 Rookie of the Year๋ฅผ ๋‹ฌ์„ฑํ–ˆ๊ณ , ์ด์ œ ์ €์˜ ๋ฉ”์ธ ๊ธฐ์ˆ  ์˜์—ญ์ธ Javascript ์Šคํƒ๊ณผ DevOps ๊ทธ๋ฆฌ๊ณ  ํด๋ผ์šฐ๋“œ ์ชฝ์œผ๋กœ ๊ฐ•์˜ ํŒŒ์ดํ”„๋ผ์ธ์„ ํ™•์žฅํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์–‘ํ•œ ๊ฐ•์˜๋ฅผ ์ค€๋น„ ์ค‘์ž…๋‹ˆ๋‹ค.

(์ธํ”„๋Ÿฐ์ด ๋งŒ๋‚œ ์‚ฌ๋žŒ, ์ฝ”๋“œํŒฉํ† ๋ฆฌ ์ธํ„ฐ๋ทฐ >>)

Javascript ๊ฐ•์˜๋กœ ์ œ ๊ฐ•์˜๋ ฅ์„ ํŒ๋‹จํ•˜๊ธฐ ์–ด๋ ต๋‹ค๋ฉด ์ธํ”„๋Ÿฐ ๋‚ด ์ฝ”๋“œํŒฉํ† ๋ฆฌ์˜ ํ”Œ๋Ÿฌํ„ฐ ๊ฐ•์˜ ํ›„๊ธฐ๋ฅผ ํ™•์ธํ•ด๋ณด์„ธ์š”! ํ•ญ์ƒ ๋ฐœ์ „ํ•˜๊ณ  ์ข‹์€ ๊ฐ•์˜๋ฅผ ์ œ์ž‘ํ•˜๋Š” ์ฝ”๋“œํŒฉํ† ๋ฆฌ๊ฐ€ ๋˜๊ฒ ์Šต๋‹ˆ๋‹ค.

โ˜…โ˜…โ˜…โ˜…โ˜…

17๋…„์ฐจ ๊ฐœ๋ฐœ์ž์ž…๋‹ˆ๋‹ค. ์ด ๊ฐ•์˜๋Š” ํ”Œ๋Ÿฌํ„ฐ์— ์ž…๋ฌธํ•˜์‹œ๋Š” ๋ถ„๋“ค์—๊ฒŒ๋„ ์ถ”์ฒœํ•˜๊ณ , ์‹ค๋ฌด์šฉ ํ”„๋กœ์ ํŠธ์—๋„ ๋งค์šฐ ์œ ์šฉํ•œ ๊ฐ•์˜์ž…๋‹ˆ๋‹ค. ์ด๋ณด๋‹ค ์ข‹์€ ๊ฐ•์˜๊ฐ€ ์—†๋„ค์š”. ์—ฌ๊ธฐ๊ฐ€ ์ง„์งœ์ž…๋‹ˆ๋‹ค. ์ˆ˜๊ฐ•๋ฃŒ๊ฐ€ ์•„๊น์ง€ ์•Š์„ ์ •๋„๋กœ ๊น”๋”ํ•˜๊ฒŒ ์„ค๋ช…ํ•ด์ฃผ์‹œ๊ณ , ์ •๋ง ๋งŽ์€ ๋„์›€์„ ๋ฐ›๊ณ  ์žˆ๋Š” ๊ฐ•์˜์ž…๋‹ˆ๋‹ค.

โ˜…โ˜…โ˜…โ˜…โ˜…

์ •๋ง ์™„๋ฒฝ์— ๊ฐ€๊นŒ์šด ๊ฐ•์˜์ž…๋‹ˆ๋‹ค. ํ”Œ๋Ÿฌํ„ฐ๋ฅผ ๊ณต๋ถ€ํ•˜๋ ค๊ณ  ๊ฑฐ์˜ ๋ชจ๋“  ์ฑ…์„ ๊ตฌ๋งคํ•˜์˜€๊ณ , ์˜จ๋ผ์ธ ํด๋ก  ์ฝ”๋”ฉ๋„ ๋งŽ์ด ์ ‘ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ํ”Œ๋žซํผ์—์„œ ํ”Œ๋Ÿฌํ„ฐ์— ๋Œ€ํ•ด ์ •๋ง ์ฐจ๊ทผ์ฐจ๊ทผ ์ž˜ ์•Œ๋ ค์ฃผ๋Š” ๊ฐ•์˜๋„ ๋“ค์–ด๋ดค์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์ด๊ฒŒ ์ œ์ผ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€์žฅ ์‹ค๋ฌด์ ์ด๊ณ  ๊ฐ€์„ฑ๋น„๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์„ ๋จผ์ € ๋ฐฐ์šฐ๊ณ  ๋ถ€์กฑํ•œ ๋ถ€๋ถ„์„ ์ฑ„์›Œ๋‚˜๊ฐ€์‹œ๊ธธ ์ง„์‹ฌ์œผ๋กœ ์กฐ์–ธํ•ฉ๋‹ˆ๋‹ค.

โ˜…โ˜…โ˜…โ˜…โ˜…

๊ทธ ๋งŽ์€ ๊ฐ•์˜๋“ค ์ค‘์—์„œ ์ฝ”๋“œํŒฉํ† ๋ฆฌ๋‹˜์˜ ๊ฐ•์˜๋Š” ๋ฒ ์ŠคํŠธ ์˜ค๋ธŒ ๋” ๋ฒ ์ŠคํŠธ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ œ๊ฐ€ ๋ณธ ๋‹ค๋ฅธ ๊ฐ•์˜๋“ค์˜ ๋Œ€๋ถ€๋ถ„์ด ์–ด๋А ํ•œ ๋ถ€๋ถ„์—์„œ ์†Œํ™€ํ•˜๊ฑฐ๋‚˜ ํŒจ์Šคํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์•„์„œ ๋ฐฐ์šฐ๋Š” ์ž…์žฅ์—์„œ ์—ฐ๊ฒฐ์ด ๋˜์ง€ ์•Š์•„ ์ดํ•ด๋ฅผ ๋†“์น˜๊ณ  ์•„์‰ฌ์šด ๊ฒฝ์šฐ๊ฐ€ ์ •๋ง ๋งŽ์•˜๋Š”๋ฐ ์ฝ”๋“œํŒฉํ† ๋ฆฌ๋‹˜์˜ ๊ฐ•์˜๋Š” ๊ทธ๋Ÿฐ ๊ฒŒ ์—†์Šต๋‹ˆ๋‹ค. ์ผ๋‹จ ๋“ค์–ด๋ณด์‹œ๋ฉด ํ›„ํšŒ ์•ˆ ํ•˜์‹ค ๊ฒ๋‹ˆ๋‹ค. ํ›„ํšŒ๊ฐ€ ์•„๋‹ˆ๋ผ ๋งŒ์กฑ๊ณผ ๋”๋ถˆ์–ด ์ €์ฒ˜๋Ÿผ ์ฐํŒฌ์ด ๋˜์‹œ๋ฆฌ๋ผ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

โ˜…โ˜…โ˜…โ˜…โ˜…

์ „์„ธ๊ณ„ ํ”Œ๋žซํผ, ์œ ํŠœ๋ธŒ, ์˜คํ”„๋ผ์ธ ๊ฐ•์˜ ํ†ตํ‹€์–ด ํ”Œ๋Ÿฌํ„ฐ ๊ด€๋ จ ์ œ์ผ ์ข‹์€ ๊ฐ•์˜ ์ค‘ ํ•˜๋‚˜๊ฐ€ ์•„๋‹๊นŒ ์‹ถ์Šต๋‹ˆ๋‹ค. ํ•œ๊ตญ์–ด๊ฐ€ ๋ชจ๊ตญ์–ด๋ผ ์ด ๊ฐ•์˜๋ฅผ ๋“ค์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์— ๋‹คํ–‰์ด๋‹ค ์‹ถ์„ ์ •๋„์ž…๋‹ˆ๋‹ค. ์‹ค๋ฌด์ ์ธ ๋ถ€๋ถ„๊ณผ ๊ธฐ์ˆ ์ ์ธ ๋ถ€๋ถ„์ด ํ•จ๊ป˜ ์–‘๋ฆฝ๋˜์–ด ์žˆ๊ณ , ์ œ๋Œ€๋กœ ๊ฐœ๋…์„ ํ•˜๋‚˜ํ•˜๋‚˜ ๊นจ์šฐ์น˜๋ฉด์„œ ๋‹จ๊ณ„๋ฅผ ๋ฐŸ์•„๋‚˜๊ฐ€๋Š” ๊ฐ•์˜๋Š” ์ด ๊ฐ•์˜๋งŒํ•œ ๊ฒƒ์ด ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ˆ˜๊ฐ•์ƒ์„ ์œ„ํ•œ ํŠน๋ณ„ํ•œ ์ถ”๊ฐ€ ํ˜œํƒ

1) ์ •๊ธฐ์ ์œผ๋กœ ์œ ํŠœ๋ธŒ์—์„œ ๋ผ์ด๋ธŒ ๋ฐฉ์†ก์„ ์ง„ํ–‰ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ์œ ํ˜•์˜ ๊ฐœ๋ฐœ ๊ณ ๋ฏผ๊ณผ ์งˆ๋ฌธ์„ ๋ฐ›๊ณ  ์žˆ์œผ๋ฉฐ ๊ฐ•์˜๋ฅผ ์ง„ํ–‰ํ•˜๋ฉฐ ์–ด๋ ค์›€์ด ์žˆ์„ ๊ฒฝ์šฐ ์ฆ‰๊ฐ์ ์œผ๋กœ ๋Œ€๋‹ต์„ ๋“œ๋ฆด ์ˆ˜ ์žˆ๋Š” ์‹œ๊ฐ„์„ ํ• ๋‹นํ•˜๊ธฐ ์œ„ํ•ด ๋…ธ๋ ฅ ์ค‘์ž…๋‹ˆ๋‹ค. ๋”์ด์ƒ ์†Œํ†ต์ด ์•ˆ ๋˜๋Š” ๊ฐ•์‚ฌ ๋•Œ๋ฌธ์— ์ŠคํŠธ๋ ˆ์Šค ๋ฐ›์ง€ ๋งˆ์„ธ์š”!

2) ๊ฐ•์˜ ๊ตฌ๋งค ํ›„ ์ธํ”„๋Ÿฐ ์ด๋ฉ”์ผ ์ธ์ฆ ์‹œ Discord ์œ ๋ฃŒ ์ปค๋ฎค๋‹ˆํ‹ฐ์— ์ž…์žฅ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ์ž˜ ํ™œ์„ฑํ™”๋˜์–ด์žˆ๋Š” ์ฝ”๋“œํŒฉํ† ๋ฆฌ ๊ณต์‹ ์นด์นด์˜ค ์ฑ„๋„๋„ ์ ๊ทน ํ™œ์šฉํ•ด์ฃผ์„ธ์š”!

3) ์–ด๋–ค ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ธฐ์ˆ ์„ ๋ฐฐ์šฐ๋“  ํ™˜๊ฒฝ์„ค์ •์€ ์ˆ˜๊ฐ•์ƒ๋“ค์ด ๋งค์šฐ ์–ด๋ ค์›Œํ•˜๋Š” ์š”์†Œ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. ๋ฌผ๋ก  ์ง์ ‘ ํ•ด๊ฒฐํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ•˜๋Š” ๋ชจ์Šต์€ ์ข‹์€ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋˜๊ธฐ์œ„ํ•ด ๋งค์šฐ ์ค‘์š”ํ•œ ์š”์†Œ์ด์ง€๋งŒ ๋„์ €ํžˆ ๋ชปํ•˜๊ฒ ๋‹ค๋ฉด ์ง€์ฒด ๋ง๊ณ  ์ €๋ฅผ ํ™œ์šฉํ•ด์ฃผ์„ธ์š”. ์นด์นด์˜ค ์ฑ„๋„์— ๋“ค์–ด์˜ค์…”์„œ ๊ฐ•์˜๋ฅผ ๋ง์”€ํ•ด ์ฃผ์‹  ๋‹ค์Œ ์›๊ฒฉ ์‹ ์ฒญ์„ ํ•ด์ฃผ์‹œ๋ฉด ์‹œ๊ฐ„ ์กฐ์œจ ํ›„ ํ™˜๊ฒฝ์„ค์ •์€ ๋ชจ๋‘ ์ง์ ‘ ๋ด๋“œ๋ฆฌ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค! ๋”์ด์ƒ ์‹œ์ž‘๋„ ๋ชปํ•œ ์ฑ„ ํฌ๊ธฐํ•˜์ง€ ๋งˆ์„ธ์š”!

์ฝ”๋“œํŒฉํ† ๋ฆฌ ํ†ตํ•ฉ ๋งํฌ ๋ฐ”๋กœ๊ฐ€๊ธฐ


Q&A ๐Ÿ’ฌ

Q. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ/ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋ฐฐ์› ๋Š”๋ฐ ๋‹ค์Œ์œผ๋กœ ๋ญ˜ ๋ฐฐ์›Œ์•ผ ํ• ์ง€ ๋ชจ๋ฅด๊ฒ ์–ด์š”.

Javascript์™€ Typescript๋ฅผ ์ˆ™์ง€ํ–ˆ๋‹ค๋ฉด JS/TS ๊ธฐ๋ฐ˜์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋‚˜ ํ”„๋ ˆ์ž„์›Œํฌ๋กœ ๋„˜์–ด๊ฐˆ ์ค€๋น„๊ฐ€ ๋๋‚ฌ์Šต๋‹ˆ๋‹ค. NestJS๋Š” JS/TS ์„ธ๊ณ„๊ด€์—์„œ ๊ฐ€์žฅ ์ธ๊ธฐ ์žˆ๋Š” ํ”„๋ ˆ์ž„์›Œํฌ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. NestJS๋ฅผ ๋ฐฐ์šฐ๋ฉด ์ปค๋ฆฌ์–ด ์„ ํƒ์ง€๋„ ๋„“์–ด์ง€๊ณ  ๋‹ค์Œ์œผ๋กœ ๋ฐฐ์šธ ๊ธฐ์ˆ ์„ ์„ ํƒํ•˜๋Š” ๋ฐ๋„ ํฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค. ๋ญ˜ ๋ฐฐ์›Œ์•ผ ํ• ์ง€ ๋ชจ๋ฅด๋Š” ์ƒํ™ฉ์ด๋ผ๋ฉด ์ฝ”๋“œํŒฉํ† ๋ฆฌ์˜ NestJS ๊ฐ•์˜๋กœ ๊ณต๋ถ€๋ฅผ ์‹œ์ž‘ํ•ด ๋ณด์„ธ์š”!

Q. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ/ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋Š” ํ•  ์ค„ ์•„๋Š”๋ฐ, ์„œ๋ฒ„ ๊ธฐ์ˆ ์„ ๋ฐฐ์šฐ๊ณ  ์‹ถ์–ด์š”.

NestJS๋Š” JS/TS ์„ธ๊ณ„๊ด€์—์„œ ๊ฐ€์žฅ ์ธ๊ธฐ ์žˆ๋Š” ์„œ๋ฒ„ ํ”„๋ ˆ์ž„์›Œํฌ์ž…๋‹ˆ๋‹ค. Express๋กœ ์„œ๋ฒ„๋ฅผ ์‹œ์ž‘ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์ง€๋งŒ ์˜คํžˆ๋ ค ์ดˆ๋ณด์ผ์ˆ˜๋ก ์ฒด๊ณ„๊ฐ€ ์ž˜ ๋‹ค์ ธ์ ธ ์žˆ๋Š” NestJS ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ๋จผ์ € ๋ฐฐ์›Œ๋ณด๋Š”๊ฒŒ ์ข‹์Šต๋‹ˆ๋‹ค. ๋‚˜์•„๊ฐ€, NestJS๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ Express๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— Express ์‚ฌ์šฉ๋ฒ•๋„ ์ตํž ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Q. ์„œ๋ฒ„๋ฅผ ๋ฐฐ์šฐ๊ณ  ์‹ถ์€๋ฐ ์–ด๋–ค ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์„ ํƒํ• ์ง€ ๋ชจ๋ฅด๊ฒ ์–ด์š”.

ํ˜„๋Œ€์—๋Š” ๋‹ค์–‘ํ•œ ์„œ๋ฒ„ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ๋ฐฐ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. NestJS ์™ธ์— ๋‹ค๋ฅธ ํ”„๋ ˆ์ž„์›Œํฌ๋„ ๋งŽ์ด ์žˆ์ง€๋งŒ ๊ทธ์ค‘์—์„œ๋„ NestJS๋Š” ์ „์„ธ๊ณ„์ ์œผ๋กœ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ๋ž‘๋ฐ›๊ณ  ์žˆ์œผ๋ฉฐ ํŠนํžˆ๋‚˜ MSA์— ๋งŽ์ด ์“ฐ์ด๋Š” ํ”„๋ ˆ์ž„์›Œํฌ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. ๋ฏธ๋ž˜์ง€ํ–ฅ์ ์ด๋ฉด์„œ ๋™์‹œ์— ๋ฐ”๋กœ ์ง€๊ธˆ ๋งŽ์€ ์‚ฌ๋ž‘์„ ๋ฐ›๊ณ  ์žˆ๋Š” ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ๋ฐฐ์›Œ๋ณด๊ณ  ์‹ถ๋‹ค๋ฉด NestJS๋ฅผ ์„ ํƒํ•ด ๋ณด์„ธ์š”!

๐Ÿ’พ ์‹ค์Šต ํ™˜๊ฒฝ ์•ˆ๋‚ด

์ˆ˜๊ฐ•ํ•˜๊ธฐ์— ์•ž์„œ ํ˜„์žฌ ์‚ฌ์šฉํ•˜๊ณ  ๊ณ„์‹  OS ๋ฐ PC ์‚ฌ์–‘์„ ํ™•์ธํ•ด์ฃผ์„ธ์š”.

Windows

  • WSL ๋ฒ„์ „ 1.1.3.0+
  • Windows 10/11 64bit Home ๋˜๋Š” Pro 21H2 ๋ฒ„์ „ ์ด์ƒ
  • 4GB ์ด์ƒ์˜ RAM
  • Hardware Virtualization (ํ•˜๋“œ์›จ์–ด ๊ฐ€์ƒํ™”)๊ฐ€ ๊ฐ€๋Šฅํ•œ ์‹œ์Šคํ…œ

macOS Intel

  • macOS 11๋ฒ„์ „ ์ด์ƒ
  • 4GB ์ด์ƒ์˜ RAM
  • VirtualBox๊ฐ€ ์„ค์น˜๋ผ์žˆ์ง€ ์•Š์€ ์‹œ์Šคํ…œ

macOS ARM64

  • 2023๋…„ 9์›” 18์ผ ๊ธฐ์ค€ ์š”๊ตฌ์‚ฌํ•ญ ์—†์Œ (์ตœ์‹  M ์‹œ๋ฆฌ์ฆˆ ๋งฅ๋ถ ๋ชจ๋‘ ํ˜ธํ™˜ ๊ฐ€๋Šฅ)

๐Ÿ“ข ํ•™์Šต ์ž๋ฃŒ, ์„ ์ˆ˜ ์ง€์‹ ์•ˆ๋‚ด

์ด๋Ÿฐ ๋ถ„๋“ค๊ป˜
์ถ”์ฒœ๋“œ๋ ค์š”!

ํ•™์Šต ๋Œ€์ƒ์€
๋ˆ„๊ตฌ์ผ๊นŒ์š”?

  • REST API ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์„ ๋ฐฐ์›Œ๋ณด๊ณ  ์‹ถ์€ ์‚ฌ๋žŒ

  • Javascript ๋ฐ Typescript ๊ฐ•์˜๋ฅผ ๋ง‰ ๋๋‚ธ ์‚ฌ๋žŒ

  • Node.JS๋ฅผ ๋ฐฐ์šฐ๊ณ  ์‹ถ์€ ์‚ฌ๋žŒ

์„ ์ˆ˜ ์ง€์‹,
ํ•„์š”ํ• ๊นŒ์š”?

  • Javascript

  • Typescript

์•ˆ๋…•ํ•˜์„ธ์š”
์ฝ”๋“œํŒฉํ† ๋ฆฌ์ž…๋‹ˆ๋‹ค.

26,921

๋ช…

์ˆ˜๊ฐ•์ƒ

1,373

๊ฐœ

์ˆ˜๊ฐ•ํ‰

1,842

๊ฐœ

๋‹ต๋ณ€

5.0

์ 

๊ฐ•์˜ ํ‰์ 

6

๊ฐœ

๊ฐ•์˜

์•ˆ๋…•ํ•˜์„ธ์š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ฐ•์‚ฌ ์ฝ”๋“œํŒฉํ† ๋ฆฌ์ž…๋‹ˆ๋‹ค!

์ฝ”๋“œํŒฉํ† ๋ฆฌ ํ†ตํ•ฉ ๋งํฌ
https://links.codefactory.ai

 

๐Ÿญ ์ฝ”๋“œํŒฉํ† ๋ฆฌ ์œ ํŠœ๋ธŒ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ”ฅ ์ฝ”๋“œํŒฉํ† ๋ฆฌ Discord ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ’ฌ ์ฝ”๋“œํŒฉํ† ๋ฆฌ ์นด์นด์˜ค ์˜คํ”ˆํ†ก ๋ฐ”๋กœ๊ฐ€๊ธฐ

 

๐Ÿ’ผ ์ฃผ์‹ํšŒ์‚ฌ ์ฝ”๋“œํŒฉํ† ๋ฆฌ ๋Œ€ํ‘œ

 

๐Ÿ† 2023๋…„ ์ธํ”„๋Ÿฐ ๋ฒ ์ŠคํŠธ์…€๋Ÿฌ ์ˆ˜์ƒ

๐Ÿ† <<Must Have ์ฝ”๋“œํŒฉํ† ๋ฆฌ์˜ ํ”Œ๋Ÿฌํ„ฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ>> ์„œ์  2023 ์ƒ๋ฐ˜๊ธฐ ๊ต๋ณด๋ฌธ๊ณ  ์ปดํ“จํ„ฐ/IT ๋ถ€๋ฌธ ๋ฒ ์ŠคํŠธ์…€๋Ÿฌ 23์œ„

๐Ÿ† AWS Certified Developer Associate

๐Ÿ† AWS Certified Solutions Architect

๋”๋ณด๊ธฐ

์ปค๋ฆฌํ˜๋Ÿผ

์ „์ฒด

214๊ฐœ โˆ™ (24์‹œ๊ฐ„ 36๋ถ„)

๊ฐ•์˜ ๊ฒŒ์‹œ์ผ: 
๋งˆ์ง€๋ง‰ ์—…๋ฐ์ดํŠธ์ผ: 

์ˆ˜๊ฐ•ํ‰

์ „์ฒด

96๊ฐœ

5.0

96๊ฐœ์˜ ์ˆ˜๊ฐ•ํ‰

  • chihwani๋‹˜์˜ ํ”„๋กœํ•„ ์ด๋ฏธ์ง€
    chihwani

    ์ˆ˜๊ฐ•ํ‰ 2

    โˆ™

    ํ‰๊ท  ํ‰์  5.0

    5

    53% ์ˆ˜๊ฐ• ํ›„ ์ž‘์„ฑ

    ๋ชจ๋“  ๊ฐ•์˜ ์‹œ์ž‘์€ ์ด๋ถ„๊บผ ๊ผญ ๋ณด์„ธ์š”. ํ”Œ๋Ÿฌํ„ฐ, ํƒ€์Šค, ๋„ค์ŠคํŠธ ๋“ฑ ๋‹ค๋ฅธ ๊ฐ•์˜ ๊ฒฐ์žฌํ•˜์…”์„œ ๋ˆ ๋ฒ„๋ฆฌ์ง€ ๋งˆ์‹œ๊ณ  ๊ทธ๋ƒฅ ์ด๊ฑฐ ํ•˜๋‚˜๋กœ ๋๋‚ด์„ธ์š”. ๊ทธ ๋งŒํผ ๊ฐ•์˜ ํ€„๋ฆฌํ‹ฐ๊ฐ€ ๋†’๊ณ  ๊ฐ•์˜ ์งˆ์˜์‘๋‹ต๋„ ์ •๋ง ์ž˜๋ฉ๋‹ˆ๋‹ค. ์•„์‰ฌ์šด๊ฑด ๊ฐ•์˜๊ฐ€ ๋ช‡๊ฐœ ์—†๋‹ค๋Š” ๊ฒƒ. ๊ทธ๋งŒํผ ํ•˜๋‚˜์”ฉ ํ•˜๋‚˜์”ฉ ๊ฐ•์˜๋‚˜์˜ฌ๋•Œ ๋งˆ๋‹ค ํ€„๋ฆฌํ‹ฐ๊ฐ€ ์ข‹์Šต๋‹ˆ๋‹ค. ๋ฐ‘์— ๋ถ„ ์ฒ˜๋Ÿผ ๋ฏฟ๊ณ  ๋ณด๋Š” ์ฝ”๋“œํŒฉํ† ๋ฆฌ. ๋ช‡๋…„ ์ง€๋‚˜๋ฉด ์•„๋งˆ ์ธํ”„๋Ÿฐ์—์„œ ๋…๋ฆฝํ•˜์ง€ ์•Š์„๊นŒ ์˜ˆ์–ธ์„ ํ•ด๋ด…๋‹ˆ๋‹ค.

  • Wevement๋‹˜์˜ ํ”„๋กœํ•„ ์ด๋ฏธ์ง€
    Wevement

    ์ˆ˜๊ฐ•ํ‰ 1

    โˆ™

    ํ‰๊ท  ํ‰์  5.0

    5

    84% ์ˆ˜๊ฐ• ํ›„ ์ž‘์„ฑ

    ์–ด์ด๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์ €๊ธฐ์„œ ์กฐ๊ธˆ์กฐ๊ธˆ ๋ฐฐ์›Œ์„œ ์•Œ๊ฒŒ ๋œ ๋ฐฑ์—”๋“œ ๊ด€๋ จ ์ง€์‹๋“ค์ด NestJS ๊ฐ•์˜๋ผ๋Š” ์ด๋ฆ„ ์•„๋ž˜์— ์ „๋ถ€ ์ •๋ฆฌ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์Šคํ”„๋ง์ด๋˜ ์žฅ๊ณ ๋˜ ์‹ฌ์ง€์–ด ๋ฐฑ์—”๋“œ๊ฐ€ ์ง„๋กœ๊ฐ€ ์•„๋‹Œ๋ถ„์ด๋ผ๋„ ํ•ด๋‹น ๊ฐ•์˜๋ฅผ ์ˆ˜๊ฐ•ํ•˜๊ธธ ์ ๊ทน ์ถ”์ฒœ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ๊ฐ•์˜ ์ž๋ฃŒ ํ€„๋ฆฌํ‹ฐ๋งŒ ๋ด๋„ ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ๊ฑธ ์ฒด๊ณ„์ ์œผ๋กœ ์•Œ๋ ค์ฃผ๊ธฐ ์œ„ํ•ด ๋…ธ๋ ฅํ–ˆ๋Š” ์ง€๊ฐ€ ๋ณด์ผ ์ •๋„์ž…๋‹ˆ๋‹ค. ์•„์ง ๊ฐ•์˜๋ฅผ ๋งŽ์ด ๋ณด์ง„ ๋ชปํ–ˆ์ง€๋งŒ ์กฐ๋งŒ๊ฐ„ ์™„๊ฐ•ํ•  ๋“ฏ ํ•ฉ๋‹ˆ๋‹ค. ์ข‹์€ ๊ฐ•์˜ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

  • 52๋‹˜์˜ ํ”„๋กœํ•„ ์ด๋ฏธ์ง€
    52

    ์ˆ˜๊ฐ•ํ‰ 2

    โˆ™

    ํ‰๊ท  ํ‰์  5.0

    5

    7% ์ˆ˜๊ฐ• ํ›„ ์ž‘์„ฑ

    ์„ ์ƒ๋‹˜ ์ € ์ˆ˜๊ฐ•ํ‰ ์ฒ˜์Œ์จ๋ด์š”. ๊ทธ๋ƒฅ ์‚ฌ๋ž‘ํ•ฉ๋‹ˆ๋‹ค. part2 ๋นจ๋ฆฌ ๋‚ด๋†“์•„์ฃผ์„ธ์š”

  • ๊น€์ข…์‹๋‹˜์˜ ํ”„๋กœํ•„ ์ด๋ฏธ์ง€
    ๊น€์ข…์‹

    ์ˆ˜๊ฐ•ํ‰ 10

    โˆ™

    ํ‰๊ท  ํ‰์  4.4

    5

    100% ์ˆ˜๊ฐ• ํ›„ ์ž‘์„ฑ

    ๋งŽ์€ ๋ฐฑ์—”๋“œ ๊ฐ•์˜๋ฅผ ๋ณด๊ณ  ์™”์ง€๋งŒ ์ด๋ ‡๊ฒŒ ๊นŒ์ง€ ๊น”๋”ํ•œ ๊ฐ•์˜๋Š” ์ •๋ง ์ฒ˜์Œ์ด๋„ค์š”. ์ค‘๊ฐ„์— ์ •๋ณด๋ฅผ ์ œ๊ณตํ•ด์ฃผ๋Š” ์ฑ•ํ„ฐ๋“ค์ด ์žˆ๋Š”๋ฐ , ๊ทธ ๋‚ด์šฉ๋“ค๋„ ์ดˆ๋ณด์ž๊ฐ€ ์•Œ์•„ ๋“ฃ๊ธฐ ์‰ฝ๊ฒŒ ์„ค๋ช…์„ ํ•˜๊ณ  ๋„˜์–ด๊ฐ€๋Š” ๋ถ€๋ถ„์ด ์ธ์ƒ์ ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ๋‚˜ OOP ๋ผ๋Š” ๊ฐœ๋…์„ ๋ฐฐ์› ์ง€๋งŒ ์–ด๋–ป๊ฒŒ ์ด๊ฒƒ์„ ์ž˜ ํ™œ์šฉ ํ•  ์ˆ˜ ์žˆ์„๊นŒ์— ๋Œ€ํ•œ ๊ถ๊ธˆ์ฆ์ด ๋งŽ์•˜๋Š”๋ฐ, ์ด๋ฒˆ ๊ฐ•์˜์—์„œ ์ถ”์ƒํ™”ํ•˜๋Š” ๋‹จ๊ณ„๋ฅผ ํ†ตํ•ด ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜์ด ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ์ฝ”๋“œ๋ฅผ ๋ณด๋‹ˆ ๋”์šฑ ์žฌ๋ฐŒ์—ˆ์Šต๋‹ˆ๋‹ค. ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์—์„œ ์ œ๊ณตํ•˜๋Š” ์ œ๋„ค๋ฆญ์€ ๋‹จ์ˆœํžˆ ํƒ€์ž…์„ ์ง€์ •ํ•˜๋Š” ๊ฒƒ์ด๋ฉด์„œ๋„ ์œ ์—ฐํ•˜๊ฒŒ ํƒ€์ž…์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ด๊ฒƒ์„ ํŽ˜์ด์ง€๋„ค์ด์…˜ ์ผ๋ฐ˜ํ™” ์ฑ•ํ„ฐ์—์„œ ๋ณด๋ฉด์„œ ๊ฒฝํ—˜ ํ•ด๋ณผ ์ˆ˜ ์žˆ์–ด์„œ ๋„ˆ๋ฌด ์ข‹์•˜์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋งŽ์ด ๋†€๋ž๋˜ ๊ฒƒ์€ ์ด๋ ‡๊ฒŒ ์ฝ”๋“œ๋ฅผ ๋ฆฌํŒฉํ† ๋ง์„ ํ•˜๋ฉด์„œ๋„ ๊ณต๋ถ€ํ•˜๋Š” ์‚ฌ๋žŒ์ด ํ—ท๊ฐˆ๋ฆฌ์ง€ ์•Š๊ฒŒ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒŒ ์‹ ๊ธฐ ํ•˜๋„ค์š”. ํšŒ์‚ฌ์— ๋ฐฑ์—”๋“œ ์„ ์ž„์ด ์—†๋Š” ์ƒํ™ฉ์— JS ๋กœ ์Šคํƒ์„ ๋ณ€๊ฒฝํ•˜๊ณ  Nest๋ฅผ ๋ฐฐ์šฐ๋Š”๋ฐ ์ฝ”๋”ฉํŒฉํ† ๋ฆฌ๋‹˜์ด ์ •์„ฑ๊ป ๋งŒ๋“ค์–ด์ฃผ์‹  ๊ฐ•์˜๊ฐ€ ์ œ ์ปค๋ฆฌ์–ด์—๋„ ๋งŽ์€ ๋„์›€์ด ๋˜๊ณ  ์•ž์œผ๋กœ๋„ ์ข‹์€ ๊ธฐ๋ฐ˜์„ ๋งŒ๋“ค์–ด ์ฃผ์‹ ๋“ฏ ํ•ฉ๋‹ˆ๋‹ค. ๋” ์ข‹์€ ๊ฐ•์˜ ๋ถ€ํƒ๋“œ๋ฆฌ๋ฉฐ ๋‹ค์Œ ๊ฐ•์˜ ๋ถ€ํ„ฐ๋Š” ์ƒ๊ฐํ•˜์ง€๋„ ๋ง๊ณ  ๋ฐ”๋กœ ๊ตฌ๋งค ๋“ค์–ด๊ฐ€๊ฒ ์Šต๋‹ˆ๋‹ค ใ…Ž + ์ดˆ๊ธ‰๊ฐ•์˜๋ผ๊ณ ๋Š” ํ•˜์ง€๋งŒ ์ดˆ๊ธ‰๊ฐ•์˜๋ผ๊ธฐ์—” ๊นŠ์ด๊ฐ€ ์žˆ๋Š” ๋‚ด์šฉ๋“ค์ด ๋งŽ์Šต๋‹ˆ๋‹ค. ์žฌ์ƒ์šฉ์„ฑ์„ ๋†’์ด๊ธฐ ์œ„ํ•ด ์ถ”์ƒํ™”๋ฅผ ๋งŽ์ด ํ•˜๋Š”๋ฐ ์ฒ˜์Œ ๋ฐฑ์—”๋“œ ๊ณต๋ถ€ํ•˜์‹œ๋Š” ๋ถ„๋“ค์€ ํ›„๋ฐ˜ ๊ฐ•์˜๋“ค์€ ์ข€ ์–ด๋ ต๊ฒŒ ๋А๊ปด ์งˆ ์ˆ˜ ์žˆ๊ฒ ์Šต๋‹ˆ๋‹ค.

  • dhj100๋‹˜์˜ ํ”„๋กœํ•„ ์ด๋ฏธ์ง€
    dhj100

    ์ˆ˜๊ฐ•ํ‰ 19

    โˆ™

    ํ‰๊ท  ํ‰์  5.0

    5

    45% ์ˆ˜๊ฐ• ํ›„ ์ž‘์„ฑ

    ๋ฏฟ๊ณ  ๋“ฃ๋Š” ์ฝ”๋“œํŒฉํ† ๋ฆฌ๋‹˜ ๊ฐ•์˜! ํ˜„์žฌ nestjs๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๊ฐœ๋ฐœ ์ค‘์ธ๋ฐ, ์ข€ ๋” ๊นŠ๊ฒŒ ๊ณต๋ถ€ํ•ด๋ณด๊ณ ์ž ์ฝ”๋“œํŒฉํ† ๋ฆฌ๋‹˜ ๊ฐ•์˜ ๋‚˜์˜ค์ž๋งˆ์ž ๊ตฌ๋งคํ•˜๊ณ  ๋“ฃ๋Š”์ค‘์ž…๋‹ˆ๋‹ค. ์ž˜ ๋“ฃ๊ฒ ์Šต๋‹ˆ๋‹ค. ๋‚˜์ค‘์— ๋‚˜์˜ฌ Part 2๋„ ๊ธฐ๋Œ€์ค‘์ž…๋‹ˆ๋‹ค.

์ฝ”๋“œํŒฉํ† ๋ฆฌ๋‹˜์˜ ๋‹ค๋ฅธ ๊ฐ•์˜

์ง€์‹๊ณต์œ ์ž๋‹˜์˜ ๋‹ค๋ฅธ ๊ฐ•์˜๋ฅผ ๋งŒ๋‚˜๋ณด์„ธ์š”!

๋น„์Šทํ•œ ๊ฐ•์˜

๊ฐ™์€ ๋ถ„์•ผ์˜ ๋‹ค๋ฅธ ๊ฐ•์˜๋ฅผ ๋งŒ๋‚˜๋ณด์„ธ์š”!

์—ฐ๊ด€ ๋กœ๋“œ๋งต

๊ฐ•์˜๊ฐ€ ํฌํ•จ๋œ ๋กœ๋“œ๋งต์œผ๋กœ ํ•™์Šตํ•ด ๋ณด์„ธ์š”!

์›” โ‚ฉ19,800

5๊ฐœ์›” ํ• ๋ถ€ ์‹œ

โ‚ฉ99,000