ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • JPA open session in view 설정하기
    spring/JPA 2021. 4. 8. 17:00

    배경 

    영속성컨텍스트에 대해 어느정도 이해했다고 자만하고 있었다. 강의를 보며 지연로딩된 엔티티를 Controller에서 불러오는 경우가 있었는데 어라?정도로만 넘어가고 깊게 생각해보지 않았다. 직관적으로는 당연히 영속성컨텍스트는 서비스로직의 트랜잭션과 생명주기를 같이 할줄 알았다. 강의 막바지에 open session in view(osiv)에 대해 배웠고 그 내용을 정리한다.

     

     

     

    yml에 설정하기

    osiv에 대한 아무런 설정 없이 was를 실행시키면 위와 같은 warn로그가 나온다.(있는 줄도 몰랐다) 내용을 보면 osiv는 기본이 true이고 db는 view를 랜더링할 때도 실행되며 이 경고창을 없애려면 osiv를 disable하라는 내용이다.

     

    영속성컨텍스트는 트랜잭션 시작과 동시에 활성화 된다. 이때 DB커넥션 풀에서 커넥션 또한 얻게 된다. 처음엔 당연히 트랜잭션과 그 생명주기가 같을 거라고 생각했다. 즉, 트랜잭션 종료와 함께 영속성컨텍스트와 DB커넥션도 자원을 반납할 거라고 생각했다. 하지만 osiv가 true로 되어 있다면 영속성컨텍스트의 생명주기가 좀 달라진다. 시작은 트랜잭션과 동일하지만 트랜잭션이 끝난 뒤에도 영속성컨텍스트는 반납되지 않는다. 서블릿의 모든 요청이 처리된 후 자원이 반납되는 듯하다.

     

    그래서 서비스로직의 트랜젝션이 끝난 시점인 Controller에서도 엔티티의 지연로딩을 업데이트할 수 있었다.

    영속성컨텍스트와 트랜잭션의 생명주기를 맞추려면 위와 같이 open-in-view를 false로 설정해주자.

     

    그래서 뭐가 문제일까?

    트랜잭션이 끝난 뒤에도 영속성컨텍스트는 열려 있어 지연로딩을 Controller에서도 할 수 있는 걸 알았다. 그럼 이게 뭐가 안 좋을까? 먼저 커넥션을 제때 반납하지 못하는 문제가 있다. 트랜잭션은 여러 DB작업을 논리적으로 묶어놓은 개념이다. 즉, 그 안에서 모든 DB작업이 끝나야하고 커넥션도 반납되는 게 옳다. 다만, OSIV설정으로 커넥션 반납 타이밍이 늦춰진다면 한정된 자원을 사용하는 WAS환경에서 문제가 될 것이다.

     

    https://stackoverflow.com/questions/30549489/what-is-this-spring-jpa-open-in-view-true-property-in-spring-boot

     

     

     

    댓글

Designed by Tistory.