Skip to main content

TypeORM orIgnore 메소드 Upsert시 중복 데이터 INSERT 검증 방식 변경

기존 Upsert 방식

  • 저장하려는 데이터를 조회 쿼리를 통해서 중복 조회하여 해당 조건에 부함하는 데이터가 있다면, INSERT 하지않고, 해당 데이터 리턴하는 방식

코드 예시)


/**
* Upsert후 해당 데이터 리턴
*
* @param data UpdateDataDto
*
* @returns result DataEntity
*/
async upsertData(dto: UpdateDataDto):Promise<DataEntity> {
const findDuplicateData = await this.dataRepository.findOne(
where: {
title: dto.title
}
);

if(!findDuplicateData) {
const data = new DataEntity();

data.title = dto.title;

const {id} = await this.dataRepository.save(data);

return this.dataRepository.findOne(
where: {
id: id
}
);
} else {
return findDuplicateData;
}
}

변경된 Upsert 방식

  • 중복되면 안되는 엔티티 클래스의 해당 칼럼에 Unique 데코레이터를 사용하여 Unique_key 세팅
  • 저장하려는 데이터를 TypeORM QueryBuilder API의 orIgnore 메소드를 추가하여 INSERT 쿼리 실행
    • 만약 저장하려는 데이터가 중복되었다면, 해당 INSERT 쿼리 실행 ignore 처리됨
  • 저장하려던 데이터로 조회해서 해당하는 데이터 리턴하는 방식

코드 예시)

/**  
* Upsert후 해당 데이터 리턴
*
* @param dto UpdateDataDto
*
* @returns result DataEntity
*/
async upsertData(dto: UpdateDataDto): Promise<DataEntity> {
const data = new DataEntity();

data.id = null;
data.title = dto.title;

await this.dataRepository
.createQueryBuilder('data')
.insert()
.values(data)
.orIgnore()
.execute();

return this.getOneByTitle(title);
}