nestjs는 nodejs의 프레임 워크이면서 모든 nodejs어플리케이션의 초석이 되는 express의 프레임워크이기도 하다.
nestjs는 다른 nodejs의 프레임워크에는 없는 구조를 가지고 있는 장점이 있다.
nodejs의 장점이다 단점은 하고싶은대로 아무것나 할수 있는것이다.
하지만 nest에는 구조와 순서 룰이 있어서 그 룰을 따르기만하면 큰규모의 백엔드를 쉽게 만들 수 있다.
nestjs는 기업에 큰 중점으 두는데 그 이유는 아주 좋은 아키텍처와 구조를 가지고 있고 테스트 하는 방법 또한 잘 구성되어 있다.
우선 npm i -g @nestjs/cli ==>cli는 미리 세팅된 여러 기능들을 가진 새 프로젝트 생성하게 해준다
난 이미 설치 되있으므로 nest -v 로 설치된 버전을 확인해 보고 nest를 입력하여 커맨드의 리스트를 확인해 본다.
nest new [project-name] 로 새로운 프로젝트를 만들어준다.
그리고 명령어로 npm을 선택을한다
그리면 위와 같이 프로젝트에 필요한 패키지들을 설치한다.
그리고 깃허브로 가서 레포지 토리를 만들고
vscode 터미널 상에서
git init
git add
git commit -m '해당 메세지 '
git remote add ' 깃레포지토리 url '로 원격에 연결까지 한다.
그리고 vscode에 가보면 package.json과 tsconfig.json 과 tsconfig.build.json에 많은 스크립트 설정들이 이미 되어있다.
그리고 우선 spec파일을 지운다==>차후 다시 만들것이다.
우리는 start:dev로 시작을 할것이다. ==> npm run start:dev ==> 그러면 nestjs어플리케이션이 성공적으로 시작된다.
그말은 즉슨 http://localhost:3000으로 갈수 있다는 것이다.
nestjs는 main.ts파일을 가진다. 무조건 이 이름이어야 한다.
그러면 이렇게 기본 함수를 가지고 있다.
이 함수는 NestFactory.create(AppModule) 를 호출하고 3000번 포트를 리스닝하고 있다.
그럼 hello world는 어디서 오는 걸까 ?
AppModule로 가면 AppModule이 클래스 인것을 알수 있다.
그리고 데코레이터라는 함수를 발견할 수 있다. 데코레이터는 클래스에 함수 기능을 추가 할 수 있다.
단순히 클래스 위의 함수 이고 클래스를 위해 움직인다고 생각하면 된다.//꼭 클래스와 붙어 있어야 한다.
그리고 controllers로 가보면 Get이라는 데코레이터가 또 보이고 getHello 함수가 있다.
그리고 services로 가보면 Injectable이라는 데코레이터가 있다.
nestjs 어플리케이션은 main,ts에서 모든걸 시작한다. 그리고 하나의 모듈에서 어플리케이션을 생성한다.
Appmodule은 모든 건의 루트 모듈같은것이다.
모듈은 어플리케이션의 일부분이다.(한가지역활을 하는 앱 같은)
예를 들어 인증을 담당하는 어플리케이션이 있다면, 그게 users 모둘이 된다.
컨트롤러가 하는 일은 기본적으로 url를 가져오고 함수를 실행 하는것이다. 즉 express의 라우터 같은
.url를 가져오고 함수를 실행한다.
즉 nestjs는 라우터를 세팅하지 않아도 된다.
컨트롤러에서도 return이 가능한데 왜 service가 있는걸까? ==> 구조와 아키텍처에 대한 이해 필
nestjs는 컨트롤러와 비지니스 로직이랑 구분을 짓고싶어한다.
그리고 컨트롤러 파일과 서비스 파일 appmodule의 데코레이터에 있는 컴트롤러와 프로바이더 모두 지우고 처음부터 프로젝트를 만들어 보고자 한다.
nest cli의 유용한 기능중 하나는 genernate이다.
nest g co 로 컨트롤러를 만들고 이름을 적는다 ==>movies
그러면 movies 폴더내부에 컨트롤러가 생기고 appmoduel의 데코레이터에 자동으로 import된다.
nestjs에서 무언가 필요하면 우리가 요청을 해야한다.
url에 있는 id라는 파라미터를 얻어 movieId라는 agument에 string타입으로 저장하고자 한다.
아래처럼 Body를 받아 올 수도있다.
아래처럼 쿼리를 받아 올 수도 있다.
nest g s 로 서비스를 만들고 이름 역시 movies로 만들어 준다.
그리고 컨트롤러에서 service클래스를 가지게 한다.
그러면 밑에서 this.moviesService.getAll() 사용가능하다.
컨트롤러와 서비스의 파라미터에 타입을 부여하기위해 DTO(Data Transfer Object) 데이터 전송 객체를 만들어 보자
dto는 코드를 더 간결하게 만들어 준다.
그리고 main,ts에 유효성 검사용 파이프를 만든다.(express에서의 미드웨어같은것)
==>npm i class-validator class-transformer
npm i @nestjs/mapped-types ==> 타입을 변환시키고 사용할 수 있게 한다.
Partial Type을 사용하여
앱을 모듈로 분리해서 만들
nest g mo 하고 이름은 역시 movies로 한다. 그러면 아래와 같이 무비 모듈을 임포트한다.
nest g co 이름은 app으로 한다. 그리고 app폴더는 지우고 컨트롤러를 밖으로 꺼낸다.
그리고 app에서는 그냥 홈페이지를 가져오는걸 만든다.
dependency injection
무비 모듈을 보면
그러면 nestjs가 moviesservice를 import하고 controller에 inject한다.
movieservice를 보면 injectable이라는 decorator가 있다.
즉, providers: [MoviesService], 를 안해주면 무비컨트롤러에서 무비 서비스를 필요로한다고 에러를 출력한다.
Unit Testing
==> 1. 모든 function을 따로 테스트 하는것이다. (서비스에서 분리된 유닛을 테스트) ==>함수 하나하나
2. end-to-end(e2e) 테스트 ===> 모든 시스템을 테스팅한다. ==> 이페이지로가면 특정 페이지가 나와야하는 경
package.json를 보면 테스팅과 관련된 스크립트가 5개 정도 있다.
spect.ts는 테스트를 포함한 파일이다.
npm run :cov를 하면 spec.tx 파일들을 찾아 몇줄이 테스팅 되었는지 알려준다.
12.5퍼센트의 fuction 21.43퍼센트의 라인까지, 11-37까지는 테스팅 되지 않았다고 나온다.
npm run test:watch 를 하면 모든 테스트 파일들을 찾아내서 거기서 무스 ㄴ일이 일어나는지 관찰한다.
모든 테스트: a누르기==> 그러면 movies.servies.spec.ts가 테스트를 실행하는걸 볼 수 있다.
movies.service.spec.ts를 테스트해보자
는 테스트하기전에 실행되는것이다.
'모카 스터디 > Nest' 카테고리의 다른 글
Nest JS TypeORM 연동 [John Ahn] (0) | 2023.07.30 |
---|---|
Nest JS DTO 및 Pipe [John Ahn] (0) | 2023.07.30 |
Nest JS 기본 [John Ahn] (0) | 2023.07.30 |
slack_nest_study_zerocho (0) | 2023.05.07 |
NestJS 로그인 JWT발급과 인증 +ndoe쿠키 세션 [John ahn] (0) | 2023.04.10 |