Typescript
[NestJS] Providers, Service, PIPE 등 기본 개념에 대해 알아보자
keep it simple
2023. 4. 3. 03:43
Providers란?
- Nest의 기본 개념. 대부분의 기본 Nest 클래스는 서비스, 리포지터리, 팩토리, 헬퍼등 프로바이더로 취 급된다. 프로바이더의 주요 아이디어는 종속석으로 주입할 수 있다.(스프링으로 따지면 bean 개념) 객체는 서로 다양한 관계를 만들 수 있으며 객체의 인스턴스를 "연결"하는 기능은 대부분 Nest 런타임 시스템에 위임될 수 있다.
Service란?
- NestJS에서 서비스란 @Injectable 데코레이터로 감싸져서 모듈에 제공되며, 이 서비스 인스턴스는 어플리케이션 전체에서 사용 될 수 있다. 밑과 같이 boardsService를 controller에서 constructor를 사용하여 dependency injection(의존성 주입)을 해준다.
@Controller('boards')
export class BoardsController{
constructor(private service:BoardsService){}
@Get('/:id')
getBoardById(@Param('id') id: string): Board {
return this.service.getBoardById(id);
}
}
@Injectable()
expot class BoardsService{}
DTO 클래스 적용하기
- 클래스는 인터페이스와 다르게 런타임에서 작동하기 때문에 파이프 같은 기능을 이용할 때 더 유용하다. 밑과 같이 사용가능하다. Board 엔티티로 변경해준 후 DB에 저장하면된다.
DTO
export class CreateBoardDto{
title: string;
description: string;
}
Service
CreateBoard(dto: CreateBoardDto){
const { title, description } = dto;
const board:Board = {
id: uuid(), // 고유값 임의로 설정
title,
description,
status: BoardStatus.Public
}
}
Pipe은 무엇인가요?
- 파이프는 @Injectable() 데코레이터로 주석이 달린 클래스이다. data transformation, data validation을 위해 사용된다. Nest는 메소드가 호출되기 직전에 파이프를 삽입하고 파이프는 메소드로 향하는 인수를 수신하고 이에대해 작동한다. 간단하게 말하면 client에서 controller로 가기전 검증/ 데이터를 변환 해준다.
- Data Transformation: 입력 데이터를 원하는 형식으로 변환 ( String -> Integer)
- Data Validation: 데이터가 유효하고 검증되엇는지 판단.
사용방법
- Handler-level Pipes : 핸들러 레벨에서 @UsePipes() 데코레이터를 이용해서 사용 가능하다. 모든 파라미터에 적용된다.
@Post()
@UsePipes(pipe)
createBoard(
@Body('title') title,
@Body('description') description
){
}
- Parameter-level Pipes: 특정한 파라미터에만 적용이 되는 파이프이다.
@Post
createBoard(
@Body('title', ParameterPipe) title
){
}
- Global Pipes: 글로벌 파이프로써 어플리케이션 레벨의 파이프다. 클라이언트에서 들어오는 모든 요청에 적용이된다. main.ts에 적용하면 된다.
async function bootstrap(){
const app = await NestFactory.create(AppModule);
app.useGlobalPipes(GlobalPipes);
await app.listen(3000);
}
bootstrap();
결론
- 평소에 스프링으로 개발을 해오다 nestJS 프레임워크도 스프링과 개념이 매우 유사한거 같다. 이번에 새로들어가는 서비스는 NestJS기반이여서 기본 개념에 대해서 공부했다.
reference
- https://www.youtube.com/watch?v=9DmorFYl44M