August 01, 2021
Nest.js
를 이용해서 간단한 API GET /books/:id
를 만들어볼 생각이다 (테스트 주도 개발 방법론을 적용한다)
Nest.js
의 3 레이어 아키텍처(Controller-Service-Repository
)를 지켜가며 코딩해보겠습니다
Repository: Data Access Layer
일단 뼈대를 생성한다 (컨트롤러, 서비스 파일 생성)
controller.getBook(id)
테스트 코드 작성
service.getBook(id)
가 x를 리턴하도록 mockupservice.getBook(id)
가 x를 리턴할때 컨트롤러는 성공service.getBook(id)
함수헤더정도만 작성service.getBook(id)
함수를 컨트롤러 내부에서 호출하도록 코드 작성service.getBook(id)
테스트 코드 작성
repository.findOne(id)
가 x를 리턴하도록 mockuprepository.findOne(id)
가 x를 리턴할때 컨트롤러는 성공repository.findOne(id)
함수를 서비스 내부에서 호출하도록 코드 작성
뼈대를 만들기 위해, 위 파일을 새로 생성해준다.
nest g mo books // module 추가
nest g co books // controller 추가
nest g s books // service 추가
- service.getBook(id) 가 x를 리턴하도록 mockup
- service.getBook(id)가 x를 리턴할때 컨트롤러는 성공
아직 controller, service에 구현한게 없으니 에러 발생
- service.getBook(id) 함수헤더정도만 작성
- service.getBook(id) 함수를 컨트롤러 내부에서 호출하도록 코드 작성
Service에 구현한게 없어 에러 발생
Any Type대신 Book Type을 만들까 생각했지만… 이후 수정하도록 하겠다.
이제 test가 성공하도록, 최소한의 구현을 마쳤다. (에러도 모두 사라졌을것이다.)
- repository.findOne(id)가 x를 리턴하도록 mockup
- repository.findOne(id)가 x를 리턴할때 컨트롤러는 성공
마찬가지로, 미구현 상태임으로 에러가 발생
이번엔 약간 특이하게 typeorm
관련 세팅을 해줘야 한다.
books.entity.ts
(커스텀 레퍼지토리) books.repository.ts
books.module.ts > imports
이 외에도 npm install
등등 있지만 생략하겠다.
- repository.findOne(id) 함수를 서비스 내부에서 호출하도록 코드 작성
이제 test가 성공하도록, 최소한의 구현을 마쳤다. (에러도 모두 사라졌을것이다.)
BooksRepository
를 provider
에 넣어줘야한다.
상당히 심플하게 구현해보았다.
더 나아가 Fail에 대한 테스트, Validator등 여러가지 테스트를 추가해보자!
참고로 Repository에 대한 Test도 추가할 수 있을것이다.