Nest.js 공부정리 - 기본 - 서비스, CRUD, 유효성 검사
서비스
서비스파일은 지난번에 올린 명령어 목록에도 찾을 수 있다.
아무튼 파일 생성 명령어는 아래와 같다.
npx nest g s
이걸 입력하고 시간이 지나면 이름을 입력해달라고 뜰 것이다.
지난번 처럼 이번에도 이름은 movies로 할 것이다.
파일이 자동적으로 추가되었다.
spec은 테스트 파일이므로 지금은 무시하자.
app.module 파일 또한 새로 생성된 파일에 맞추어 변화된 것을 알 수 있다.
보시다시피 MoviesService가 추가되었다.
서비스에서는 데이터베이스를 처리하는 코드를 작성할 것이다.
작성하기에 앞서 우선 가짜 DB를 만들기 위해 Movie라는 클래스를 새로운 파일에 만들어주자
Movie 클래스를 만들어주고
서비스 파일에 적용하자
자 이제 서비스파일에서 데이터 베이스를 컨트롤하도록 코드를 구성할 것이다.
여기서 주의해야 할 것은 지금 하고 있는 것은 진짜 데이터베이스를 만드는건 아니라는 것이다.
Movie라는 클래스는 어디까지나 가짜 DB에 불과하다.
만약 진짜 DB를 만드려면 SQL 쿼리문을 써야겠지만 이에 대해선 나중에 다뤄볼 생각이다.
우선 서비스 파일에 데이터를 모두 가져오는 것과 하나만 가져오는 코드를 작성했다
그리고 컨트롤 파일에 서비스 파일에 있는 getAll 함수를 사용할 수 있도록 세팅한다.
여기서 조심해야 하는 것이 바로 getAll에서 Movie를 반환해주기 위해서
위의 import를 추가해주어야 한다는 것이다.
보통 자동으로 추가되지만 나는 수동으로 해주어야 했다.
getAll을 추가해주었다면 getOne도 추가해주자
이제 데이터 전체를 가져오는 명령과 데이터 하나만을 가져오는 명령을 추가했다.
이제 CRUD 중에서 R을 했으니 나머지 CUD를 해보자
자 이제 잘 작동하는지 확인해보자
포스트 기능이 잘 작동하고
Get 기능 또한 잘 작동한다.
당연하겠지만 어디까지나 가짜DB인 만큼 서버를 다시 실행하면 이 내용은 날아간다.
예외처리
위 코드에서 언급하지 않은 부분이 있는데
서비스 파일의 getOne부분이다.
만약 누군가가 URL로 없는 id를 요청할 경우, 이 코드는 제대로 작동하지 않을 것이다.
고로 최소한 예외처리라도 해보도록 하자.
서비스 파일의 getOne의 부분이다.
만약 입력받은 id가 없다면 에러를 내보내도록 설정했다.
이상한 id 번호를 가져오자 에러가 뜨는 모습이다.
유효성 검사
만약 데이터 수정이나 생성을 할때, title이나 year과 같은 우리가 정한 데이터가 아닌 다른 데이터를 넣으려 할 경우
이를 막는 장치가 필요하다.
이를 위한 것이 바로 유효성 검사이며 이를 위해 패키지를 설치하자
npm i class-validator class-transformer
우선 이 패키지를 쓰기 위해서 main.ts 파일을 살짝 수정하자
그 다음 검증파일을 만들기 위해 create-movie.dto.ts라는 파일을 만들고 다음과 같이 작성한다.
보시다시피 내가 써야할 데이터가 들어가 있으며
이 파일의 데코레이터들이 유효성 검사를 해줄 것이다.
파일의 최상단에서 CreateMovieDto를 임포트 해주고 (자동으로 될 수도 있다.)
필요한 부분에 CreateMovieDto 타입을 부여해주면 이로써 검증과정이 끝난다.
자, 그럼 확인해보자
되도않는 뻘 데이터를 포스트하자 에러가 뜨면서 뭐가 잘 못 되었는지를 말해준다.
검증 그 외
이 검증 패키지에는 다양한 옵션이 있다.
사용 방법은 아래 사진을 보도록하고 이 키워드들이 다 뭔지 알아보겠다.
whitelist: 아무런 데코레이터도 없는 속성을 거른다. 즉, 이상한 데이터를 보내면 거르겠다는 뜻
forbidNonWhitelisted: 존재해선 안 되는 속성을 아예 막겠다는 뜻이다.
transform: 이름에도 유추할 수 있듯 이것은 데이터를 변환해주는 것이다.
우리가 URL에서 param 값을 받아오면 이건 기본적으로 string이다.
그러나, 지금 이 프로젝트 같은 경우, id가 string일 이유가 없으며 number여야 한다.
이때, number로 변환해주기위한 옵션이 바로 transform이다.
메인 파일을 아래 처럼 수정하자
자 그리고 컨트롤러와 서비스 파일에서, Param의 값의 타입을 string에서 number로 바꿔주자
Patch 메소드도 바꾸어 보자
우선 타입을 변환시키고 사용할 수 있게 해주는 패키지를 설치하자
npm i @nestjs/mapped-types
앞서 우리는 파일 생성시에만 유효성 검사를 했는데
이번엔 파일 수정시에도 필요한 유효성 검사를 해볼 생각이다.
그러나 파일 생성시 사용했던 것을 거의 똑같이 응용해서 사용할 수 있다.
update-movie.dto.ts
생성dto파일과는 다르게 아주 심플한데
이는 생성dto 파일을 그대로 가져왔기 때문이다.
create-movie.dto.ts
생성dto 파일도 약간 바꾸어 주었다.
이렇게 만들어진 것들을 컨트롤러 파일과 서비스 파일에서 필요한 부분에 넣어주자
참고로 상단에 import 하는 것을 잊지말자