๐ก 01. NestJS ์๊ฐ โ ์ ํ๋ ์์ํฌ๊ฐ ํ์ํ๊ฐ?
๐ ๊ฐ์
NestJS์ ๊ธฐ๋ณธ ๊ฐ๋ ๊ณผ ํ๋ก์ ํธ ๊ตฌ์กฐ๋ฅผ ์ดํดํ๊ณ , ํต์ฌ ๊ฐ๋ ์ธ ๋ชจ๋, ์ปจํธ๋กค๋ฌ, ์๋น์ค, ์์กด์ฑ ์ฃผ์ ์ ๋ฐฐ์๋๋ค.
๐ ๋ชฉ์ฐจ
- ๐ ์ด ๋ฌธ์๋ฅผ ์ฝ๊ธฐ ์ ์
- ๐ค ์ ์์์ผ ํ๋๊ฐ (Express vs NestJS)
- ๐๏ธ ๋น์ ๋ก ๋จผ์ ์ดํดํ๊ธฐ
- ๐งฉ 4๋ ํต์ฌ ๊ฐ๋ ์ดํดํ๊ธฐ ๐ข
- ๐งช ๋ฐ๋ผํด๋ณด๊ธฐ: ์ฒซ ์ฑ ์คํ ๋ฐ ๊ตฌ์กฐ ํ์
- ๐ผ ๋ฒ ์คํธ ํ๋ํฐ์ค์ ์ค๋ฌด ํ
- ๐ฅ ์๋ฌ ํด๊ฒฐ ์นดํ๋ก๊ทธ
- ๐๏ธ ์นํธ์ํธ
- ๐ ๋ง๋ฌด๋ฆฌ ํด์ฆ
๐ ์ด ๋ฌธ์๋ฅผ ์ฝ๊ธฐ ์ ์
โฑ๏ธ ์์ ์ฝ๊ธฐ ์๊ฐ: 15๋ถ (์ ์ฒด) / ํต์ฌ ํํธ๋ง: 7๋ถ
๐งณ ์ ์ ์ง์ ์ฒดํฌ๋ฆฌ์คํธ
์๋ ํญ๋ชฉ์ ๋ชจ๋ ์๋ฉด ๋ฐ๋ก [4๋ ํต์ฌ ๊ฐ๋
]๋ถํฐ ์ฝ์ด๋ ๋ผ:
- JavaScript๋ TypeScript์ ๊ธฐ๋ณธ ๋ฌธ๋ฒ์ ์ฝ์ ์ค ์๋ค.
- REST API๊ฐ ๋ฌด์์ธ์ง ๋๋ต์ ์ผ๋ก ์๋ค (GET, POST ๋ฑ).
- Express.js ๊ฐ์ ๋ฐฑ์๋๋ฅผ ์์ฃผ ์กฐ๊ธ์ด๋ผ๋ ๋ง์ ธ๋ณธ ์ ์ด ์๋ค.
- ํฐ๋ฏธ๋์์
npm install์ด๋npx๋ช ๋ น์ด๋ฅผ ์คํํ ์ ์๋ค.
๐บ๏ธ ์ด ๋ฌธ์์ ํ๋ฆ
NestJS์ ํ์ ๋ฐฐ๊ฒฝ โ 4๊ฐ์ง ํต์ฌ ๊ตฌ์กฐ(์ปจํธ๋กค๋ฌ/์๋น์ค/๋ชจ๋/DI) โ ์ฒซ ์ฑ ๋์ฐ๊ธฐ โ ์์ฃผ ๊ฒช๋ ์๋ฌ โ ์นํธ์ํธ
๐ฏ ์ด ๋ฌธ์๋ฅผ ๋ค ์ฝ์ผ๋ฉด ํ ์ ์๋ ๊ฒ
- NestJS๊ฐ ์ Express๋ณด๋ค ๋๊ท๋ชจ ํ๋ก์ ํธ์ ์ข์์ง ์ค๋ช ํ ์ ์๋ค.
- ์น ์์ฒญ์ด ๋ค์ด์์ ๋ ์ปจํธ๋กค๋ฌ์ ์๋น์ค๊ฐ ์ด๋ป๊ฒ ์ผ์ ๋๋๋์ง ์ค๋ช ํ ์ ์๋ค.
- ๋๋ง์ ์ฒซ ๋ฒ์งธ NestJS ์๋ฒ๋ฅผ ๋ก์ปฌ์ ๋์ธ ์ ์๋ค.
๐ค ์ ์์์ผ ํ๋๊ฐ (Express vs NestJS)
Node.js ์ธ์์์ ๊ฐ์ฅ ์ ๋ช
ํ ๋ฐฑ์๋ ๋๊ตฌ๋ ์์ฌ์ ์ฌ์ง ์์ด Express.js ์ผ.
ํ์ง๋ง Express๋ ๋๋ฌด๋๋ ์์ ๋ก์. ์ด๋์ ๋ผ์ฐํฐ๋ฅผ ๋๊ณ , ์ด๋์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฝ๋๋ฅผ ์ธ์ง ์๋ฌด๋ฐ ๊ท์น์ ๊ฐ์ ํ์ง ์์.
๐ค ์ ๊น, ๋จผ์ ์๊ฐํด๋ด
5๋ช ์ด ํจ๊ป Express๋ก ์๋ฒ๋ฅผ ๋ง๋ ๋ค๊ณ ์น์. ๊ฐ์ ์๊ธฐ ๋ง์๋๋ก ํด๋๋ฅผ ๋ง๋ค๊ณ ์ฝ๋๋ฅผ ์ง๋ฉด, ๋์ค์ ์ฝ๋๊ฐ ์ด๋ป๊ฒ ๋ ๊น?
Express์ ์์ ๋ก์์ ํผ์ ๋ง๋ค ๋๋ ์ถ๋ณต์ด์ง๋ง, ์ฌ๋ฌ ๋ช ์ด ํจ๊ป ์ผํ๋ ์ค๋ฌด์์๋ ์์ฒญ๋ ํผ๋(์คํ๊ฒํฐ ์ฝ๋)์ ๋ณ์. ์ด๋์ ๋ญ๊ฐ ์๋์ง ์ฐพ์ ์๊ฐ ์๊ฒ ๋๊ฑฐ๋ .
NestJS ๋ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋ฑ์ฅํ์ด. Angular ์ํคํ ์ฒ์์ ์๊ฐ์ ๋ฐ์ "์ฝ๋๋ ๋ฌด์กฐ๊ฑด ์ด๋ ๊ฒ ์ง์ผ ํด!" ๋ผ๋ ๊ฐ๋ ฅํ๊ณ ๋ช ํํ ๋ผ๋(Architecture)๋ฅผ ๊ฐ์ ํ๋ ํ๋ ์์ํฌ์ผ.
| ํน์ฑ | Express | NestJS |
|---|---|---|
| ์์ ๋ | 100% (๊ท์น ์์) | ๋ฎ์ (** ์๊ฒฉํ ๋ผ๋ ๊ฐ์ **) |
| ์ธ์ด | JavaScript ์ฐ์ | TypeScript ์๋ฒฝ ์ง์ |
| ์ ํฉ๋ | ์๊ณ ๋น ๋ฅธ ์ฌ์ด๋ ํ๋ก์ ํธ | ์ฌ๋ฌ ๋ช ์ด ๊ฐ๋ฐํ๋ ๋๊ท๋ชจ ์ฑ |
๐๏ธ ๋น์ ๋ก ๋จผ์ ์ดํดํ๊ธฐ
๐ง 5์ด์๊ฒ ์ค๋ช ํ๋ค๋ฉด?
Express๊ฐ '๋น ๋ํ์ง์ ํฌ๋ ํ์ค'๋ผ๋ฉด, NestJS๋ '์กฐ๋ฆฝ ์ค๋ช
์๊ฐ ์๋ ๋ ๊ณ ๋ธ๋ก' ์ด์ผ.
๋ํ์ง์๋ ์๋ฌด๋ ๊ฒ๋ ๊ทธ๋ฆด ์ ์์ด์ ํธํ์ง๋ง, ์ปค๋ค๋ ๋์๋ฅผ ๊ทธ๋ฆด ๋ ๋ณต์กํด์ ธ.
๋ ๊ณ ๋ ์ ํด์ง ๋ชจ์๋๋ก ๋ฑ๋ฑ ๋ผ์ ๋ง์ถฐ์ผ ํด์ ์ฒ์์ ๊ท์ฐฎ์ง๋ง, ์น๊ตฌ๋ค๊ณผ ํ์ ํฉ์ณ์ ์์ฒญ๋๊ฒ ๊ฑฐ๋ํ ์ฑ์ ๋ง๋ค์ด๋ ํผํผํ๊ฒ ์ ์งํ ์ ์์ด!
๐งฉ 4๋ ํต์ฌ ๊ฐ๋ ์ดํดํ๊ธฐ ๐ข
๐ฏ ์ด ์น์ ์ ์ฝ๊ณ ๋๋ฉด:
- HTTP ์์ฒญ์ ๋ฐ๋ ์ญํ (Controller)๊ณผ ์ค์ ๋ก์ง(Service)์ ์๋ฒฝํ ๊ตฌ๋ถํ ์ ์๋ค.
DI๋ผ๋ ๋ฌด์๋ฌด์ํ ๋จ์ด์ ์ง์ง ์๋ฏธ๋ฅผ ์ค๋ช ํ ์ ์๋ค.
๋ง์น ์ฒด๊ณ์ ์ผ๋ก ๋์๊ฐ๋ ๊ณ ๊ธ ๋ ์คํ ๋์ฒ๋ผ, NestJS๋ ์ญํ ์ ์๋ฒฝํ๊ฒ ๋๋ ์ธ ๊ฐ์ง ์ฃผ์ ์์๋ฅผ ๊ฐ์ ธ.
1. ์ปจํธ๋กค๋ฌ (Controller) โ ์ฃผ๋ฌธ์ ๋ฐ๋ ์จ์ดํฐ ๐โโ๏ธ
์ปจํธ๋กค๋ฌ๋ ์ค์ง "ํด๋ผ์ด์ธํธ(์๋)์ ์์ฒญ์ ๋ฐ๊ณ , ์๋น์ค(์ฃผ๋ฐฉ)๋ก ์ ๋ฌํ ๋ค, ๊ฒฐ๊ณผ๋ฌผ์ ๋ค์ ์๋ตํ๋ ์ผ" ๋ง ํด.
import { Controller, Get } from '@nestjs/common';
import { UsersService } from './users.service';
@Controller('users') // '/users' ๊ฒฝ๋ก์ ์์ฒญ์ ๋ค ๋ฐ์
export class UsersController {
// ์์ฑ์๋ฅผ ํตํด ์๋น์ค(์ฃผ๋ฐฉ์ฅ)๋ฅผ ๋ถ๋ฌ์ด
constructor(private readonly usersService: UsersService) {}
@Get() // GET ์์ฒญ์ด ์ค๋ฉด
findAll() {
// ์๋ฆฌ๋ ์๋น์ค๊ฐ ํ๊ณ , ๊ฒฐ๊ณผ๋ง ๋ฐ์์ ์๋นํจ!
return this.usersService.findAllUsers();
}
}โ ๋์ ์: ์ปจํธ๋กค๋ฌ ์์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ง์ ์ ์ํด์ ๋ฐ์ดํฐ๋ฅผ ๋ฝ๋ ๊ฒ (์จ์ดํฐ๊ฐ ์ฃผ๋ฐฉ ๋ถํ์ ๊ณ ๊ธฐ๋ฅผ ๊ตฝ๋ ๊ฒฉ)
2. ์๋น์ค (Service) โ ์๋ฆฌ๋ฅผ ํ๋ ์ ฐํ ๐งโ๐ณ
์๋น์ค๋ ์ค์ ๋น์ฆ๋์ค ๋ก์ง(๋ฐ์ดํฐ ์ ์ฅ, ๊ณ์ฐ, API ํธ์ถ ๋ฑ) ์ ์ฑ ์์ ธ. ์ปจํธ๋กค๋ฌ๊ฐ ์ด๋ค HTTP ๋ฉ์๋๋ก ํต์ ํ๋์ง ์ ํ ๋ชฐ๋ผ๋ ๋ผ.
import { Injectable } from '@nestjs/common';
@Injectable() // "์ด ํด๋์ค๋ ๋ค๋ฅธ ๋ฐ์ ๋ถ๋ฌ๋ค ์ธ ์ ์๋ ์ฃผ๋ฐฉ์ฅ์
๋๋ค"
export class UsersService {
findAllUsers() {
// ์ค์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์กฐํ๋ฅผ ์ฌ๊ธฐ์ ์ํ
return [{ id: 1, name: 'Suyeong' }];
}
}๐ ์ฉ์ด:
Providerโ NestJS์์ ์์กด์ฑ ์ฃผ์ ์ ํตํด ๋ค๋ฅธ ํด๋์ค์ ๊ณต๊ธ(provide)๋ ์ ์๋ ๋ชจ๋ ๊ฒ. ์๋น์ค๋ Provider์ ๊ฐ์ฅ ๋ํ์ ์ธ ์ข ๋ฅ์ผ.
3. ๋ชจ๋ (Module) โ ์ฃผ๋ฐฉ๊ณผ ํ์ ํ๋๋ก ๋ฌถ์ ๋ ์คํ ๋ ์ง์ ๐ข
๋ชจ๋์ ์๋ก ์ฐ๊ด๋ ์ปจํธ๋กค๋ฌ์ ์๋น์ค๋ฅผ ํ๋์ ํด๋์ฒ๋ผ ๋ฌถ์ด์ฃผ๋ ๊ป๋ฐ๊ธฐ์ผ. "Users ๊ด๋ฆฌ ์ง์ ", "๊ฒ์๊ธ ๊ด๋ฆฌ ์ง์ " ๋จ์๋ก ๋๋์ง.
import { Module } from '@nestjs/common';
import { UsersController } from './users.controller';
import { UsersService } from './users.service';
@Module({
controllers: [UsersController], // ์ด ๋ชจ๋์ ์จ์ดํฐ๋ค ๋ฑ๋ก
providers: [UsersService], // ์ด ๋ชจ๋์ ์
ฐํ๋ค ๋ฑ๋ก
})
export class UsersModule {}4. ์์กด์ฑ ์ฃผ์ (DI; Dependency Injection) ๐
NestJS๋ฅผ ์ฒ์ ๋ฐฐ์ธ ๋ ์ ์ผ ํท๊ฐ๋ฆฌ๋ ๋จ์ด์ผ.
โ ์์กด์ฑ ์ฃผ์
์ ์ ์ฐ๋ฉด?
์ปจํธ๋กค๋ฌ๊ฐ ์ง์ ์๋น์ค๋ฅผ ์์ฑํด์ผ ํด. (new UsersService())
์ด๋ฌ๋ฉด ์จ์ดํฐ๊ฐ ์ถ๊ทผํ ๋๋ง๋ค ์๊ธฐ ์ ๋ด ์
ฐํ๋ฅผ ์ง์ ๊ณ ์ฉํด์ ๋ฐ๋ฆฌ๊ณ ์์ผ ํด. ์
ฐํ๋ฅผ ๋ฐ๊พธ๊ฑฐ๋ ํด๊ฐ ๋ณด๋ผ ๋ ๋๋ฌด ๋ถํธํ์ง.
โ
์์กด์ฑ ์ฃผ์
์ ์ฐ๋ฉด?
NestJS(๋ ์คํ ๋ ์ง๋ฐฐ์ธ)๊ฐ ๋ฏธ๋ฆฌ ์
ฐํ ์ธ์คํด์ค๋ฅผ ํ๋ ๋ง๋ค์ด๋๊ณ , ์จ์ดํฐ๊ฐ ์ถ๊ทผ(constructor)ํ๋ฉด ์์์ ๋ฑ ์ฐ๊ฒฐํด์ค!
๐ก ํ ์ค๋ก ๊ธฐ์ตํ๊ธฐ
์ปจํธ๋กค๋ฌ๋ ์จ์ดํฐ(์์ฒญ/์๋ต), ์๋น์ค๋ ์ ฐํ(์ค์ ๋ก์ง), ๋ชจ๋์ ๋ ์คํ ๋์ ํน์ ์ฝ๋, DI๋ ์ง๋ฐฐ์ธ(ํ์ํ ์ธ๋ ฅ์ ์์์ ๊ฝ์์ค)์ด์ผ.
๐งช ๋ฐ๋ผํด๋ณด๊ธฐ: ์ฒซ ์ฑ ์คํ ๋ฐ ๊ตฌ์กฐ ํ์
๋ฐฑ๋ฌธ์ด ๋ถ์ฌ์ผํ! ํฐ๋ฏธ๋์ ์ด๊ณ ์ง์ ์ฒซ ์ฑ์ ๋์๋ณด์.
1๏ธโฃ ์ค์ต: NestJS ํ๋ก์ ํธ ์์ฑํ๊ธฐ
# 1. NestJS CLI ๋๊ตฌ๋ฅผ ์ด์ฉํด ์ ํ๋ก์ ํธ ๋ง๋ค๊ธฐ (์ด๋ฆ: my-server)
npx @nestjs/cli new my-server --strict
# โโโ --strict: TypeScript์ ์๊ฒฉํ ๋ชจ๋๋ฅผ ์ผ์ ๋์ค์ ๋ฐ์ํ ์๋ฌ๋ฅผ ์ค์ฌ์ค
# 2. ํด๋๋ก ์ด๋
cd my-server
# 3. ๊ฐ๋ฐ ๋ชจ๋๋ก ์๋ฒ ์คํ (์ฝ๋ ๋ณ๊ฒฝ ์ ์๋ ์ฌ์์)
npm run start:dev์๋ฒ๊ฐ ์ผ์ง๋ฉด ๋ธ๋ผ์ฐ์ ์์ http://localhost:3000์ผ๋ก ์ ์ํด๋ด. "Hello World!"๊ฐ ๋ณด์ผ ๊ฑฐ์ผ!
๐ src/main.ts ํ ์ค์ฉ ๋ฏ์ด๋ณด๊ธฐ:
์ด ํ์ผ์ ์๋ฒ๋ฅผ ์ผ๋ ์์ง ๋ฃธ์ด์ผ.
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
async function bootstrap() {
// 1. AppModule(์ต์์ ๋ ์คํ ๋ ๋ณธ์ )์ ๊ธฐ๋ฐ์ผ๋ก ์ฑ ์์ฑ
const app = await NestFactory.create(AppModule);
// 2. 3000๋ฒ ํฌํธ์์ ์์ฒญ์ ๋๊ธฐ
await app.listen(3000);
}
bootstrap(); // ํจ์ ์คํโ ์ค์ต ํ ์ฒดํฌ๋ฆฌ์คํธ
- ๋ธ๋ผ์ฐ์ ์์ Hello World๋ฅผ ํ์ธํ๋ค.
- NestJS์ 4๋ ํต์ฌ ๊ฐ๋ (์ปจํธ๋กค๋ฌ, ์๋น์ค, ๋ชจ๋, DI)์ ๋น์ ๋ก ์ค๋ช ํ ์ ์๋ค.
๐ผ ๋ฒ ์คํธ ํ๋ํฐ์ค์ ์ค๋ฌด ํ ๐ก
ํฐ๋ฏธ๋ CLI๋ก ๋ณด์ผ๋ฌํ๋ ์ดํธ ๋ฐ์ด๋ด๊ธฐ
NestJS๋ ํ์ผ์ ์ง์ ๋ง๋ค์ง ์์๋ ๋ผ. CLI๊ฐ ๋ชจ๋, ์ปจํธ๋กค๋ฌ, ์๋น์ค๋ฅผ ํ ๋ฒ์ ์์๊ฒ ๋ฌถ์ด์ ์์ฑํด์ค.
# Users์ ๊ด๋ จ๋ CRUD ์๋ฒฝ ์ธํธ ๋ผ๋ ์์ฑ!
npx nest generate resource users์ด ๋ช
๋ น์ด ํ๋ฐฉ์ด๋ฉด users.controller.ts, users.service.ts, users.module.ts, ๊ทธ๋ฆฌ๊ณ ํ
์คํธ ํ์ผ๊น์ง ์๋ฒฝํ ๊ตฌ์กฐ๋ก ์์ฑ๋ผ. ๋ฌด์กฐ๊ฑด ์ด๊ฑฐ ์จ!
์ ๋ ๊ฒฝ๋ก (Paths) ์ค์ ํ๊ธฐ
ํ๋ก์ ํธ๊ฐ ์ปค์ง๋ฉด import { UsersService } from '../../../../modules/users/users.service' ๊ผด์ด ๋. ๋์ฐํ์ง?
tsconfig.json์ ์๋์ฒ๋ผ ์ธํ
ํด.
{
"compilerOptions": {
"baseUrl": "./",
"paths": {
"@/*": ["src/*"]
}
}
}์ด์ import { UsersService } from '@/modules/users/users.service' ๋ก ๊น๋ํ๊ฒ ๋!
๐ฅ ์๋ฌ ํด๊ฒฐ ์นดํ๋ก๊ทธ
์๋ฌ ๋ฉ์์ง๊ฐ ๋จ๋ฉด Ctrl+F๋ก ๋ฉ์์ง ์ผ๋ถ๋ฅผ ๊ฒ์ํด๋ด.
โ Error: listen EADDRINUSE: address already in use :::3000
์ธ์ ๋์ค๋๊ฐ?
[ExceptionsHandler] listen EADDRINUSE: address already in use :::3000์์ธ: ์ด๋ฏธ 3000๋ฒ ํฌํธ์์ ๋ค๋ฅธ ์๋ฒ๊ฐ ๋๊ณ ์๋ค๋ ๋ป์ด์ผ. (์ด์ ์ผ๋ ํฐ๋ฏธ๋ ์ฐฝ์ด ์ด๋๊ฐ ์ด์์์ ํ๋ฅ 99%)
ํด๊ฒฐ์ฑ :
# Mac/Linux ํฐ๋ฏธ๋์์: 3000 ํฌํธ ์ฃฝ์ด๊ธฐ
lsof -i :3000
kill -9 [PID๋ฒํธ]โ Nest can't resolve dependencies of the UsersController
์ธ์ ๋์ค๋๊ฐ?
Nest can't resolve dependencies of the UsersController (?).
Please make sure that the argument UsersService at index [0] is available in the UsersModule context.์์ธ: ์ปจํธ๋กค๋ฌ์์ UsersService๋ฅผ ๊ฐ์ ธ๋ค ์ฐ๊ณ ์ถ์๋ฐ, NestJS ๊ท์น ์ ํด๋น ๋ชจ๋์ providers: [] ๋ฐฐ์ด์ ๋ฑ๋ก์ ์ ํด๋ ๊ฑฐ์ผ. (์
ฐํ๋ฅผ ๊ณ ์ฉ ์ ํ๊ณ ์จ์ดํฐ๋ง ๋ถ๋ ์)
ํด๊ฒฐ์ฑ
:
users.module.ts ํ์ผ์ ์ด์ด์ ์๋์ฒ๋ผ ์์ ํด.
@Module({
controllers: [UsersController],
providers: [UsersService], // ๐ ์ด๊ฑฐ ๋นผ๋จน์์ด!
})๐๏ธ ์นํธ์ํธ
๋ฌธ์ ์ ์ฒด๋ฅผ ๋ค์ ์ฝ์ ์๊ฐ์ด ์์ ๋ ์ด๊ฒ๋ง ๋ด๋ ๋ผ.
๐ ํต์ฌ ๋ช ๋ น์ด
| ์ํฉ | ๋ช ๋ น์ด | ์ค๋ช |
|---|---|---|
| ์ ํ๋ก์ ํธ | npx @nestjs/cli new [์ด๋ฆ] | ๊ธฐ๋ณธ ๋ผ๋ ์์ฑ |
| ์์ ์ผ๊ด ์์ฑ | npx nest g resource [์ด๋ฆ] | ์ปจํธ๋กค๋ฌ+์๋น์ค+๋ชจ๋ ๋๋ฑ |
| ๊ฐ๋ฐ ์๋ฒ ์คํ | npm run start:dev | ํ์ผ ์ ์ฅ ์ ์๋ ์ฌ์์ ๋ชจ๋ |
โ ๏ธ ์ ๋ ํ์ง ๋ง ๊ฒ
| ์ํฉ | โ ๋์ ์ | โ ์ข์ ์ |
|---|---|---|
| ์ปจํธ๋กค๋ฌ ์ญํ | ์ปจํธ๋กค๋ฌ์์ ํ๋ผ๋ฏธํฐ ๊ณ์ฐ, DB ์ ์ | ์๋น์ค ํจ์๋ง ๋๋ ํธ์ถ |
| ์์กด์ฑ ์์ฑ | new UsersService() | constructor(private usersService: UsersService) |
๐ ๋ง๋ฌด๋ฆฌ ํด์ฆ
Q1. ๋ค์ ์ค NestJS ์ปจํธ๋กค๋ฌ์ ์๋น์ค์ ์ญํ ๋ถ๋ด์ผ๋ก ๊ฐ์ฅ ์ฌ๋ฐ๋ฅธ ๊ฒ์?
- A) ์๋น์ค๊ฐ HTTP API์ URL ์ฃผ์๋ฅผ ์ ์ํ๊ณ , ์ปจํธ๋กค๋ฌ๊ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๊ฐ์ ์กฐํํ๋ค.
- B) ์ปจํธ๋กค๋ฌ๊ฐ HTTP ์์ฒญ๊ณผ ์๋ต์ ๊ด๋ฆฌํ๊ณ , ์๋น์ค๊ฐ ๋ฐ์ดํฐ ์ ํจ์ฑ์ ๊ฒ์ฌํ๊ณ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๋ค๋ฃฌ๋ค.
- C) ์ปจํธ๋กค๋ฌ์ ์๋น์ค ์ค ์๋ฌด ๊ณณ์๋ ๋ก์ง์ ์์ฑํด๋ ๋ฌด๋ฐฉํ๋ค.
- D) ์ปจํธ๋กค๋ฌ๋ ๋ทฐ(View) ๋ ๋๋ง์๋ง ์ฌ์ฉ๋๋ค.
โ ์ ๋ต: B
๐ก ์ค๋ช : ์จ์ดํฐ(์ปจํธ๋กค๋ฌ)๋ ํด๋ผ์ด์ธํธ ๊ตฌ์ญ, ์ ฐํ(์๋น์ค)๋ ์๋ฆฌ ๋ก์ง. ์ฒ ์ ํ๊ฒ ์ญํ ์ ๋ถ๋ฆฌํด์ผ ํด!
Q2. ์๋ ๋น์นธ์ ์ฑ์๋ด.
ํฐ๋ฏธ๋์์ ๋ช ๋ น์ด ํ ์ค๋ก ์ปจํธ๋กค๋ฌ, ์๋น์ค, DTO ํ์ผ ๋ฑ์ ํ ๋ฌถ์์ผ๋ก ์๋ฒฝํ๊ฒ ์๋ ์์ฑํ๊ณ ์ถ์ ๋ ์ฐ๋ ๋ช ๋ น์ด๋?
npx nest g [ ] usersโ
์ ๋ต: resource
๐ ํต์ฌ ๊ธฐ์ต๋ฒ: ๊ฒ์ํ, ์ ์ ๊ด๋ฆฌ ๊ฐ์ ํ ๋ฉ์ด๋ฆฌ์ '์์(resource)'์ ํต์งธ๋ก ์์ฑํด์ฃผ๋ ๋ง๋ฒ์ ๋จ์ด.
Q3. ๋๋ฒ๊น ํด์ฆ: ์๋ ์ฝ๋์์ ์๋ฒ๊ฐ ์ฃฝ๋ ์ด์ ๋ฅผ ์ฐพ์๋ด.
// users.module.ts
import { Module } from '@nestjs/common';
import { UsersController } from './users.controller';
@Module({
controllers: [UsersController]
// ์ฃผ๋ฐฉ์ฅ์ด ์์ด์...
})
export class UsersModule {}์ปจํธ๋กค๋ฌ์์ UsersService๋ฅผ ์ฃผ์
๋ฐ์ ์ฐ๊ณ ์๋๋ฐ, ๋ชจ๋์๋ ์์ฒ๋ผ๋ง ๋ฑ๋ก๋์ด ์์ด. ์ด๋ป๊ฒ ๊ณ ์ณ์ผ ํ ๊น?
- A)
@Controller์ต์ ์ผ๋ก ์๋น์ค๋ฅผ ์ถ๊ฐํ๋ค. - B)
providers: [UsersService]๋ฐฐ์ด์ ๋ชจ๋์ ๋ช ์ํด ์ค๋ค. - C)
imports: [UsersService]๋ก ์๋น์ค ํ์ผ์ ๊ฐ์ ธ์จ๋ค.
โ ์ ๋ต: B
๐ก ์ค๋ช : ์์ ์ด ๋ฐ๋ฆฌ๊ณ ์๋ ์ ฐํ(Service)๋ ๋ฌด์กฐ๊ฑด Provider ๋ฐฐ์ด์ ๋ช ์ํด์ค์ผ NestJS์ DI ์์คํ ์ด ์ธ์ํด!