작성
·
268
0
안녕하세요, 강의 듣다가 궁금한 것이 생겨 질문 드립니다.
총 두 가지 질문이 있는데요
1. 시스템 설계상 연관관계 매핑을 하지 않는 경우(트래픽 관리가 중요한 시스템이라 연관관계 매핑을 따로 하지 않았을 경우), n+1문제 등 즉시로딩/지연로딩 설정과 관련된 이슈는 걱정하지 않아도 되는 걸까요?
2. 연관관계 매핑을 사용했을 경우, Member - Order와 같이 두개의 Join된 테이블을 이용해 집계하는 로직이 있고, 해당 로직은 요청이 들어오는 시점의 모든 Member와 Order의 데이터를 기준으로 집계되어야하는 제약사항이 있다고 가정하겠습니다. (oracle의 consistent모드로 member와 order를 조인해서 데이터를 가져오는 경우와 동일하게 작동이 필요할 경우)
해당 로직이 아래와 같은 순서로 진행이 된다고 생각하겠습니다.
a. 모든 member를 조회한다 (lazy로 설정되어 각 member와 연관된 order는 현재 조회되지 않음) 이후 루프를 돌며 b-d를 수행한다.
b. 1번 member의 order를 가져와 집계 (lazy)
c. 2번 member의 order를 가져와 집계 (lazy)
d. 3번 ~ n번 member의 order를 가져와 집계 (lazy)
e. 결과 도출 후 종료
위의 a~e순으로 진행이 된다고 했을 때, b단계에서 order를 조회하는 시점과 d단계에서 order를 조회하는 시점이 다를텐데(로직이 수행되는 시간이 길 경우)
b단계 수행 중 d단계에 수행되어야할 3번 member의 order 정보가 다른 application에 의해 업데이트 된다거나
혹은 1번 member에 관련된 order가 매우 많아 100번째 order를 조회해 처리하는 도중에 500번째 order 정보가 업데이트 될 경우, 데이터 정합성에 문제가 생길 것 같은데요.
실제로 이와같은 문제가 발생하는지 그리고 문제가 발생한다면 문제를 해결하기 위한 방법으로는 어느 것들이 있는 지 궁금합니다.(지금 생각나는 부분은 해당 로직은 별도 메서드에 entitymanager를 통해 native query를 string으로 선언해 사용하거나 마이바티스를 선택적으로 사용하는 등의 방법이 있을 것 같은데요. 실제 운영 app에서는 어떻게 해결하는지 궁금합니다.)