프로젝트를 하면서 기존처럼 하나의 DB만을 접근하는 게 아니라 연관된 DB도 같이 접근해서 데이터를 생성하는 작업이 있었다. 이때 에러가 발생하였고 그 원인을 찾으니 연관된 DB에 필요한 값이나 로직이 잘못되어 처음에 접근한 하나의 데이터가 생성되었고 다른 하나의 데이터가 생성되지 않아서 오류가 발생기는 문제가 있었다. 문제는 먼저 처리된 데이터는 문제가 없이 생성되어 데이터의 무결성에 문제가 생기고 불필요한 데이터가 쌓인다는 것이었다. 이에 대한 해결 방법으로 트랜젝션을 사용해서 처리하였다.
// detail.service.js
// 집사진 생성
createDetail = async (userId, content, imgUrl, itemData) => {
const t = await sequelize.transaction({
isolationLevel: Transaction.ISOLATION_LEVELS.READ_COMMITTED,
});
try {
const userCheek = await this.detailRepository.userCheek(userId, { transaction: t });
if (!userCheek) {
await t.commit();
const error = new Error('집사진의 생성 권한이 없습니다.');
error.status = 403;
throw error;
}
const detail = await this.detailRepository.createDetail(userId, content, imgUrl, { transaction: t });
if (!itemData) {
await t.commit();
return detail;
}
const writepack = await this.detailRepository.createWritePack(itemData, detail.detailsId, { transaction: t });
await t.commit();
return detail;
} catch (error) {
await t.rollback();
console.log(error);
throw error;
}
};
이렇게 모든 작업이 이루어 져야지 두 개의 데이터가 모두 생성이 되고, 첫 번째 데이터는 생성되어도 두 번째 데이터 생성에서 에러가 발생한다면 두 개의 데이터 모두 되돌려 다시 생성을 해야 하게 만들었다.
'오늘 뭐했냐 > 함께했던 작업들' 카테고리의 다른 글
23.08.06 쿠키 전달의 문제 (0) | 2023.08.10 |
---|---|
23.08.05 끝 없는 기획 (0) | 2023.08.10 |
23.07.22 클론 코딩 - 데이터 관계 설정 (0) | 2023.07.24 |
23.07.21 협업과 소통 (0) | 2023.07.22 |
23.07.17 HTTPS로 변경하기 (0) | 2023.07.18 |