터미널창에 npm install @nestjs/typeorm typeorm pg
를 입력해서 설치를 해줍니다.
설치가 잘 되었다면 package.json 파일에 사진처럼 잘 추가된것을 볼 수 있습니다..
src\app.module.ts
imports: [
PostsModule,
TypeOrmModule.forRoot({
// 데이터베이스 타입
type: 'postgres',
host: '127.0.0.1',
port: 5432,
username: 'postgres',
password: '내가 설정했던 비밀번호~',
database: 'postgres',
entities: [],
synchronize: true,
})
],
imports 부분에 새로 값을 추가해주고 데이터베이스에 관한 정보를 추가로 입력해줍니다. (아직 환경변수를 설정해주지 않았어서 다이렉트로 스트링형태로 작성해줍니다.).
여기서 entities 는 우선 그냥 비어있는 리스트 형태로 놔둡니다. 나중에는 생성할 모델이나 데이터베이스와 연동될 모델들을 작성해줄 예정입니다.
synchronize 는 nestjs 에서 작성하는 typeorm 코드와 DB 의 싱크를 자동으로 맞출껀지를 결정하는 코드입니다. 이 부분은 개발단계에서는 true 로 해놔야 편하지만,
프로덕션 관계에서는 데이터베이스의 구조가 바뀔수도 있기 때문에 반드시 False 로 해줘야 합니다.
실행해주엇을때에 이상이 없이 잘 실행된다면, 성공입니다.
이제 nestjs 에서 typeorm 을 사용해서 도커로 실행중인 postgresql DB 에 연결이 성공했다고 볼 수 있습니다.
entities 라는것은 일반적으로 모델을 지칭하는 단어입니다.
이제 이 엔티티를 orm 을 사용해 쉽게 매핑을하고 DB 에서 테이블이 생성되는것까지 해보겠습니다.
사진처럼 post 폴더 -> entities 폴더생성 -> posts.entity.ts 파일 생성
사실 우리는 이미 이전에 모델을 만든적이 있었습니다.
src\posts\posts.service.ts
export interface PostModel {
id: number;
author: string;
title: string;
content: string;
likeCount: number;
commentConut: number;
}
posts.service.ts 파일안에 이러한 형태로 인터페이스를 만들었던 것을 Entity 에 다시 만들어주면 됩니다.
하지만 이번에는 클래스로 만듭니다.
entities\posts.entity.ts
import { Entity } from 'typeorm';
@Entity()
export class PostsModel {
id: number;
author: string;
title: string;
content: string;
likeCount: number;
commentCount: number;
}
서비스 파일에서 만든것과 비슷하게 만들되, 차이가 있다면 클래스로 만들었다는 점과 그 클래스 위에 @Entity() 라는 데코레이터를 추가해줬다는 부분입니다.
여기서 추가해준 데코레이터 덕분에 typeorm 은 저 클래스의 모델을 토대로 DB에 테이블이 생성되는 것입니다.
여기서 추가로 더 해줘야될 부분이 @Entity() 로 클래스 모델을 데코레이터 해준 것처럼 각각의 값들도 칼럼이라고 지정해줘야 하기 때문에 @Column 으로 데코레이터를 추가해줘야 합니다.
import { Column, Entity } from 'typeorm';
@Entity()
export class PostsModel {
@Column()
id: number;
@Column()
author: string;
@Column()
title: string;
@Column()
content: string;
@Column()
likeCount: number;
@Column()
commentCount: number;
}
이제 이렇게 작성해주면 PostsModel 이라는 모델로 테이블을 만들건데 각각의 컬럼값들은 다음과 같다 라는 형태로 자동 매핑이 되는것입니다.
아까 초기에 만들었던 app.module.ts 파일에서 entities 부분안에 PostsModel 을 추가해줍니다
다만 이렇게 추가하고 실행해보면 사진처럼 오류가 나는걸 볼 수 있는데요, 테이블을 세팅할때 고유값으로 사용될 프라이머리키를 지정해주지 않아서 나는 오류입니다.
엔티티 파일로 돌아서 @Column 으로된 id값의 데코레이터를 @PrimaryGeneratedColumn 로 변경해주면 이 오류는 해결됩니다.
좌측에 있는 postgresql explore(코끼리) 아이콘을 클릭후 refresh 를 해보면 새로운 테이블이 생성된 것을 볼 수 있습니다.