공부한 내용
에러) 영속성 컨텍스트
•
에러) 영속성 컨텍스트
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을 사용했었다.
◦
위 글의 ID를 이용한 애그리거트 참조 부분을 확인해보면 아래와 같은 결론을 얻을 수 있다.
▪
채팅과 다른 도메인들이 서로 db가 다르더라도, 객체로의 참조가 아닌 id로 연결되어 있다면 구현이 용이해보임
하루 정리
TIL 작성하기
BeachCombine
잔여 포인트 조회 API 구현
카드 목록 조회 API 구현