NestJS로 배우는 백엔드 프로그래밍 : 타입스크립트 환경의 차세대 서버 프레임워크를 만나다
Description
가장 진보한 프레임워크로 우아하게 백엔드 입문하기
NestJS는 Express를 기반으로 DB, ORM, 유효성 검사 등의 라이브러리를 내장한 차세대 백엔드 프레임워크다. 제어 반전, 의존성 주입, AOP 등 객체 지향 개념을 도입했고 타입스크립트로 모듈/컴포넌트 기반의 프로그래밍을 할 수 있다. 이 책은 저자가 모두싸인에 몸담으며 익힌 노하우와 인사이트를 바탕으로 NestJS를 활용해 회원 가입, 이메일 인증, 로그인, 회원 정보 조회 기능을 갖춘 REST API 유저 서비스를 만들어본다. 프로젝트에 점차 살을 붙여나가며 백엔드 개발에 필요한 환경 변수 설정, 요청 유효성 검사, 인증(JWT), 로깅, 헬스 체크, CQRS, 클린 아키텍처, 단위 테스트 등 지식과 기술을 제대로 익힐 수 있게 집필했다.

저자

한용재

저자:한용재
오랜기간휴대폰에탑재되는소프트웨어를만들다현재는모두싸인에서백엔드엔지니어로활동중이다.모토는일신우일신(日新又日新)이고영화와교양과학서적을좋아한다.

목차

베타리더후기x머리말xii이책에대하여xiii

CHAPTER1HelloNestJS1
1.1NestJS의장점1
1.2Express가좋을까,NestJS가좋을까2
1.3NestJS설치6
__1.3.1Node.js설치6/1.3.2NestJS프로젝트생성7
1.4책에서만들애플리케이션:유저서비스9

CHAPTER2웹개발기초지식13
2.1웹프레임워크13
2.2Node.js16
2.3이벤트루프18
2.4패키지의존성관리21
__2.4.1package.json21/2.4.2package-lock.json23/2.4.3package.json파일분석23
2.5타입스크립트25
__2.5.1변수선언26/2.5.2타입스크립트에서지원하는타입27
__2.5.3타입정의하기29/2.5.4타입구성하기30
2.6데커레이터32
__2.6.1데커레이터합성34/2.6.2클래스데커레이터35/2.6.3메서드데커레이터36
__2.6.4접근자데커레이터38/2.6.5속성데커레이터39/2.6.6매개변수데커레이터40
__2.6.7데커레이터요약42
쉬어가는페이지백엔드로드맵43

CHAPTER3애플리케이션의관문:인터페이스45
3.1컨트롤러45
__3.1.1라우팅47/3.1.2와일드카드사용48/3.1.3요청객체48/3.1.4응답49
__3.1.5헤더52/3.1.6리디렉션54/3.1.7라우트매개변수55
__3.1.8하위도메인라우팅56/3.1.9페이로드다루기58
3.2유저서비스의인터페이스59
쉬어가는페이지관점지향프로그래밍64

CHAPTER4핵심도메인로직을포함하는프로바이더65
4.1프로바이더65
4.2프로바이더등록과사용67
__4.2.1프로바이더등록67/4.2.2속성기반주입67
4.3유저서비스에회원가입로직구현하기70
__4.3.1UsersService프로바이더생성70/4.3.2회원가입71
__4.3.3회원가입이메일발송73/4.3.4이메일인증77
__4.3.5로그인77/4.3.6유저정보조회78
쉬어가는페이지스코프79
심화학습1커스텀프로바이더82

CHAPTER5SW복잡도를낮추기위한모듈설계91
5.1모듈:응집성있는설계91
__5.1.1모듈다시내보내기92/5.1.2전역모듈94
5.2유저서비스의모듈분리95
__5.2.1UsersModule분리95/5.2.2EmailModule분리96

CHAPTER6동적모듈을활용한환경변수구성99
6.1동적모듈99
6.2dotenv를이용한Config설정99
6.3Nest에서제공하는Config패키지102
6.4유저서비스에환경변수구성하기105
__6.4.1커스텀Config파일작성105/6.4.2동적ConfigModule등록106
쉬어가는페이지의존성주입과제어반전110

CHAPTER7파이프와유효성검사:요청이제대로전달되었는가113
7.1파이프113
7.2파이프의내부구현이해하기116
7.3유효성검사파이프만들기117
7.4유저서비스에유효성검사적용하기120
__7.4.1유저생성본문의유효성검사120/7.4.2class-transformer활용121
__7.4.3커스텀유효성검사기작성124
쉬어가는페이지인증vs인가127

CHAPTER8영속화:데이터를기록하고다루기131
8.1MySQL데이터베이스설정131
8.2TypeORM으로데이터베이스연결134
8.3회원가입을요청한유저의정보저장하기138
8.4트랜잭션적용141
__8.4.1QueryRunner를사용하는방법142
__8.4.2transaction함수를직접이용하는방법143
8.5마이그레이션144
쉬어가는페이지저장소패턴151

CHAPTER9요청처리전에부가기능을수행하기위한미들웨어153
9.1미들웨어153
9.2Logger미들웨어154
9.3MiddlewareConsumer155
9.4전역으로적용하기157

CHAPTER10권한확인을위한가드:JWT인증/인가159
10.1가드159
10.2가드를이용한인가160
__10.2.1실행콘텍스트160/10.2.2가드적용161
10.3인증162
__10.3.1세션기반인증163/10.3.2토큰기반인증164
10.4JWT165
__10.4.1헤더166/10.4.2페이로드166/10.4.3시그너처167
10.5유저서비스의이메일인증처리와JWT발급169
__10.5.1회원가입이메일인증169/10.5.2로그인172
__10.5.3JWT인증:회원정보조회173/10.5.4가드를이용한인가처리175
쉬어가는페이지슬라이딩세션과리프레시토큰178
심화학습2커스텀매개변수데커레이터181
심화학습3메타데이터(Reflection클래스)186

CHAPTER11로깅:애플리케이션의동작기록193
11.1내장로거194
__11.1.1로깅비활성화195/11.1.2로그레벨지정195
11.2커스텀로거196
__11.2.1커스텀로거주입해서사용하기197/11.2.2커스텀로거를전역으로사용하기198
__11.2.3외부로거사용하기198
11.3유저서비스에winston로거적용하기199
__11.3.1nest-winston적용199/11.3.2내장로거대체하기202
__11.3.3부트스트래핑까지포함하여내장로거대체하기204
__11.3.4로그전송을다양하게206

CHAPTER12모든것은항상실패한다:예외필터209
12.1예외처리209
12.2예외필터214
12.3유저서비스에예외필터적용하기217

CHAPTER13인터셉터로요청과응답을입맛에맞게바꾸기219
13.1인터셉터219
13.2응답과예외매핑222
13.3유저서비스에인터셉터적용하기224
쉬어가는페이지요청생명주기226

CHAPTER14태스크스케줄링229
14.1@nestjs/schedule패키지229
14.2태스크스케줄링을선언하는3가지방식230
__14.2.1크론잡선언방식230/14.2.2인터벌선언방식232/14.2.3타임아웃선언방식233
14.3동적태스크스케줄링233

CHAPTER15헬스체크:댁의서버는건강하신가요237
15.1Terminus적용238
15.2헬스체크238
15.3TypeOrm헬스체크240
15.4커스텀상태표시기241

CHAPTER16CQRS를이용한관심사분리247
16.1CQRS패턴247
16.2유저서비스에CQRS적용하기249
__16.2.1커맨드249/16.2.2이벤트251/16.2.3쿼리254

CHAPTER17클린아키텍처257
17.1클린아키텍처259
17.2SOLID객체지향설계원칙261
17.3유저서비스에클린아키텍처적용하기262

CHAPTER18테스트자동화273
18.1소프트웨어테스트273
18.2Nest의기본테스트프레임워크:Jest와SuperTest276
18.3Jest를이용한단위테스트예시276
18.4유저서비스테스트279
18.5테스트커버리지측정287

APPENDIXormconfig.json동적생성291

찾아보기295

출판사 서평

차세대프레임워크와함께더강력한Node.js서버사이드애플리케이션구축하기

Express.js가전부는아니다.백엔드프레임워크도진화하고있다.국내에서도모두싸인과당근마켓등에서사용하는NestJS는‘효율적이고신뢰할수있으며확장가능한서버사이드애플리케이션구축’을내세운차세대프레임워크다.Fastify또는Express위에DB,ORM,유효성검사등을내장했고,제어반전,의존성주입,AOP같은객체지향개념을도입했으며,무엇보다타입스크립트를사용해우아하게모듈/컴포넌트기반의프로그래밍을할수있다.

이책은NestJS예제프로젝트로회원가입,이메일인증,로그인,회원정보조회기능을갖춘RESTAPI유저서비스를처음부터끝까지만들어본다.이런단순한프로젝트라도제대로만들려면환경변수설정,요청유효성검사,인증/인가,로깅,헬스체크,CQRS,클린아키텍처,단위테스트등알아야할지식과기술이많다.이에프로젝트에차근차근살을붙여나가며,이러한백엔드개발에필요한지식과기술을코드로익힐수있게집필했다.

저자가모두싸인에몸담으며익힌노하우와인사이트를바탕으로,NestJS의핵심기능과원리를충실히설명하는동시에가용성,복원성,확장성을갖춘시스템을구축하기위한단단한초석을제공한다.

주요내용
Node.js,이벤트루프,타입스크립트데커레이터등웹개발기초지식
프로젝트에적용하며배우는인터페이스,프로바이더,파이프,미들웨어/인터셉터,모듈
환경변수구성,파이프와유효성검사,JWT인증/인가,영속화등백엔드필수기술
안정적인서비스제공을위한로깅,예외필터,태스크스케줄링,헬스체크
CQRS,클린아키텍처,테스트자동화로확장가능한모델구축

책속에서

서버에서제공하는기능을API로외부에공개하기로했다고가정합시다.현재회사가사용하고있는도메인은example.com이고,API요청은api.example.com으로받기로했습니다.즉,http://example.com,http://api.example.com로들어온요청을서로다르게처리하고싶다고합시다.또한하위도메인에서처리하지못하는요청은원래의도메인에서처리되도록하고싶다고합시다.이런경우하위도메인라우팅기법을쓸수있습니다.(56쪽)

앞서인증authentication을미들웨어로구현하는것이좋은사례라고했습니다.애플리케이션은사용자의권한을확인하기위해인증과인가를수행해야합니다.인증은요청자가자신이누구인지증명하는과정입니다.최근에는매요청마다헤더에JWT토큰을실어보내고이토큰을통해요청자가라우터에접근가능한지확인하는방식을많이사용합니다.쉽게이야기해서현재요청자가해당서비스의올바른유저인지검증합니다.(159쪽)

서비스에기능이늘어나고사이즈가커지게되면동작과정을남기고추적하는일이중요하게됩니다.이슈가발생했을경우이슈증상만으로원인을파악하는데에는시간과노력이많이들고코드를다시역추적하면서이해하는데에어려움이따릅니다.이슈가발생한지점과콜스택이함께제공된다면빨리해결이가능할것입니다.또어떤기능이많이사용되는지와같이유저의사용패턴을분석하는데에도로그log를활용할수있습니다.(193쪽)

이렇게작은서비스에는로직이단순하고변경이생겨도크게영향을끼치지않습니다.하지만서비스가커질수록변경영향도는점차커지게되고,컨트롤러와서비스,영속화및도메인레이어에서주고받는데이터가복잡해질뿐아니라,콘텍스트가상이한곳에서모델을그대로전달하고사용하는경우가발생합니다.당장은CQRS를적용하지않아도충분하지만Nest에서제공하는간단한CQRS모듈을한번적용해보겠습니다.@netstjs/cqrs패키지부터설치합니다.(249쪽)

자바스크립트에는많은테스트프레임워크가존재합니다.테스트프레임워크의구성요소로서테스트가실행되는환경을제공하는테스트러너testrunner,테스트의상황을가정하는어서션assertion,테스트의기대결과를비교하는매처matcher,그리고테스트과정에서현재테스트대상모듈이의존하는다른모듈을임의의것으로대체하는테스트더블등이있습니다.Nest는기본테스트프레임워크로Jest와SuperTest를제공합니다.(276쪽)