전체 보기
🍀

DB가 서로 다른 도메인들, 영속성 컨텍스트 에러

작성일자
2023/03/11
태그
DIARY_DEVELOP
프로젝트
Atties
책 종류
1 more property

공부한 내용

에러) 영속성 컨텍스트

에러) 영속성 컨텍스트
Caused by: org.springframework.dao.InvalidDataAccessApiUsageException: org.hibernate.TransientPropertyValueException: object references an unsaved transient instance - save the transient instance before flushing : beachcombine.backend.domain.Giftcard.store -> beachcombine.backend.domain.Store; nested exception is java.lang.IllegalStateException: org.hibernate.TransientPropertyValueException: object references an unsaved transient instance - save the transient instance before flushing : beachcombine.backend.domain.Giftcard.store -> beachcombine.backend.domain.Store
Java
복사
원인)
Store store1 = Store.builder() .name("zero-waste store") .location("Gangnam-gu") .image("storeimageUrl") .build(); Giftcard giftcard1 = Giftcard.builder() .cost(1000) .store(store1) .build(); em.merge(store1); // em.persist(store1)으로 변경하면 에러 해결됨 em.merge(giftcard1);
Java
복사
해결)
이 에러는 "unsaved transient instance"라는 메시지가 나오는데, 이는 아직 저장되지 않은 객체를 참조하고 있기 때문에 발생하는 것이다. 즉, giftcard1에서 store1을 참조하고 있는데 store1이 아직 영속성 컨텍스트에 저장되지 않았기 때문에 발생한 것이다.
해결 방법으로는, em.merge(store1)을 em.persist(store1)로 변경하면 된다. merge() 메소드는 객체를 병합하기 때문에 이미 영속성 컨텍스트에 있는 객체를 복사하여 저장하는 것이므로 이 문제를 해결할 수 없다. 따라서, store1 객체를 새로운 객체로 인식하여 저장하는 persist() 메소드를 사용해야 한다.

새로 알게 된 것) DB가 서로 다른 도메인들

DB가 서로 다른 도메인들 → ID를 이용한 애그리거트 참조로 해결
아띠즈 프로젝트를 진행하며 채팅 DB로는 기존에 사용하고 있던 MySQL보단 MongoDB가 적합하다 판단했지만, 기존 DB 말고 다른 DB를 추가하는 건 시간 관계 상 후순위로 밀려, 그냥 MySQL을 사용했었다.
이때, 팀원들과 함께 논의했던 부분이 도메인들끼리 DB가 서로 달라도 괜찮은지에 대해서였는데, 이 부분에 대해 팀원분께서 좋은 글을 공유해주셨다!
위 글의 ID를 이용한 애그리거트 참조 부분을 확인해보면 아래와 같은 결론을 얻을 수 있다.
채팅과 다른 도메인들이 서로 db가 다르더라도, 객체로의 참조가 아닌 id로 연결되어 있다면 구현이 용이해보임

하루 정리

TIL 작성하기
BeachCombine
잔여 포인트 조회 API 구현
카드 목록 조회 API 구현