nestjs api 만들기 1부

JaeGu Jeong·2022년 12월 31일
0

기본환경 설정

터미널에 "npm i -g @nestjs/cli" 를 입력하여 nestjs설치.
터미널에 "nest new"를 입력하여 프로젝트 폴더를 생성.
src폴더에 main.ts가보이는지 확인.
"npm run start:prod"을 터미널에 입력 후 브라우저에서 localhost:3000 접속해서 hello world가 보이면 준비완료.

컨트롤러 만들기

nestjs는 간단한 명령어로 만들고 싶은 컨트롤러의 틀을 자동 생성 할 수 있다.
nest g c 명령어를 터미널에 입력하면 컨트롤러의 이름을 물어보는데 임의로 movies로 생성.
이때 지정한 movies는 localhost:3000에서 엔트리포인트가 된다.
즉, movies컨트롤러에 데코레이터로 "@Get('search')"을 만들면 localhost:3000/search가 아니라 localhost:3000/movies/search로 접속이 가능하다.

SRP(Single Responsibility Principle)

객체 지향 프로그래밍에서 단일 책임 원칙이란 모든 클래스는 각각 한 관심사에 집중하도록 유지하는 것이다. 각 클래스는 맡은 관심사에 대해서 완전캡슐화를 지향한다. 이유는 의존성을 줄여 보수하기 편하게 만드는데에 있다.
예를 들어 휴대폰에 "충전기능"과 "베터리상태표시기능"이 하나의 클래스에 정의되어있다면 같은 맴버변수를 쓰도록 설계되어 있을 확률이 크기 때문에 충전기능쪽에 문제가 생겨 업데이트가되면 베터리표시기능에 영향을 주기 쉽다. 반대의 경우도 성립한다. 때문에 비슷한 기능이여도 클래스는 하나의 목표에 집중하도록 설계하는 것이 의도치않은 동작을 예방 할 수 있고, 유지보수하기도 편리하다. 너무 과하면 가독성이 떨어진다는 글을 보았는데 적당히 "지향"정도만 해줘도 핵심목표인 유지보수조건을 충족 할 수 있다.

개체(entity) 만들기

서비스를 만들기 전에 로직에서 사용 할 개체를 정의해야 한다.
movie.entity.ts라는 파일을 만들고 아래와 같이 사용할 개체를 정의한다.

export class Movie {
	id : number;
    title : string;
    year : number;
    genres : string [];
}

서비스 만들기

nestjs는 간단한 명령어로 만들고 싶은 서비스의 틀 또한 자동 생성 할 수 있다.
nest g s 명령어를 터미널에 입력여 컨트롤러와 동일한 movies로 생성.
movies.service.ts파일이 생성되었는지 확인한다.
모듈.ts파일도 확인해보면 nestjs가 자동으로 코드를 추가하여 연결해 주었을 것이다.

ValidationPipe

useGlobalPipes함수를 사용해서 개발자가 이용하고싶은 파이프를 프레임워크에 적용시킬 수 있다. 미들웨어와 같은 기능이라고 보면된다.
ValidationPipe는 인자의 유효성검사를 도와주는 파이프이다.
이 기능을 사용하기전에 "npm i class-validator class-transformer"명령으로 사용가능하도록 로컬에 설치한다.
이제 dto의 각 변수들에 @IsString() 또는 @IsNumber(), @IsString({each : true})를 데코레이터로 달아준다.
그럼 이 클래스를 사용 하는 로직에서 주고받는 데이터 형태가 다르면 json응답에 message로 어떠한 인자에 문제가 생겼는지를 받을 수 있게 된다.

whitelist

ValidationPipe의 옵션 중 하나로 true로 설정하면 데코레이터가 정의되지 않은 인자는 무시해버리는 옵션이다.
추가로 forbidNonWhitelisted옵션을 true로 주면 기대값이 없는 인자의 요청을 거부 하도록 설정 할 수 있다.

transform

기본적으로 브라우저의 쿼리는 string으로 전송된다. 정수값으로 사용하려면 데이터를 받고 백엔드 단에서 한번 자료형을 변환하고 사용해야한다.
이 때 ValidationPipe의 옵션 중 하나인 transform을 true로 사용하면 자동으로 컨트롤러에서 기대하는 타입으로 인자의 자료형을 치환하여 처리 할 수 있게된다.

profile
BackEnd Developer

0개의 댓글