-> 어느정도 정형화된 백엔드 규칙을 따르고 있다!
기능 또는 비즈니스 로직을 관리하는 집합체. 주로
providers, controllers, import, exports 정도가 포함된다.
어플리케이션의 특정 기능을 캡슐화
예를 들어, 사용자 관리, 상품관리, 주무처리 등 특정 기능에 대해 컨트롤러에 등록
전반적으로 공통적으로 쓰는 기능을 제공
DB 접속이라던지, 로깅, 인증 등 각각의 feature modules에서 쓸 수 있는 공통 기능의 집합
API 엔트포인트를 관리 -> 평소에 알던 그 컨트롤러
여러 데코레이터로 기능을 손쉽게 추가할 수 있음!
DI와 엮어서 이해하는게 편함..
특정 클래스가 의존하고 있는 다른 클래스나 컴포넌트를 직접 만드는 것이 아닌, 외부에서 주입받아 사용하는 방식.
모듈간의 결합도를 낮추고, 유연성과 재사용성을 높이고자 고안
수월한 단위테스트가 가능
동작방식
Ex)
@Controller('cats)
export class CatsController {
constructor(private catsService: CatsService){}
@Post()
async create(@Body() cat:Cat){
this.catsService.create(cat);
}
@Get()
async findAll(): Promise<Cat[]>{
return this.catService.findAll();
}
}
직접 서비스를 구현한 것이 아닌, constructor를 통해서 서비스를 주입받는 것을 볼 수 있다. 유닛테스트때 모의 객체를 만들면 쉽게 테스트가 가능하다.
하지만, module에 provider에 명시되지 않은 service는 등록할 수 없다.
여러 파일들이 존재해서 모르겠지만,
일단은 케밥케이스!!!
운영체제에 따른 대소문자 구분을 피할 수 있어서 좋다.
ex) user-profile.controller.ts
보통 클라이언트에서 오는 요청이 바로 컨트롤러로 도달하지는 않는다. 그 중간에 여러 단계를 거치면서, 유효성 검사든, 데이터 변환이던, 어떤 일련의 테스트들을 통과해서 컨트롤러에 닿게 된다. 그때, 마주치는 것이 바로 필터와 파이프이다.
파이프에선 특히 유효성 검사와 데이터 변환에 초점을 두고 있다. 그리고, 가장 중요한 로그인, jwt를 사용한 인증/인가에 활용되고 있다. 네스트에서는 기본적으로 여러 파이프를 지원하고 있다.
dto에 맞는 값이 들어오는지 확인하는 파이프이다.
말그대로 대개 스트링으로 들어오는 숫자들의 타입변환을 해주는 파이프이다.
뭐 이런 기능들이 있다.
좀 더 편한 코딩 스타일을 제공해 주는데, 클래스 데코레이터, 매개변수 데코레이터, 메서드 데코레이터 같은 것들이 있다.