Transaction 사용 이유
프로젝트 중 일부 로직에서 DB에 정보 저장은 관련 파일이 서버에 정상적으로 전송되었을 때 이루어져야 했다. 하지만 서버에 저장되어야 하는 파일 경로에 DB 정보 저장할 때 생기는 고유키가 필요했다. DB 정보 임시 저장 후 고유키로 완성된 파일 경로로 전송해야 했다. 전송이 성공했을 때 DB 정보를 저장 완료를 해야 했다. 그래서 성공 시 DB Commit, 실패 시 DB Rollback 할 수 있는 Transaction을 사용했다.
Transaction 구현
1. EntityManager 사용 방식
async saveUser(){
await connection.getRepository(User).manager.transaction(async (manager) => {
await manager.save(user);
await saveFile(file);
})
}
2. 데코레이터 사용 방식
@Transaction()
async saveUser(@TransactionManager() manager: Entity){
await manager.save(user);
await saveFile(file);
}
3. QueryRunner 사용 방식
async saveUser() {
const queryRunner = dataSource.createQueryRunner();
await queryRunner.startTransaction();
try {
await queryRunner.manager.save(user);
await saveFile(file);
await queryRunner.commitTransaction()
} catch (err) {
await queryRunner.rollbackTransaction()
} finally {
await queryRunner.release()
}
}
프로젝트에 사용한 Transaction
프로젝트는 repository를 기반으로 DB Connection을 구성하고 있다. Repository에서 QueryRunner 속성은 비어있고 데코레이터 방식은 일관성이 없기 때문에 EntityManager을 사용한 Transaction 구현했다.
'개발공부' 카테고리의 다른 글
[ Java Spring ] List 정렬하기 (0) | 2022.12.19 |
---|---|
[ Java Spring ] CRUD Repository vs JPA Repository (0) | 2022.12.04 |
DB 외부 접속 포트 포워딩 문제 (0) | 2022.11.21 |
객체 지향 설계 - SOLID(2) (0) | 2022.03.14 |
객체 지향 설계 - SOLID(1) (0) | 2022.03.06 |