티스토리 뷰
컴퓨터공학과 5584977 이지현
캡스톤디자인(1) TEAM 우연한 인연
#2.5 DTOs and Validation part Two
- 여기서부터는 빨리 공부하기 위해서 영상 보는데 집중.
또 다른 DTO 만들기
- update-movie.dto.ts

파일 만들고 create-movie.dto.ts에 있던 거 복붙하는데 여기서는 읽기 전용이고, 모든 값이 필수는 아니기 때문에 title, year, genres 뒤에 ?를 붙여줌
그리고 Controller와 Service에서 updateData 타입을 UpdateMovieDto로 추가해줌


아까 만든 update-movie.dto.ts는 create-movie.dto.ts의 코드를 그대로 복사했고, 다른 점이 모든 데이터가 필수가 아니라는 점밖에 없다.
그래서 클래스를 extends PartialType() 해주었는데, 이걸 사용하기 위해서 새로 설치

우리 DTO를 변환시킬 수 있게 해준다.
그리고 코드를 아래와 같이 수정

테스트하다가 create-movie.dto.ts에서 genres는 필수가 아닌 값으로 바꾸기 위해 @IsOptional()을 추가

이렇게 하면 movie를 만들 때 title, year로만 만들 수 있고, update할 때 한 값만 바꾸어줘도 정상적으로 바뀐다.
#2.6 Modules and Dependency Injection
우리가 만든 API를 끝내기 전에 앱(모듈)을 조금 더 좋은 구조로 만들어볼 것이다.
(app.module로 되어있어서 앱보다는 모듈이 맞다.)
지금 app.module은 controller(MoviesController)와 provider(MoviesService)를 가지고 있다.
그런데 사실 app.module은 AppController와 AppProvider만 가지고 있어야 한다. 즉, 우리가 만든 MoviesService랑 MoviesController를 movies.module로 옮길 것이다.
NestJS에서 앱은 여러 개의 모듈로 구성되기 때문에 app.module은 AppService랑 AppController만 가져야 한다.
- Terminal(CLI)에서 npm g(enerate) mo(dule)을 통해 movies module을 생성해줌

위에 사진에서 app.module이 UPDATE된 것을 볼 수 있는데

여기서 import { MoviesModule }이 되었고 imports: 에 MoviesModule이 생겼다는 뜻이다.
- app.module.ts 수정

- movies.module.ts

앱을 만들 때 모듈로 분리해야 좋으므로 이런 식으로 module을 분리하는 것이 좋다.
그러면 언제 app.module을 쓰고 Controller와 Provider를 만들면 될까?
1. 먼저, Controller 다시 생성
- nest g(enerate) co(ntroller), name: app


그러면 app.controller.ts 파일이 생성되었다.
그리고 app.controller.ts를 바깥으로 옮기고 app 폴더를 삭제

- app.controller에서는 그냥 홈페이지를 가져오는 일을 시키자
아래와 같이 작성

그 후 localhost:3000으로 확인해보면 아래와 같이 잘 작동한다.

2. NestJS는 dependency injection이라고 부르는 것이 있다. 이것을 공부하기 시작하면 복잡할 수 있는데, 간단하게 providers: []에 service를 작성하면 NestJS가 (ex)MoviesService를 import하고 Controller에 inject하는 것이다.
그래서 우리는 Typescript에서 클래스를 따로 import하지 않고 타입으로만 작성해주어도 코드가 돌아가는 것이다.
MoviesService를 보면 @Injectable()이라는 데코레이터가 있다. 이게 무엇인지는 깊게 얘기하지 않음
그리고 movies.module에서 provider를 삭제하면 에러가 떠서 코드가 실행되지 않음 (MoviesController가 MoviesService를 필요로 한다.는 에러) 우리가 provider를 쓰면 NestJS가 알아서 import해주기 때문에 우리가 따로 할 필요가 없어서 편리한 것이다.
그리고 다음 시간(chater 3)에는 우리가 만든 API를 테스트할 것이다.
#2.7 Express on NestJS
NestJS는 Express 위에서 돌아간다. 그래서 컨트롤러에서 Request, Response 객체가 필요하면 사용할 수 있다.
아래와 같이 @Res or @Req을 사용하면 된다.

이러면 Express 앱에 접근할 수 있다.
하지만 req나 res 같은 Express 객체를 직접적으로 사용하는게 좋은 방법은 아니다.
왜냐하면 NestJS는 기본적으로 Express 프레임워크 위에서 실행하는데 이걸 Fastify로 전환시킬 수 있다. Fastify는 Express보다 2배 빠르다고 한다.
중요한 건 NestJS가 이 두 개의 프레임워크 위에서 동시에 돌아가기 때문에 Express에서 req, res 객체를 많이 사용하지 않는게 중요하다.
NestJS에서 위의 사진처럼 return을 하지 않고 res.json을 사용해도 작동한다. res.json이 Express에서 response 객체를 사용하는 방법이기 때문이다. 하지만 프레임워크를 바꾸고 싶을 때 문제가 될 것이다.
(NestJS 방식만 사용한다면 Express에서 Fastify로 바로 전환할 수 있어서 작동하는 게 멈추지는 않을 것이다. ..)
결론: res, req를 사용하지 않는 걸 추천 (성능 향상을 위해서 Fastify를 사용할 수도 있는데 여기서는 res, req를 지원안해서? 인 것으로 추측)
#3 UNIT TESTING
#3.0 Introducing to Testing in Nest
package.json 파일을 보면 테스팅과 관련된 스크립트가 5가지 정도 있다.

jest: 자바스크립트를 아주 쉽게 테스팅하는 npm 패키지 (NestJS가 기본설정을 다 해놓았다)
우리가 지금까지 생성한 파일을 보면 .spec.ts가 붙은 파일들이 테스트를 포함한 파일이다.
ex. movies.service.spec.ts: movies.service를 테스팅하는 파일
ex. movies.controller.ts라는 파일을 테스팅하고 싶다면 movies.controller.spec.ts라는 파일이 있어야 한다.
NestJS에서는 jest가 .spec.ts 파일들을 찾아볼 수 있도록 설정되어 있다.
우리는 코드가 얼마나 테스팅됐는지, 혹은 안됐는지 알려주는 cov(coverage)라는 스크립트를 실행할 것이다.
console에서 npm run test:cov 하면 모든 spec.ts 파일을 찾아서 몇 줄이 테스팅됐는지 알려준다.
- npm run test:cov

강의에서는 All files의 movies.service.ts열만 나오는데, 강의와 movies.service.ts 내용이 동일하고 다른 것은 0이므로 그냥 출력에서만 다른 것이라고 생각함
movies.service.ts에서 12.5%의 function, 21.42%의 line, 그리고 12-44 line은 테스팅되지 않았다고 나온다.
이제 watch mode(test:watch)에서 테스팅을 돌려볼 것이다.
- npm run test:watch
모든 테스트 파일을 찾아내서 거기서 무슨 일이 일어나는지 관찰하는 것

위의 사진에서 모든 테스트를 실행하려면 a를 누르라고 되어있으므로 a를 눌러보자.

그러면 movies.service.spec.ts가 테스트를 실행하는 것을 볼 수 있다. 잘 작동되었다.
테스트 몇 개를 더 추가할건데, 이것은 (방금 한 test:watch로 추정) 유닛(단위) 테스팅이라는 것이다.
유닛 테스팅: 모든 function을 따로 테스트하는 것
테스팅 종류에는 두 가지 테스트가 있는데, 그 중 하나가 유닛 테스팅이다. 서비스에서 분리된 유닛을 테스트하는 것을 말한다. 또 다른 하나는 end-to-end(e2e) 테스트인데, 이건 모든 시스템을 테스팅하는 것이다.
package.json을 보면 e2e라는 스크립트가 있다.
예를 들어, 유닛 테스팅은 getAll() function 하나만 테스트하고 싶던지 getOne() function 하나만 테스트하고 싶을 때 사용한다.
e2e 테스팅은 이 페이지로 가면 특정 페이지가 나와야하는 경우에 사용한다. 유저 스토리같은 것으로 사용자 관점에서 보는 것이다. (사용자가 특정 링크를 클릭하면 이 링크를 볼 수 있어야 한다. 라는 것을 테스트) 사용자가 취할만한 액션들을 처음부터 끝까지 테스트하는 것이다.
우리는 먼저 유닛 테스팅을 사용해서 MoviesService를 테스트할 것이다.
이 말은 getAll, getOne, deleteOne, create, update function을 테스팅한다는 것이다. (5개의 함수를 에러를 포함해서 테스트)
테스트는 다음 영상에서
#3.1 Your first Unit Test
'캡스톤디자인(1) > 공부' 카테고리의 다른 글
| 캡스톤디자인(1) NestJS 공부 3 (0) | 2022.11.04 |
|---|---|
| 캡스톤디자인(1) - NestJS 공부2 (0) | 2022.10.14 |
| 캡스톤디자인(1) - NestJS 공부 1 (0) | 2022.10.13 |
