개발/NestJs
2. 데이터베이스
희묭
2023. 10. 20. 11:43
2. 데이터베이스 (오라클 기준)
1) TypeORM 설치
오라클 연결시 Oracle Client 설치가 필요하다 (https://www.oracle.com/kr/database/technologies/instant-client/downloads.html) 그후 아래와 같이 typeORM을 다운로드한다
yarn add oracledb
yarn add @nestjs/typeorm typeorm oracle
설치시 문제가 발생한다면 yarn 및 npm 버전업그레이드를 고려해본다
포스트그래스시
yarn add pg
yarn add @nestjs/typeorm typeorm postgres
2) 데이터베이스 접속정보 설정
app.module.ts에 접속할 데이터베이스정보를 입력한다
imports: [
TypeOrmModule.forRoot({
type: 'oracle',
host: '아이피',
port: 포트,
username: '로그인ID',
password: '로그인PW',
//database: 'ServiceName',
sid: 'SID',
entities: [엔티티목록],
synchronize: false,
//logging: true,
}),
TypeOrmModule.forFeature([엔티티목록]),
],
접속정보 옵션설정시 synchronize를 true 잡으면 기존에 구축된 데이터베이스에 변형이 가해진다 그러므로 항상 false를 기본으로 삼고 프로토타입모델에만 true로 설정한다
3) 엔티티 구축
추천경로 : /src/entity/파일명(실제 테이블 소문자로 작성하길 추천).entity.ts
import { Column, Entity, PrimaryColumn } from 'typeorm';
@Entity({ name: '테이블명', schema: '스카미마명' })
export class 파스칼케이스파일명 {
@PrimaryColumn({ name: 'PK칼럼' }) pkcol: string;
@Column({ name: '일반적인칼럼' }) normalcol: string;
}
작성된 Entity는 2)처럼 app.module.ts 에 등록되어있어야 사용할 수 있다
4) 엔티티 활용
필요한 Repository와 DataSource DI주입
constructor(
@InjectRepository(엔티티명)
private 엔티티명Repository: Repository<엔티티명>,
private readonly dataSource: DataSource,
) {}
Querybuilder Crud
async get엔티티명(p: string): Promise<AiFlashcd[]> {
return await this.dataSource
.createQueryBuilder()
.select('a')
.from(엔티티명, 'a')
.where('a.컬럼명 = :id', { id: p })
.getMany();
}
async insert엔티티명(p: string): Promise<void> {
await this.dataSource
.createQueryBuilder()
.insert()
.into(엔티티명)
.values({
컬럼명: p,
컬럼명: () => 'SYSDATE',
})
.execute();
}
async update엔티티명(p: string): Promise<void> {
await this.dataSource
.createQueryBuilder()
.update(엔티티명)
.set({ 컬럼명: p + 1 })
.where({ 컬럼명: p })
.execute();
}
async delete엔티티명(p: string): Promise<void> {
await this.dataSource
.createQueryBuilder()
.delete()
.from(엔티티명)
.where({ 컬럼명: p })
.execute();
}
Repository Crud
async get엔티티명(p: string): Promise<엔티티명[]> {
return this.엔티티명Repository.find();
}
async insert엔티티명(p: string): Promise<void> {
await this.엔티티명Repository.save({
컬럼명: p,
컬럼명: new Date(),
});
}
async update엔티티명(p: string): Promise<void> {
this.엔티티명Repository.update(
{ 컬럼명: p },
{
컬럼명: p + 1,
},
);
}
async delete엔티티명(p: string): Promise<void> {
await this.엔티티명Repository.delete({ 컬럼명: In([p]) });
}
5) 트랜잭션
아래와 같이 구성할대 에러처리시 Rollback이 발생한다
async deleteAndInsert엔티티명(p: string): Promise<void> {
await this.dataSource.manager.transaction(async (a) => {
await a.getRepository(엔티티명).delete({
컬럼명: In([p])
});
throw new Error('ddd');
await a.getRepository(엔티티명).save({
컬럼명: p + 1,
});
});
}