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

 

+ Recent posts