오늘은 서비스를 운용하기 위해 필요한 데이터베이스를 직접 연결해보는 방법에 대해서 알아보도록 하자.
오늘날 대부분의 서비스들은 데이터를 저장하고 저장된 데이터로 sight와 의미를 생성해내는 일을 하고 있으며, 이를 실현하기 위해서는 서버와 데이터베이스의 연결은 가히 필수라고 말할 수 있다.
과거 서비스의 데이터베이스를 연동하기 위해서는 데이터베이스 전문가인 DBA가 쿼리를 생성하고, 백엔드 개발자가 해당 쿼리를 JDBC등을 통해 데이터를 받아오는 작업을 했었다. 그렇다 보니 회의를 할 때도, 이 둘 간의 신경전이 꽤나 있었다고 한다... 결국 서비스의 기능은 데이터베이스의 데이터가 핵심이기 때문에 DBA의 권력이 더 강했고, 이에 화가 난 백엔드개발자가 DBA 없이 프로그래밍에만 집중하여 개발할 수 있도록 만든 것이 ORM이라는 소문이 있다 ㅋㅋㅋㅋ
ORM(Object Relational Mapping)은 데이터베이스와 객체 지향 프로그래밍 언어 간의 호환되지 않는 데이터를 변환하는 프로그래밍 기법이다. 객체 지향 언어에서 사용할 수 있는 "가상" 객체 데이터베이스를 구축하는 방법이다. [위키백과]
본인은 개발 초기 DB의 쿼리문도 배우고, 서버도 배웠던 터라 따로 ORM의 필요성을 못 느끼고, 사용을 하지 않았지만 프레임워크를 배우고 협업을 진행해보면서, ORM으로 형식을 만드는 것도 중요하고 쿼리문을 직접 사용하는 것에 대한 보안적인 이슈도 분명 존재하기 때문에 ORM을 적용하는 것이 좋다고 생각한다.
node.js에서 주로 사용하는 ORM은 sequelize [https://sequelize.org/]와 TypeORM [https://typeorm.io/]으로 나뉘는 데, nest JS에서는 TypeORM을 더 선호하는 편이기 때문에 TypeORM을 통해 DB 연동을 하려고 한다.
먼저, DataBase를 켜서 제대로 작동하는지 상태를 확인한다. DB를 설치하는 방법은 따로 설명하지 않겠다.
본인은 window 컴퓨터 로컬에 설치하였다.
npm을 통해 필요한 라이브러리를 설치한다.
npm install --save @nestjs/typeorm typeorm mysql2 @nestjs/config
typeorm과 관련된 라이브러리와 DB 개발환경 지정을 위한 config라이브러리를 다운 받는다.
루트 디렉토리 아래에 .development.env 파일을 만들고 객체 안에 DB와 관련된 내용들을 입력한다.
필요한 대로 입력하고 app.module.ts에 연결을 위한 TypeORM module을 import 시켜준다.
그 외에 여러 설정들도 존재하지만 다음과 같이 입력해주는 것으로 충분할 것이다.
이렇게 하고 .gitignore에 .env.development 파일을 추가시켜준다면 github에 DB 개발환경에 대한 정보를 올리지 않고 협업을 진행할 수 있다.
이제 DataBase에 데이터베이스와 테이블을 만들고 각 row를 입력해야 하지만 이를 객체 지향 프로그래밍으로 만들기 때문에 예시로 User API를 간단하게 생성하여 보려고 한다.
nest g mo
nest g co
nest g s
Users에 관한 controller, service, module을 먼저 생성한다. module을 먼저 생성하면 자동으로 module안에 service와 controller를 입력해주기 때문에 module을 먼저 입력하는 것을 추천한다.
다음은 User의 대한 entity를 생성한다. users/entities/users.entity.ts를 만들고 회원관리와 관련된 몇몇의 칼럼을 생성한다.
PrimaryGeneratedColumn 데코레이터의 경우 Primary Key와 auto increment를 자동으로 적용시켜준다.
해당 entity를 TypeOrmMovule에 entities에 추가시켜주고 서버를 실행시킨다.
그럼 자동으로 test 데이터베이스에 user 테이블이 생성된 것을 볼 수 있다.
이제 controller에 각 REST API마다 routing을 진행하고 service를 구현하면 된다.
controller에서 create와 update에 대한 DTO 또한 생성해주면 된다. DTO를 만들 때는 uid의 대한 내용을 받지 않는다.
service의 경우 InjectRepository를 사용해 DB에 CRUD를 손쉽게 사용한다.
마지막으로 User 모듈에서도 TypeORM을 사용한다는 것을 선언해주기 위해 users.module.ts 아래에 다음과 같이 입력한다.
Thunder Client를 통해 테스트해보면 정상적으로 잘 동작하는 것을 볼 수 있다.
이상으로 TypeORM을 연동하는 방법에 대해서 알아보았다.
백엔드로써의 재미를 느낀 부분 중에는 DB를 연결하여 큰 소프트웨어 2개를 이어서 동작시키는 것에 대한 재미도 일정 부분 작용하는 것 같다.
물론 실제로 회원관리를 하려면 더욱 추가해야 할 부분들이 많이 있지만, 이 정도면 충분히 DB를 연동해서 새로운 기능을 구현하는데 문제는 없을 것이다.
이 이상의 nestJS의 대한 기능을 익히는 것은 프로젝트를 진행하면서 배워야 할 것이라고 생각된다. Deep 하기도 하고 딱 지정하고 포스팅 하기엔 너무 양이 방대하기 때문이다...
여기까지 구현이 가능한 사람은 nest.js의 공식 Doc를 통해서 충분히 구현이 가능하다고 생각된다.
다음 포스팅은 뭐할지 고민하면서... 이상 마치려고 한다
[참조 : https://typeorm.io/#/readme/step-by-step-guide]
[참조 : https://docs.nestjs.kr/techniques/database]
[참조 : https://docs.nestjs.com/techniques/configuration]
[Github : https://github.com/geun9716/nestJS]
'서비스개발(Web, App) > Back-End' 카테고리의 다른 글
Nest JS 프레임워크 공부하기 (Node.js) - 3 [DTO, DAO, Entity] (0) | 2022.01.04 |
---|---|
Nest JS 프레임워크 공부하기 (Node.js) - 2 (0) | 2022.01.03 |
Nest JS 프레임워크 공부하기 (Node.js) - 1 (0) | 2022.01.02 |
Nest JS 프레임워크 공부하기 (Node.js) - 0 (0) | 2022.01.02 |
Node.js ioredis(Redis) 외부 접속 (0) | 2021.08.19 |