github-blog.png


โœ๏ธ Today I Learned


  • ์ธํ”„๋Ÿฐ์˜ ๋”ฐ๋ผํ•˜๋ฉฐ ๋ฐฐ์šฐ๋Š” NestJS๋ฅผ ๋“ค์œผ๋ฉฐ ๋ฐฐ์šด์ ์„ ๋‚จ๊ธฐ๊ณ  ๊ธฐ๋กํ•ด๋ณด๋ ค๊ณ  ํ•œ๋‹ค.

  • Node.js์˜ ํ”„๋ ˆ์ž„์›Œํฌ์ธ Nest JS๋ฅผ ํ•™์Šตํ•˜๋ฉฐ ์ดํ•ดํ•œ์ ์„ ๊ธฐ๋กํ•˜๋ฉฐ ๋” ๋‚˜์•„๊ฐ€ ๊ถ๊ธˆํ•œ ๋ถ€๋ถ„์— ๋Œ€ํ•ด์„œ๋Š” ์ฐพ์•„๋ณด๋ฉฐ ์Šค์Šค๋กœ ํ•™์Šตํ•œ ์ ์— ๋Œ€ํ•ด์„œ๋„ ๊ธฐ๋ก์œผ๋กœ ๋‚จ๊ฒจ๋ณด๊ธฐ ์œ„ํ•ด ํฌ์ŠคํŒ…์„ ๋‚จ๊ธด๋‹ค.



1. NestJS ๋ชจ๋“ˆ


  • ๋ชจ๋“ˆ์€ @Module () ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ(@)๋กœ ์ฃผ์„์ด ๋‹ฌ๋ฆฐ ํด๋ž˜์Šค์ด๋‹ค.

  • @Module () ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋Š” Nest๊ฐ€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ตฌ์กฐ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š”๋ฐ ์‚ฌ์šฉํ•˜๋Š” ๋ฉ”ํƒ€ ๋ฐ์ดํ„ฐ๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

  • ๊ฐ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์—๋Š” ํ•˜๋‚˜ ์ด์ƒ์˜ ๋ชจ๋“ˆ(์ตœ์†Œ ๋ฃจํŠธ ๋ชจ๋“ˆ)์ด ์žˆ์œผ๋ฉฐ, ๊ทธ ์ค‘ ๋ฃจํŠธ ๋ชจ๋“ˆ์€ Nest๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ์‹œ์ž‘์ ์ด๋‹ค.


  • ๋ชจ๋“ˆ์€ ๋ฐ€์ ‘ํ•˜๊ฒŒ ๊ด€๋ จ๋œ ๊ธฐ๋Šฅ ์ง‘ํ•ฉ์œผ๋กœ์จ ํ•œ ์š”์†Œ๋ฅผ ๊ตฌ์„ฑํ•˜๊ธฐ ์œ„ํ•œ ํšจ๊ณผ์ ์ธ ๋ฐฉ๋ฒ•์ด๋‹ค. (๊ธฐ๋Šฅ๋ณ„๋กœ ๋งŒ๋“ ๋‹ค. โ‡’ ex. ์œ ์ € ๋ชจ๋“ˆ, ์ฃผ๋ฌธ ๋ชจ๋“ˆ, ์ฑ„ํŒ… ๋ชจ๋“ˆ ๋“ฑ๋“ฑ)

  • ๊ฐ™์€ ๊ธฐ๋Šฅ์— ํ•ด๋‹นํ•˜๋Š” ๊ฒƒ๋“ค์€ ํ•˜๋‚˜์˜ ๋ชจ๋“ˆ ํด๋”์•ˆ์— ๋„ฃ์–ด์„œ ์‚ฌ์šฉํ•œ๋‹ค. (ex. userController, userService, userEntity โ‡’ ๋ชจ๋‘ ๊ฐ™์€ ๊ธฐ๋Šฅ์ด๊ธฐ ๋•Œ๋ฌธ์— userModule ์•ˆ์— ๋„ฃ์–ด ๊ด€๋ฆฌํ•œ๋‹ค.)

  • ๋ชจ๋“ˆ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์‹ฑ๊ธ€ ํ†ค ํŒจํ„ด ์ด๋ฏ€๋กœ ์—ฌ๋Ÿฌ ๋ชจ๋“ˆ๊ฐ„์— ์‰ฝ๊ฒŒ ๊ณต๊ธ‰์ž์˜ ๋™์ผํ•œ ์ธ์Šคํ„ด์Šค๋ฅผ ๊ณต์œ  ํ•  ์ˆ˜ ์žˆ๋‹ค.

    ์‹ฑ๊ธ€ ํ†ค ํŒจํ„ด?

    ๊ฐ์ฒด์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ์˜ค์ง 1๊ฐœ๋งŒ ์ƒ์„ฑ๋˜๋Š” ํŒจํ„ด์„ ์˜๋ฏธํ•œ๋‹ค.
    ์ธ์Šคํ„ด์Šค๊ฐ€ ์˜ค์ง ํ•œ ๊ฐœ๋กœ๋งŒ ๊ฐ€์ ธ๊ฐ€๋ฏ€๋กœ ๋ฉ”๋ชจ๋ฆฌ ์ธก๋ฉด์—์„œ ์œ ๋ฆฌํ•˜๋ฉฐ ๋‹ค๋ฅธ ํด๋ž˜์Šค ๊ฐ„์— ๋ฐ์ดํ„ฐ ๊ณต์œ ๊ฐ€ ์‰ฝ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ๋‹ค.



2. NestJS ์ปจํŠธ๋กค๋Ÿฌ


  • ์ปจํŠธ๋กค๋Ÿฌ๋Š” ํด๋ผ์ด์–ธํŠธ์—์„œ ์„œ๋ฒ„๋กœ ๋“ค์–ด์˜ค๋Š” ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ณ  ํด๋ผ์ด์–ธํŠธ๋กœ ์‘๋‹ต์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.


  • ์ปจํŠธ๋กค๋Ÿฌ๋Š” @Controller ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋กœ ํด๋ž˜์Šค๋ฅผ ๋ฐ์ฝ”๋ ˆ์ด์…˜ํ•˜์—ฌ ์ •์˜๋œ๋‹ค.

    @Controller('/boards')
    export class BoardsController {}

    ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋Š” ์ธ์ž๋ฅผ Controller์— ์˜ํ•ด์„œ ์ฒ˜๋ฆฌ๋˜๋Š” โ€œ๊ฒฝ๋กœโ€๋กœ ๋ฐ›๋Š”๋‹ค.



2-1. ํ•ธ๋“ค๋Ÿฌ๋ž€?


  • ํ•ธ๋“ค๋Ÿฌ๋Š” @Get, @Post, @Delete ๋“ฑ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋กœ ์žฅ์‹ ๋œ ์ปจํŠธ๋กค๋Ÿฌ ํด๋ž˜์Šค ๋‚ด์˜ ๋‹จ์ˆœํ•œ ๋ฉ”์„œ๋“œ์ด๋‹ค.

    @Controller('/boards')
    export class BoardsController {
      @Get()
      getBoards(): string {
        return 'This action returns all boards';
      }
    }
  • ์ฆ‰, ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋“ค์–ด์˜จ ์š”์ฒญ์€ ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ์•Œ๋งž์€ ์š”์ฒญ ๊ฒฝ๋กœ(์—”๋“œํฌ์ธํŠธ)๋กœ ๋ถ„๊ธฐํ•ด์ฃผ๋ฉฐ ํ•ด๋‹น ๋ถ„๊ธฐ๋กœ ๋“ค์–ด์˜จ ์š”์ฒญ์— ์•Œ๋งž์€ ํ•  ์ผ(์š”์ฒญ ๋ฉ”์†Œ๋“œ)์€ ํ•ธ๋“ค๋Ÿฌ์—์„œ ์ฒ˜๋ฆฌ๊ฐ€ ๋˜๋Š” ๊ตฌ์กฐ์ด๋‹ค.



3. NestJS ํ”„๋กœ๋ฐ”์ด๋”๋ž€?


  • ํ”„๋กœ๋ฐ”์ด๋”๋Š” NestJS์˜ ๊ธฐ๋ณธ ๊ฐœ๋…์ด๋‹ค.

    ๋Œ€๋ถ€๋ถ„์˜ ๊ธฐ๋ณธ NestJS ํด๋ž˜์Šค๋Š” ์„œ๋น„์Šค, ๋ฆฌํฌ์ง€ํ† ๋ฆฌ, ํŒฉํ† ๋ฆฌ, ํ—ฌํผ๋“ฑ ํ”„๋กœ๋ฐ”์ด๋”๋กœ ์ทจ๊ธ‰๋  ์ˆ˜ ์žˆ๋‹ค.

  • ํ”„๋กœ๋ฐ”์ด๋”์˜ ์ฃผ์š” ์•„์ด๋””์–ด๋Š” ์ข…์†์„ฑ์œผ๋กœ ์ฃผ์ž…ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ์ฆ‰, ๊ฐ์ฒด๋Š” ์„œ๋กœ ๋‹ค์–‘ํ•œ ๊ด€๊ณ„๋ฅผ ๋งŒ๋“ค์ˆ˜ ์žˆ์œผ๋ฉฐ ๊ฐ์ฒด์˜ ์ธ์Šคํ„ด์Šค๋ฅผ โ€œ์—ฐ๊ฒฐโ€ํ•˜๋Š” ๊ธฐ๋Šฅ์€ ๋Œ€๋ถ€๋ถ„ Nest ๋Ÿฐํƒ€์ž„ ์‹œ์Šคํ…œ์— ์œ„์ž„๋  ์ˆ˜ ์žˆ๋‹ค.

  • ์˜ˆ๋ฅผ ๋“ค๋ฉด ์ปจํŠธ๋กค๋Ÿฌ๋Š” ์›น ๋ธŒ๋ผ์šฐ์ €์—์„œ ์š”์ฒญ์ด ๋“ค์–ด์˜ค๋ฉด ๋ฌด์ˆ˜ํžˆ ๋งŽ์€ ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•˜๋ฉฐ ๊ทธ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ๋งŽ์€ ๊ฒƒ๋“ค์„ ํ•„์š”๋กœ ํ•œ๋‹ค.

    ํ•˜์ง€๋งŒ ํ•„์š”ํ•œ ๋ชจ๋“  ๊ฒƒ๋“ค์„ ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ์ฒ˜๋ฆฌํ•˜๊ธฐ์—” ๋„ˆ๋ฌด ๋ฐฉ๋Œ€ํ•˜๋‹ค.

  • ๋”ฐ๋ผ์„œ ๊ธฐ๋Šฅ๋ณ„๋กœ ์„œ๋น„์Šค, ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ๋“ฑ์„ ํ†ตํ•ด์„œ ์ปจํŠธ๋กค๋Ÿฌ์— ํ•ด๋‹นํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๋„ฃ์–ด(์ข…์†์„ฑ์„ ์ฃผ์ž…ํ•œ๋‹ค)์ฃผ๋Š” ๊ฐœ๋…์„ ํ†ตํ‹€์–ด ํ”„๋กœ๋ฐ”์ด๋”๋ผ ์ผ์ปซ๋Š”๋‹ค.



4. NestJS ์„œ๋น„์Šค๋ž€?


  • ์„œ๋น„์Šค๋Š” ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ๋‚ด์˜ ๊ณตํ†ต ๊ฐœ๋…์ด๋ฉฐ, NestJS๋‚˜ JavaScript์—์„œ๋งŒ ์“ฐ์ด๋Š” ๊ฐœ๋…์€ ์•„๋‹ˆ๋‹ค.

  • ์„œ๋น„์Šค๋Š” @Injectable ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋กœ ๊ฐ์‹ธ์ ธ์„œ ๋ชจ๋“ˆ์— ์ œ๊ณต๋˜๋ฉฐ, ์ด ์„œ๋น„์Šค ์ธ์Šคํ„ด์Šค๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ „์ฒด์—์„œ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋‹ค.

    ์„œ๋น„์Šค๋Š” ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ๋ฐ์ดํ„ฐ์˜ ์œ ํšจ์„ฑ ์ฒดํฌ๋ฅผ ํ•˜๊ฑฐ๋‚˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค CRUD๊ฐ€ ์ด๋ค„์ง€๋Š” ๋ถ€๋ถ„๋“ค์„ ์ฒ˜๋ฆฌํ•œ๋‹ค.

  • NestJS CLI๋กœ ์ƒ์„ฑํ•œ ๊ธฐ๋ณธ ํ”„๋กœ์ ํŠธ๋ฅผ ์˜ˆ๋กœ ๋“ค๋ฉด 'Hello World!' ๋ฌธ์ž์—ด์„ ๋ฆฌํ„ดํ•ด์ฃผ๋Š” ์•„๋ž˜์˜ ๋ถ€๋ถ„์ด ๋Œ€ํ‘œ์ ์ธ ์„œ๋น„์Šค๋ผ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

    @Injectable()
    export class AppService {
      getHello(): string {
        return 'Hello World!';
      }
    }


๐Ÿค” Understanding

  • ๋”ฐ๋ผํ•˜๋ฉฐ ๋ฐฐ์šฐ๋Š” Nest JS #2์—์„œ๋Š” NestJS ๋กœ์ง ํ๋ฆ„์— ๋Œ€ํ•ด์„œ ํ•™์Šตํ–ˆ๋‹ค๋ฉด ์˜ค๋Š˜์€ ์ „๋ฐ˜์ ์ธ ๋ถ€๋ถ„๋งˆ๋‹ค ์–ด๋– ํ•œ ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•˜๋ฉฐ ๊ฐ ๋ถ€๋ถ„๋“ค์ด ์–ด๋–ป๊ฒŒ ์ƒํ˜ธ ์—ฐ๊ฒฐ๋˜์–ด ๋™์ž‘๋˜๋Š”์ง€์— ๋Œ€ํ•œ ๋””ํ…Œ์ผํ•œ ๋ถ€๋ถ„์„ ์šฐ์„  ์•Œ์•„๋ณด์•˜๋‹ค.

  • ๊ฐ์ข… ์˜ˆ์ œ๋ฅผ ํ†ตํ•ด์„œ ์‹ค์ œ๋กœ ์ฝ”๋“œ๋ฅผ ์งœ๋ด์•ผ ์‚ฌ์‹ค ์กฐ๊ธˆ ๋” ์™€๋‹ฟ์„ ๋“ฏ ํ•˜๋‹ค.

  • ์ฃผ๋ง์„ ํ†ตํ•ด์„œ CRUD ๊ด€๋ จํ•ด์„œ ์‹ค์ œ๋กœ ์ฝ”๋“œ๋กœ ๊ตฌํ˜„ํ•ด๋ณด๋Š” ์‹œ๊ฐ„์„ ๊ฐ€์ ธ์•ผ ํ•  ๋“ฏํ•˜๋‹ค.