• 문제상황
    • Controller -> Service -> Service(@Transactional) 
  • 문제이유
    • 컨트롤러에 디폴트로 Transaction이 걸려있다고 생각했다.(예전 osiv를 생각했던것임)
    • 그렇지만 현재의 스프링 osiv는 서비스단에 직접 트랜잭션을 명시해야 트랜잭션이 시작됨.
    • 최종적으로 호출되는 Service에는 @Transactional을 명시했는데? 왜 안된거지?
      • 같은 서비스 클래스 내에서의 호출(Service->Service(@Transactional)을 했기때문에 transaction이 전파? 되지않았다..
  • 문제해결
    • controller단에만 @transactional 명시
      • 예전 transaction 적용방법. 컨트롤러단에서 데이터를 변경하면 의도치않은 데이터 변경값이 뷰에 전달될가능성이 커서 안좋은 방법이다!! PASS!!
    • service단에 @transactional 명시
      • 외부에서 쓰일 메소드는 transactional 명시해놓음
      • 내부에서만 쓰일 메소드는 private로 명시함으로써 "이 메소드는 내부에서만 쓰일거고, 내부에서 호출은 transaction이 적용이 안돼!" 라는 것을 인지할수 있다. @Transactional 붙여보면 컴파일시점에서부터 에러가 남을 알수있음!

 

  • 트랜잭션 범위의 영속성 컨텍스트 전략이 기본이다

  • 트랜잭션범위(=영속성 컨텍스트 범)에 있지않는 뷰 레벨(컨트롤러 등)에서 엔티티에 접근을 하다가 LazyInitailize Exception 이 발생!

  • 원인 사례 : 

    • " 어 나는 뷰에는 이 엔티티의 필드를 좀 암호화해서 넘기구싶어" 것을 원할수가 있음

    • " 뷰 레벨에서 나중에 (Lazy) 꺼내 써야지~ 지금은 당장 필요없으니깐~"

  • Lazy InitializeException을 해결하는 방법이 뭐가 있을까?

    • 뷰 레벨전에 엔티티를 미리 초기화하는 방법이 있겠네

      • 그럼 뷰 레벨전에 엔티티를 초기화하는 방법엔 뭐가있을까?

        • 글로벌 페치 전략 수정

          • Entity에 fetchType Eager로 지정

          • 사용하지 않을수도있는 엔티티 까지도 로딩해서 메모리 문제.. 여기까진 OK

          • 일반 JPA 메소드로 조회했을떄는 이너조인해서 잘 가져온다 문제가없다.. 근데? JPQL을 사용하게 되면 N+1 문제가 발생한다

        • JPQL 페치 조인

          • 위의 N+1문제를 해결하기 위해 JPQL을 쓸때는 페치 조인을 쓴다. 

        • 강제로 초기화(Facade)

          • 이것도 아니면 Lazy 로딩인걸 무조건 initialize하는 계층인 facade 계층을 하나 만든다.(Controller <-> facade <-> service)

    • 뷰 레벨전에 엔티티를 미리 초기화의 문제점

      • 누가 뷰 만들때 이 엔티티가 초기화 잘됐는지까지 확인해.. 그냥 뷰만 딱 만들지..너무 모델뷰간의 의존성이 높아진다..

    • 그러면 Lazy InitializeException 가장 좋은방법은 OSIV 적용!

      • 스프링의 예전 OSIV

        • 요청당 트랜잭션 방식의 OSIV , 즉 요청이 들어오는 즉시(필터/인터셉터부터) 트랜잭션 시작!  영속성컨텍스트도 똑같이 시작!

          • 문제점 : 뷰레벨에서 모델에 셋을할수있음. 즉 데이터가 바뀔수있음 뷰레벨에서.

      • 지금의 스프링 OSIV

        • 서비스단에서 트랜잭션 시작!  영속성컨텍스트는 필터/인터셉터부터 시작

오늘도 7시! 퇴그은~을 외치며 힘차게 자전거 패달을 밟았다.

퇴근전부터 이미 무엇을 먹을지 정해놨다. 대부분 직장인분들 그러시죠..??
홍제역 "용씨네 누룽지 통닭"!!

어쩐지 오늘은 옛날 통닭 스타일이 먹구싶었고, 집 근처를 검색해서 찾아냈다.

 

집 도착 15분전쯤 포장주문 전화를 했다.
사장님 목소리가 경쾌하다 맛집포스 목소리..! 

가게 외부 전경. 한 4명정도 앉을수있는 웨이팅 테이블도 보이고 깔끔허다
도착하자마자, 사장님이 기다렸다는듯이 바로 건네주셨다. 오.. 포장 박스가 일반 치킨집 박스랑은 다르다. 피자 박스 느낌?
일단 치킨무, 겨자소스, 양념소금을 패키지로 주신다. 그리고 통닭 때깔은 무조건 합격!! 사실 인생에서 누룽지통닭 두번째 도전인데, 첫번째 도전은 치킨도 아닌것이 백숙도 아닌 느낌을 받았었다. 과연 이번엔..
한입 베어물고 미쳤...! 왜 누룽지 통닭을 먹나 했던 내 편견이 와르르 무너짐...ㅋㅋ 겉바촉촉의 끝판왕이였고, 단백한 통닭에 양념소금, 겨자를 찍어먹으면 적당한 간이 되어 환상의 조합을 이뤄냈다

 

김치 꺼내버렸다.. 밥하면 김치! 역시나 꿀조합이다. 

꿀마니는 오늘 저녁도 든든하게 먹어버렸구요. 새로운 내 보금자리 주변의 맛집을 찾아내야 한다며 다이어트 중지됐...

여튼 자극적이지 않고 단백해서 계속 땡기는 맛이다. 자주 시켜먹을듯하다. 

최근 상암동-> 홍제동으로 이사를 했다.

이제 내 취미이자 힐링책인 산책&조깅을 할 수 있는 스팟을 찾아보자~ 라는 생각으로 

가장 가까운 산책로를 찾아보았고 그러다 "홍제천" 산책로를 알게됐다. 

홍제역 근처 내 오피스텔에서 대략 900메다!



오..나름 조명이 알록달록 이뿠다..!! 홍제천 산책로 입구쪽!
아부지 또래의 아저씨 따라서 홍제동->부암동 방면으로 살짝 한 300미터정도 걸어보았는데 너무 어둡다 ㅠㅠ 러닝을 해보려고 살짝 발을 굴러봤는데 길이 어두워서 뛰는것은 포기! 걸었다..!
부암동 방면으로 살짝 더 걸어갔더니 이런 귀여운 운동기구들이 몇개있다. 나름 벤치프레스, 평행봉 등이 있어서 맨몸운동을 좋아하는 나한텐 좀 매력적인 스팟이였다.

 

부암동 방면은 어두워서 연희동 방면으로 노선을 우회! 이렇게 긴 수하터널이 약 4-500미터?  우천 경보시에는 신속히 대피?하라는 경고문구가 있음.  터널안은 밝아서 뛰기에는 쏘굳!

 

컨디션이 안좋아서 오늘은 홍제천 맛보기만 했구~ 담에 연희동 방면, 부암동 방면으로 조깅을 해보겠습니다~ㅎㅎ

+ Recent posts