You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
reacted with thumbs up emoji reacted with thumbs down emoji reacted with laugh emoji reacted with hooray emoji reacted with confused emoji reacted with heart emoji reacted with rocket emoji reacted with eyes emoji
-
문제 상황
ActualProduct와 Order는 양방향 연관관계로 이어지는데 Order와 연결지은 ActualProduct의 Order가 Null이라 발생한다.
문제 상황은
ActualProductDto
에서 ActualProduct를 Dto화하는 과정에서 발생한다.해결 방안
원래는 아래처럼 Order의 ActualProduct 리스트에 ActualProduct를 넣기만 한다.
하나의 transaction에서 Order에 ActualProduct를 넣는다면, ActualProduct에서는 해당 transaction에서 order를 참조할 수 없다.
그렇기에 필요하다면, 아래처럼 setter를 통해 ActualProduct에 Order를 넣는 과정이 필요하다.
결과
그러나 엔티티에 setter를 넣는건 문제가 발생할 수 있는 가능성이 많고 OrderDto에 꼭 OrderId를 알고 있는 ActualProductDto가 있을 필요가 없기 때문에 setter를 적용하지 않았다.
다만, 생성한 엔티티를 영속성 컨텍스트 1차 캐시에 저장되는 JPA 동작 과정을 좀 더 면밀하게 이해할 필요가 있다.
영속성 컨택스트
persistence context는 db에서 불러오거나 저장하는 모든 엔티티를 저장하는 1차 캐시라고 합니다.
persistence context는 관리하는 모든 엔티티의 변화를 추적합니다. 만약 transaction에서 엔티티가 변화가 있으면
dirty
다고 마킹하고, transaction이 끝나면 db에 변화를 적용합니다.EntityManager는 개발자와 persistence context 사이의 인터페이스 역할을 합니다.
문제 원인과 영속성 컨택스트
persistence constext는 기본적으로 transaction-scoped이기 때문에 한 Transaction이 끝날 때까지 Insert query를 모아두고 commit하게 되면 flush()로 db로 insert query를 전송하게됩니다.
위 배경을 바탕으로 Order 엔티티를 생성하고 ActualProduct들을 Order에 넣기만 하면 commit되기 전에 아직 DB에 쿼리가 나가지 않아서 실질적으로 Order와 ActualProduct들이 연관되지 않은 상태인 겁니다.
따라서 Order 엔티티를 생성하고 ActualProduct들을 Order에 넣고 나선 transaction이 종료되어야 연관된 Order와 ActualProduct들을 볼 수 있습니다.
Beta Was this translation helpful? Give feedback.
All reactions