Slack 클론 코딩 [백엔드 with NestJS + TypeORM] 수강 정리 - 섹션1

dowon kim·2022년 10월 11일
0

컨트롤러를 만들기 전에 모듈을 먼저 만든다.

nest generator를 이용하여 만들 경우 파일 생성과 동시에 모듈을 업데이트 해주는 편의성을 제공한다.

모듈 생성 : nest g mo [moduleName]

서비스 생성 : nest g s [serviceName]

컨트롤러 생성 : nest g co [controllerName]

컨트롤러와 서비스는 req,res에 대해 몰라도 되게끔 코딩하는 것이 바람직하다.
[의존성 주입이 효율적으로 적용되어 결합성이 강하지 않은 코드를 짜기 위해]

가급적 Nest를 쓸때 기반이 되는 프레임워크를 알아야 하고 의존해야하는 방식의 코드가
나오지 않게끔 설계해야 프로젝트를 다른 프레임워크로 이전할때 유리하다.

Nest의 네이밍 컨벤션 :
1. Nest에서는 파일명의 템플릿을 점을 찍어 준수해준다. (join.request.dto.ts)

  1. Nest에서는 클래스파일을 나눌때 export default 보다 export class를 선호하고 이로 인해
    import를 할때 반드시 중괄호를 넣어주어야 한다.

  2. interface보다 class를 사용한다.
    interface는 타입스크립트 에서만 지원하는 기능이지만 class는 js의 정식 문법이기에 런타임에서도
    날아가지 않고, js코드로 컴파일 된 이후에도 validation(타입검증)을 수행할 수 있다.

@Query 어노테이션을 통해 컨트롤러에 구현하는 매서드의 매개변수에 쿼리를 불러올 수 있으며,

getChat(@Query() query) { console.log(query.perPage, query.page); };
이렇게 쿼리를 객체로 통째로 불러오거나,
getChat(@Query('perPage') perPage , @Query('page') page) {console.log(perPage, page); };
쿼리객체안의 변수를 직접 지정하여 가져올 수도 있다.

@Param 어노테이션을 통해 전달된 파라미터를 메서드안에서 인자로 받을 수 있다.
getChat(@Query() query , @Param() param) { console.log(query.perPage, query.page , param.id , param.url); };

@Body 어노테이션을 통해 body값을 받아올 수 있다.
postUsers(@Body() data: JoinRequestDto) { this.userService.postUsers(data.email, data.nickname, data.password);};

api를 설계할때 실수를 하지 않도록 주의한다. 잘못 설계된 api는 실제 서비스가 된 이후에는 구조의 일부를

바꾸기 굉장히 어렵다.

nest는 api문서를 만들기 위해 어노테이션으로 타입을 지정하여 쉽게 swagger로 넘겨줄 수 있지만 ,
express는 자유도가 높은 대신 타이핑을 지정해주기 어려움이 있어 api문서 자동생성이 불가능하다.

swagger를 통해 자동으로 생성되는 api문서에 몇가지 어노테이션을 통해 디테일한 설명을 입력할 수 있다.

@ApiOperation : 각 매서드의 설명들을 옵션을 통해 입력한다.
@ApiProperty : 가져온 객체의 프로퍼티에 대한 설명을 옵션을 통해 입력한다.
(example : 예시 , description : 프로퍼티에 대한 설명 , required : 필수여부)
@ApiQuery : 가져온 쿼리의 요소에 대한 설명을 옵션을 통해 입력한다.
(name: 요소명 , description : 프로퍼티에 대한 설명 , required : 필수여부)
@ApiParam : 가져온 파라미터에 대한 설명을 옵션을 통해 입력한다.
(name: 파라미터명, description : 프로퍼티에 대한 설명 , required : 필수여부)
@ApiTag : 공통된 api주소들을 묶어준다.
@ApiResponse : 각 응답에 대한 설명들을 옵션을 통해 입력한다.
(status : 응답코드 , description : 응답설명 , type : Schema 정보에 들어갈 클래스)

한 프레임워크에 종속되지 않고 타이핑을 용이하게 하기 위해 커스텀 데코레이터를 사용 할 수 있다.
createPramDecorator 클래스의 생성자를 통해 data 와 실행컨텍스트를 매개변수로 받아
nest에서는 한 서버 안에서 웹소켓이나 http서버 rpc서버를 동시에 사용 가능 하므로 ,
그안에서 원하는 형태의 원하는 요소를 리턴값으로 반환 시킬 수 있다.

인터셉터는 요청과 응답을 가로채서 중간에서 변형을 줄 수 있는 컴포넌트이며,
1. 메서드 실행 전/후 추가 로직 바인딩
2. 함수에서 반환된 결과를 변환
3. 함수에서 던져진 예외를 변환
4. 기본 기능의 동작을 확장
5. 특정 조건에 따라 기능을 완전히 재정의(예: 캐싱) 등을 위해 사용한다.

작성한 인터셉터를 @UseInterceptors() 어노테이션을 통해 사용 할 수 있으며 ,
어노테이션 적용 위치에 따라 적용되는 범위를 직접 조정할 수 있다.

profile
The pain is so persistent that it is like a snail, and the joy is so short that it is like a rabbit's tail running through the fields of autumn

0개의 댓글