![[NestJs] 데코레이터,컨트롤러,서비스,모듈](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2qj4I%2FbtsKgKS5QeG%2F9yJSV7mqJsb783nd2Mklt1%2Fimg.png)
데코레이터
NestJs에서 중요한 개념이고 다양한 기능들이 데코레이터로 제공된다.
클래스나 속성,메서드,매개변수에 추가 기능을 쉽게 적용할 수 있도록 도와주는 문법이다.
NestJs에서는 데코레이터를 통해 메타데이터를 추가하거나 특정 동작을 부여한다.
C#의 어트리부트와 비슷하고 C#에서는 대괄호 안에 넣는데,
자바스크립트는 @를 앞에 붙여서 사용한다.
아래 코드를 보면 AppController 클래스는 @Controller 데코레이터를 통해 해당 클래스가 컨트롤러 임을 알리고,
@Get 데코레이터를 통해 해당 함수가 Get Http 요청을 처리해야하는 함수인지를 알린다.
@Controller()
export class AppController {
constructor(private readonly appService: AppService) {}
@Get()
getHello(): string {
return this.appService.getHello();
}
}
컨트롤러
Nestjs의 컨트롤러는 라우터의 기능을 하며,
들어오는 요청을 처리하고 클라이언트에 응답을 반환하는 역할을 한다.
클래스를 사용하고, 클래스에 @Controller 데코레이터를 붙여야한다.
해당 데코레이터는 클래스를 필요한 메타데이터와 연결하고 라우터의 기능을 할 수 있게 해준다.
해당 클래스에서 로직을 처리하지는 않으며 요청을 받아서 서비스에서 이루어진 비즈니스 로직을 통해 응답을 반환해주면 된다.
컨트롤러 만들기
nest g controller user
해당 명령어로 컨트롤러를 만들어 보았다.
src 폴더안에 user 폴더가 생기고 그 폴더 안에 컨트롤러 파일이 생긴다.
import { Body, Controller, Get, Param, Post } from '@nestjs/common';
@Controller('user')
export class UserController {
@Get('get')
getUser() {
return 'Get User';
}
@Get('a*b')
getWildCardUser(@Param() param: string) {
return `wildcard route`;
}
@Get('/:id')
getUserId(@Param() param) {
return `User ${param.id}`;
}
@Post('create')
createUser(@Body() body) {
return `Create ${body.id}`;
}
}
테스트를 위한 간단한 코드를 작성했다.
컨트롤러 데코레이터 안에 인자값을 넣으면 경로를 만들 수 있다.
Get, Post 데코레이터도 똑같다.
post 요청을 보내보았는데 통신이 잘 되었다.
모듈
Nestjs는 모듈간의 상호작용을 통해 어플리케이션을 구성한다.
@Module 데코레이터를 사용하고, 이 데코레이터는 어플리케이션 구조를 구성하는데 사용하는 메타데이터를 제공한다.
모듈 만들기
nest g module user
해당 명령어를 통해 유저 모듈을 만들어 주었다.
처음에는 모듈이 비어있으나, 사용하기 위해서는 데코레이터 안에 인자값을 넣어주어야 한다.
모듈 데코레이터를 눌러보면 metadata를 받는데, ModuleMetaData 인터페이스 이다.
그리고 ModuleMetaData 인터페이스는 4가지 속성이 있다.
1. imports
해당 모듈에서 사용할 다른 모듈 목록
2.controllers
이 모듈에서 사용하는 컨트롤러 목록
3. providers
이 모듈에서 사용하는 서비스 목록
4. exports
다른 모듈에서 제공할 서비스나 프로바이더를 공개할 목록
아까는 모듈이 없이 유저 컨트롤러를 추가했기 때문에 앱 모듈에 유저 컨트롤러 까지 담겼다.
유저 모듈은 명령어를 통해 모듈을 추가하니 자동 추가 되었다.
유저 컨트롤러를 지워주고
유저 모듈에 유저 컨트롤러를 추가 해주었다.
서버는 문제없이 작동한다.
서비스
@Injectable() 데코레이터를 사용한다.
해당 데코레이터는 Nest Ioc 컨테이너에서 관리할 수 있는 클래스임을 선언하는 메타데이터를 전달한다.
모듈에서 사용할 수 있게 모듈의 providers의 배열에 넣어주어야 의존성 주입을 통해 서비스 사용이 가능하다.
서비스는 비즈니스 로직을 담당한다.
컨트롤러 -> 서비스 -> 로직 -> 서비스 컨트롤러에 리턴 -> 컨트롤러가 응답 리턴
이런식의 구조가 되어야한다.
서비스 만들기
nest g service user
이미 유저 모듈이 있으면 해당 명령어로 만들었을때 모듈의 providers 배열에 자동 추가된다.
그리고 주입이 가능하다는 @Injectable 데코레이터가 같이 붙어서 나온다.
아까는 임시로 모든 로직을 컨트롤러에 적어놨으니 서비스로 옮겨야 한다.
user.service.ts
import { Injectable } from '@nestjs/common';
@Injectable()
export class UserService {
getUser() {
return 'Get User';
}
getWildCardUser() {
return `wildcard route`;
}
getUserId(param) {
return `User ${param.id}`;
}
createUser(body) {
return `Create ${body.id}`;
}
}
user.controller.ts
import { Body, Controller, Get, Param, Post } from '@nestjs/common';
import { UserService } from './user.service';
@Controller('user')
export class UserController {
constructor(private userService: UserService) {}
@Get('get')
getUser() {
return this.userService.getUser();
}
@Get('a*b')
getWildCardUser() {
return this.userService.getWildCardUser();
}
@Get('/:id')
getUserId(@Param() param) {
return this.userService.getUserId(param);
}
@Post('create')
createUser(@Body() body) {
return this.userService.createUser(body);
}
}
생성자에서 저런식으로 넣어주면 nest가 자동으로 userService를 주입해준다.
유저 서비스 클래스의 @Injectable과 모듈의 providers에 꼭 추가해주어야 이 작업이 이루어진다.
이런식으로 같은 함수명을 굳이 컨트롤러에서 한번 거쳐서 서비스를 통해 리턴하는게 이상하게 보일수도 있지만,
Nest가 권하는 방식이기도 하고 단순 라우팅과 비즈니스 로직을 나눈다는 점이 깔끔한 것 같다.
'서버 > NestJs' 카테고리의 다른 글
[NestJS] TypeORM 과 동적 모듈 (0) | 2024.10.24 |
---|---|
[NestJS] Interceptor (0) | 2024.10.24 |
[NestJs] NestJs 시작하기 (2) | 2024.10.23 |
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!