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