개발/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,
		});
	});
}