일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- SWIFT
- class
- node.js
- 상속
- 조건문
- 개발자
- props
- AWS
- file upload
- state
- swagger
- Kotlin
- vue
- 자바
- java
- Nest.js
- kafka
- 반복문
- component
- spring boot
- It
- restful api
- Sequelize
- 코틀린
- 개발이 취미인 사람
- front-end
- back-end
- react
- javascript
- Producer
- Today
- Total
개발이 취미인 사람
[Nest.js] Nest.js API 만들기 (1) - Controller, Service, Provider 본문
[Nest.js] Nest.js API 만들기 (1) - Controller, Service, Provider
RyanSin 2021. 11. 7. 02:17- 개요
안녕하세요. 이번 시간에는 Nest.js 프레임워크를 활용해 RESTFul API를 만들어 보겠습니다.
지난 시간에 Nest.js 기본 구조를 알아봤습니다. 혹시 놓치고 오신 분들은 아래 링크를 통해 학습하고 오시는 걸 추천드리겠습니다.
- 구조 설계
저희는 간단하게 유저를 등록하는 API를 만들어 보겠습니다. Nest.js에서 지향하는 아키텍처를 준수하면서 구현을 해야 합니다.
Nest.js는 클라이언트 요청이 들어오면 다음과 같은 로직으로 실행됩니다.
"1. @Controller -> 2.@Service -> 3. Repository"
Repository는 데이터베이스를 담당하는 하기 때문에 Repository는 생략하겠습니다.
기본적으로 프로젝트를 만들면 src폴더 구조는 아래와 같이 확인할 수 있습니다.
app.controller.spec.ts파일, app.controller.ts 파일 그리고 app.service.ts 파일을 삭제합니다.
app.module.ts 파일은 애플리케이션에 전체 모듈을 담당하는 Root Module이라고 했습니다.
main.ts 파일은 NestFactory는 AppModule을 통해 애플리케이션 전체에 모듈을 조립하고 필요한 클래스를 생성해서 서버를 실행한다.
우리는 유저를 등록하는 모듈을 만들어보겠습니다. Nest.js에는 CLI를 통해 Module과 Controller 그리고 Service를 생성할 수 있습니다
- Module 생성
명령어
nest g module user
위 명령어를 터미널에 실행하면 새로운 user폴더와 user.module.ts 파일이 생성된 걸 확인할 수 있습니다.
user.module.ts 소스 코드를 보면 아래와 같이 기본적인 module 소스 코드가 생성된 걸 확인할 수 있습니다.
import { Module } from '@nestjs/common';
@Module({})
export class UserModule {}
- Controller 생성
명령어
# --no-spec 옵션은 *.controller.spec.ts 파일을 생성 X 옵션
nest g controller user --no-spec
위 명령어를 터미널에 실행하면 새로운 user폴더 안에 user.controller.ts 파일이 생성된 걸 확인할 수 있습니다.
그리고 user.module.ts 파일을 확인해보면 자동으로 Controller가 등록된 걸 확인할 수 있습니다.
import { Module } from '@nestjs/common';
import { UserController } from './user.controller';
@Module({
controllers: [UserController],
})
export class UserModule {}
- Service 생성
명령어
# --no-spec 옵션은 *.service.spec.ts 파일을 생성 X 옵션
nest g service user --no-spec
위 명령어를 터미널에 실행하면 새로운 user폴더 안에 user.service.ts 파일이 생성된 걸 확인할 수 있습니다.
그리고 user.module.ts 파일을 확인해보면 자동으로 Service가 등록된 걸 확인할 수 있습니다.
import { Module } from '@nestjs/common';
import { UserController } from './user.controller';
import { UserService } from './user.service';
@Module({
controllers: [UserController],
providers: [UserService],
})
export class UserModule {}
- 연결 확인
Controller는 클라이언트에 요청과 응답을 담당하고 Service는 비즈니스 로직을 담당한다고 지난 시간에 설명했습니다.
Service 파일에 간단한 Hello World!! 를 출력하는 API를 만들어 보겠습니다.
TypeScript 문법을 다루지 않기 때문에 문법에 익숙하지 않으신 분들은 문법 공부를 하고 오시는 걸 추천드리겠습니다.
1. user.service.ts 파일 설정
import { Injectable } from '@nestjs/common';
@Injectable()
export class UserService {
getHelloWorld(): string {
return 'Hello World!!';
}
}
2. user.controller.ts 파일 설정
import { Controller, Get } from '@nestjs/common';
import { UserService } from './user.service';
@Controller('user')
export class UserController {
constructor(private readonly userService: UserService) {}
@Get() //경로를 설정하지 않으면 "user/" 경로로 설정이 된다.
getHelloWorld(): string {
return this.userService.getHelloWorld();
}
}
3. 서버 실행 및 확인
명령어
npm run start:dev
해당 명령어를 실행하면 dist 폴더가 생성이 됩니다. JavaScirpt로 컴파일 후 서버를 실행합니다.
연결 확인
연결이 된 걸 확인할 수 있습니다.
- Provider 의존관계 주입(Dependency Injection)
우리가 방금 생성한 user.controller를 보면 constructor(private readonly userService: UserService) {} 볼 수 있습니다.
constructor는 해당 클래스에 생성자를 나타냅니다. (생성자는 클래스를 생성한데 초기 값을 설정할 때 사용됩니다.)
객체지향 언어를 사용해서 개발하신 분들은 생성자를 통해 받은 속성은 내부 클래스에 속성을 this를 통해 연결을 합니다.
//기본 방식
class Controller {
private userService:UserService;
constructor(userService: UserService) {
this.userService = userService
}
}
하지만 Nest.js는 Providers에 UserService를 등록했기 때문에 위와 같지 선언하지 않고도 사용이 가능합니다.
기본 Nest 클래스의 대부분은 서비스, 리포지토리, 팩토리, 도우미 등 공급자로 취급될 수 있습니다.
import { Module } from '@nestjs/common';
import { UserController } from './user.controller';
import { UserService } from './user.service';
@Module({
controllers: [UserController],
providers: [UserService], //프로바이더 등록
})
export class UserModule {}
Providers로 Service를 등록해서 사용하는 이유는, Controller는 기본적으로 HTTP 요청을 통해 사용자가 보낸 데이터를 처리합니다.
그렇기 때문에 비즈니스 로직과 같은 복잡한 부분을 Service의 위임해서 이 부분을 해소합니다.
차근차근 실습을 통해 꼭 학습하시는 걸 추천드리겠습니다. :)
소스 저장소
github: https://github.com/Ryan-Sin/Node_Nest/tree/v1
'백앤드(Back-End) > Nest.js' 카테고리의 다른 글
[Nest.js] Nest.js API 만들기 (4) - 미들웨어(Middleware) (0) | 2021.11.11 |
---|---|
[Nest.js] Nest.js API 만들기 (3) - DTO(Data Transfer Object) & 유효성 검사(Validation Check) & Pipes (1) | 2021.11.10 |
[Nest.js] Nest.js API 만들기 (2) - Handler(@Get, @Post ...) (0) | 2021.11.09 |
[Nest.js] Nest.js 기본 구조 분석하기 (0) | 2021.11.06 |
[Nest.js] Nest.js 개념 및 프로젝트 생성 (0) | 2021.11.06 |