게시판 즐겨찾기
편집
드래그 앤 드롭으로
즐겨찾기 아이콘 위치 수정이 가능합니다.
hibernate에 대해서 제가 제대로 쓰고 있는건지 궁굼합니다
게시물ID : programmer_6199짧은주소 복사하기
작성자 : S시온스S
추천 : 0
조회수 : 624회
댓글수 : 2개
등록시간 : 2014/10/27 17:13:12
안녕하세요. 하이버네이트+spring을 하고있는데,

MVC패턴부터 하이버네이트 사용까지 아직 미숙합니다..ㅠ
이런 제가 사용하는 방식이 맞는 방식인지, 아니면 잘못된 방식인지 알고싶어서 질문올립니다.




제가 읽은 책에서는

Controller : 리퀘스트 처리
Service+Transaction  :  데이터 읽기 및 정보 합산
Dao : CRUD


이렇게 하라고 하더라고요. (제가 잘못 이해했을수도있지만..)





그런데 하이버네이트 릴리즈모드를 after_transaction으로해서 그런지 문제가 좀 생겨서요. (on_close나 default옵션에서도 똑같더군요;)


/* 어노테이션 및 코드는 문법과관계없습니다.. */
------ TestSession -------
public class TestSession {

      @Eager
      public Account getAccount(){
          return ...;
      }
}

----- Account ----------
public class Account {
      @ManyToMany Lazy
      public List getFriendList(){
          return ...;
      }
}

도메인은 이렇고요.





---- Controller ---------- No Transaction
public void controller(){

   TestSession test = sessionService.getSession(request,response); // DB에서 세션에 연결된 정보를 불러와서,

   test.getAccount().getFriendList().get(0);   // lazy인 리스트를 읽는 시나리오입니다.

}


---- Session Service ------------ Transaction
public TestSession getSession() {

   db조회 
   hibernate에서 testSession을 만들면서 eager로 Account를 불러옴
   return 세션

}


--------------------------------------


이런식으로  작성했을 경우. 

릴리즈모드가 after_transaction이기 때문에, 
Controller에서 Lazy nosession예외가 나오더라고요.
(그런데 on_close나 default에서도 예외가 ;; 나오더군요;; on_close는 당연히 after_transaction의 반대이니 릴리즈가 안될거라고 생각했네요..)

그래서 여러가지 테스트를 해보니, Transaction을 빠져나오면서 ProxyList에 저장된 세션이 삭제되나보더군요.

그래서 이걸 StackOverflow에 질문했더니, "너는 하이버네이트를 잘 이해하지 못한 것 같다"라는 대답을 들었습니다. ㄷㄷ;
그런데 질문을 다시해보니 이번엔 네가 무슨질문을하는지 모르겠다는겁니다.. 제가 영어능력이 딸리는데 후회를하며.. 

Transaction내에서 모든걸 처리하기위해 아래와 같은 대안을 만들었습니다.




---- Controller ---------- No Transaction
public void controller {

    service.procIndex(request,response);

}


---- Session Service ------------ Transaction
public void procIndex () {
   TestSession test = getSession(request,response);

   test.getAccount().getFriendList().get(0);
}

public TestSession getSession() {

   db조회 
   hibernate에서 testSession을 만들면서 eager로 Account를 불러옴
   return 세션

}





이런식으로 쓰고있어요.


그런데 이 사용법이 맞는지 아닌지도 햇갈리고요..; 



Controller에 Transaction을 붙이는 방법도 있겠지만, 원칙에 어긋나는 것 같고요.


제가 쓰고 있는 방식이 맞는건지, 아니면 다른 방식을 써야하는건지 조언좀 해주실 수 있을까요?

전체 추천리스트 보기
새로운 댓글이 없습니다.
새로운 댓글 확인하기
글쓰기
◀뒤로가기
PC버전
맨위로▲
공지 운영 자료창고 청소년보호