사용자의 request : 송금 요청 (A->B에게 10000원 송금)
web.xml 거치고 필터를 거쳐서 Controller로 옴
web.xml 거치고 필터 거치는 시점에
Controller에서 요청분기
요청에 맞는 Service 호출
송금() 메소드 실행
💡 여기서 송금을 위한 update 수행 방식 : 두 계좌를 select 해서 Service에서 처리 후 save() 없이 변경감지로 DB에 flush 되는 방식인 더티체킹 사용
A와 B select 해서 DB에서 가져와 영속성 컨텍스트에 두 계좌 객체화 시킴
select된 객체를 영속성 컨텍스트에서부터 받아와서 Service에서 값 변경 (처리) (값 변경 : A는 -10000원, B는 +10000원)
💡 현재 DB에 반영된 것이 아니라 영속성 컨텍스트에 있는 객체의 값만 변경된 상태
💡 Service -> Controller 끝난 후 아래 단계 수행
BUT, 시점을 줄여서 Service까지만 종료된 후 아래 단계 수행해도 됨 -> 데이터베이스 커넥션 시점이 줄고, 트랜잭션 범위 줄고, 영속성 컨텍스트도 빨리 종료되어 DB 부하 적어짐
응답 전에 JDBC 커넥션 종료
트랜잭션 종료 -> commit -> 변경감지 -> flush 되어 DB에 반영 (update 수행)
영속성 컨텍스트 종료
Controller에서 사용자에게 response(응답)
전통적인 방식으로는 영속성 컨텍스트와 트랜잭션, JDBC 커넥션 세 개가 같이 시작되고 종료되었다. (OPEN SESSION IN VIEW 패턴)
하지만, SpringMVC에서 제공하는 OpenSessionViewFilter는 필터 내에서 Session은 오픈하지만 트랜잭션은 시작하지 않는다.
(1) DB 연결 세션 생성 -> JDBC 커넥션 연결 시작
(2) 트랜잭션 시작
(4) JDBC 커넥션 종료
(5) 트랜잭션 종료 -> commit -> 변경감지 -> DB에 반영 (update 수행)
(6) 영속성 컨텍스트 종료
하지만, 영속성 컨텍스트의 시작은 Controller 직전, 종료는 Controller까지 지난 후에 이루어져야 한다.
그래야 LAZY 로딩을 사용할 수 있다.
이렇게 open-in-view 를 true 로 설정하면 LAZY 로딩이 가능하다. (기본 true)
영속성 컨텍스트의 시작과 종료가 각각 Controller 시작 전, Controller까지 끝난 후에 이루어 져야 한다.