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