NestJS 02 | Account C.R.U.D #1

임종성·2021년 9월 4일
3

NestJS

목록 보기
2/13
post-thumbnail

NestJS의 Account C.R.U.D를 통해 기본 구조와 사용법을 알아봅시다.

Initiate Project

npm new (project name) 을 통해 기본 프로젝트를 생성합니다.

Nest Cli를 사용하면 새 프로젝트를 설정하거나 Controller, Module 등을 생성하는 것이 매우 간단합니다. 명령어를 통해 (project name) 폴더가 생성되고 node_modules이 설치되며 dist, src 등의 폴더와 여러 core file이 생성됩니다.

  • .eslintrc.js, prettierrc 등은 code convention을 포함한 VSC의 편리한 기능을 제공합니다.

  • package.json에는 많은 것들이 설치되어 있습니다. NestJS의 코어 모듈들이 미리 설치되어있습니다. 커스텀 명령어를 제공하는 scripts도 존재합니다. start:dev는 개발 시 많이 사용하는 명령어로, 파일을 수정할때마다 자동으로 컴파일 및 실행을 해줍니다.

  • npm install --save (package name)와 같은 명령어를 통해 package를 설치하면 자동으로 package.json에 등록이 됩니다. 반대로 설치하고 싶은 package의 version을 package.json에 설정하면 npm i 명령어로 모두 설치할 수 있습니다.

  • typeorm, config, jwt, swagger, passport, class-validator, mysql 등을 미리 package.json으로 작성하여 설치해줍니다.

Create User Module

필요한 Package와 설정이 끝나면, Account를 관리할 User Module을 생성합니다. Nest CLI를 통해 간단하게 Module, Controller, Service를 생성할 수 있습니다.

nest g mo users
nest g co users
nest g service users


각 Module, Controller, Service는 직접 생성할수도 있지만 CLI를 통해 생성한다면 자동으로 Module과 각 부분을 이어줍니다.

Database

User Entity와 Account C.R.U.D 기능을 구현하기 전, Database 설정을 먼저 해줍니다. 우리는 MariaDB를 사용할 것입니다. package.json을 통해 설치되지 않았다면 TypeOrm과 Mysq을 먼저 설치해줍니다.

npm install --save @nestjs/typeorm typeorm mysql

App.module에서 직접 import하는 방법도 있지만, root Directory에 ormconfig.ts파일을 생성하여 NestJS와 MariaDB를 연동해보겠습니다.

위와 같이 ConnectionOption을 이용해 type, port, username, password, database 이름 등을 설정하고 export default config를 통해 app.module에서 import할 수 있도록 합니다. entities에는 사용할 entity의 class명을 넣거나 dist/**/*.entity{.ts,.js}처럼 경로 자체를 넣어줍니다.

ormconfig.json작성이 완료되면 App.module에서 TypeOrmModule.forRoot(config)를 import하여 연동을 완료합니다. DB 비밀번호등 민감한 정보들이 있으므로 보안 측면에서 ormconfig.json으로 관리하는게 좋습니다.

User Entity

이제 Database 연동도 완료되었으므로 User Table을 생성해봅시다. Django에서는 User Model을 작성했지만, TypeOrm을 활용하여 users.entity.ts파일을 생성해봅시다.

@Entity() 데코레이터를 통해 Users Class가 Database에 Table로 생성할 수 있는 Entity임을 알려줍니다. 데코레이터가 없다면 Database에는 생성되지 않고 참조용으로 사용할 수 있습니다.

@Column()을 사용해 Table의 Column임을 아려주고, Primary Key도 설정할 수 있습니다. 이 외에도 추가적인 설정은 TypeOrm Documentation을 참고합니다.

User Repository

Repository Pattern

TypeOrm은 Repository Design Pattern을 지원하여 각 항목에 Repository가 존재하며, Repository는 Service와 Database사이의 중개자 역할을 합니다.

Repository 없이 Service에서 바로 Database와 연결된다면, 여러개의 Module과 Service가 존재할 경우 Database에 접근하는 로직을 사용하기 위해 다른 Service를 참조해야 합니다. 이럴 경우 순환참조가 될 수 있으며 가독성이 떨어지게 됩니다.

그러나 Repository를 사용하여 Database와 직접적으로 연결하는 로직을 분리하게 되면, 각 Module에서 접근할 경우 특정 Repository만 접근하면 되기 때문에 Module이 각자의 Business Logic에 더 집중할 수 있고 Module간 책임분리도 확실하게 됩니다.

또한 Repository Pattern의 핵심은 Service Layer에서 Data의 출처와 관계없이 동일한 방식으로 Data를 접근할 수 있도록 하는 것입니다. 예를 들어 MongoDB, MySQL 등 다양한 Database를 사용하게 되면 하나의 Service에서 각 DB에 접근할 때 Query가 전부 다를 것입니다. 그러나 Repostiory가 직접 연결되어 Query를 다듬어주면 어떤 Database를 사용하든지 동일한 방식으로 접근하여 Data를 Handling할 수 있는 장점이 있습니다.

users.repository.ts 파일을 생성하여 위와 같이 UserRepository를 만들어줍니다. Repository도 Dependency Injection이 사용 가능한 Class입니다. 따라서 @Injectable()을 통해 의존성 주입이 가능하도록 해줍니다. DI(Dependency Injection)은 아주 중요한 개념이므로 다음에 기술블로그로 작성해보겠습니다.

profile
어디를 가든 마음을 다해 가자

0개의 댓글