kingbbode
129
2017-01-18 22:20:24 작성 2017-02-24 20:04:58 수정됨
4
5468

Spring OSIV(Open Session In View)에 대해 정리해보았습니다.


ORM을 사용하면서, 트랜잭션이 service layer에 있을 때


어떤 프로젝트에서는 View에서 Lazy Loading을 실패하여 LazyInitializationException이 나오고,

어떤 프로젝트에서는 특별한 설정없이 View에서 Lazy Loading이 정상 동작하는 경험을 겪고

Open Session In View Pattern을 알게 되어서, 내용을 정리해보았습니다.


초보개발자가 겁없이 정리해본 내용이니 가감없는 조언과 충고 부탁드립니다!


https://kingbbode.github.io/posts/open-session-in-view

6
1
  • 댓글 4

  • 창천향로
    4k
    2017-01-18 23:28:06

    좋은글 감사드립니다^^ 잘보겠습니다!

    1
  • dkb
    2017-01-19 12:52:36 작성 2017-01-19 13:03:42 수정됨

    좋은 글 감사합니다.


    OSIV를 false로 했을 때 해결책은 아래와 같습니다.

    lazyLoading에 대한 대응으로 lazyLoading을 선언한 someField에 대해서

    * jpaRepository에서 fetch join해서 읽어오거나

    * service layer의 @Transactional 메서드를 벗어나기 전에 someField.getLazySets().size()를 실행하거나


    jpaRepository는 인터페이스라 조금 제약이 있긴 하지만

    재사용하기 위해서 fetch join할 항목에 대해서 JPQL를 요렇게 사용해 봤습니다.

    public interface AnyEntityRepository extends JpaRepository<AnyEntity, Long> {
    
        String fetchJoin = "select distinct item from AnyEntity item
            + " left join fetch item.lazySets"
            ;
    
        @Query(value = fetchJoin)
        List<AnyEntity> findAllByOrderByIdDesc();
    }
    


    2
  • kingbbode
    129
    2017-01-23 11:17:22

    좋은 답변 감사합니다!

    감사합니다 !

    0
  • narusas
    53
    2017-03-22 11:27:02

    Eclipselink 같은 JPA 구현체는 Session이 닫힌 후에 Entity에 접근하면 LazyInitialization 예외를 날리지 않고, 자동으로 세션을 열어 해당 엔티티에 대해 자동으로 fetch 해오기도합니다. 


    toplink라고 하는 20년이 넘는 기간동안 개발 되어온 상용 ORM을 오픈소스로 푼게 eclipselink 입니다. 

    국내에 자료가 적긴하지만 참고하시기바랍니다. 

    0
  • 로그인을 하시면 댓글을 등록할 수 있습니다.