Controller단에 @Transactional을 설정한 후에 rollback테스트를 해봤는데 되지 않았다.
그래서 그냥 Controller단에서는 @Transactional이 안되는구나 하고 Service 클래스에서 트랜잭션이 필요한 로직을 짰었다. 근데 똑같은 상황을 최근에 겪었는데 또 찾고 있었던 내 모습을 보고 원인파악을 시작했다.
Controller단에서 @Transactional이 안먹히는 이유는 Spring AOP때문이다. Spring AOP는 기본적으로 다이내믹 프록시 기법을 사용하는데 이 프록시를 적용하려면 인터페이스가 필요하다. 일반적으로 Controller는 인터페이스가 없기때문에 적용되지 않았던 것이다.
만약 Controller에서 적용하고 싶으면 클래스 프록시 모드를 사용하면된다.
application context파일에 트랜잭션 관련 설정을 아래와 같이 하면 된다.
<annotation-driven>proxy-target-class="true"/></annotation-driven>
하지만 @Transactional이 필요한 경우에는 대부분 코드가 지저분하고, Controller단에 사용하게 되면 MVC 모델에도 맞지 않다. 트랜잭션이 필요한 비즈니스 로직은 Service단에서 작성하도록 하자
'Web' 카테고리의 다른 글
[Image] SVG와 PNG의 차이 (0) | 2021.06.22 |
---|---|
[Spring] Controller로 요청이 두 번 오는 오류 (0) | 2021.06.10 |
[Spring] 서버의 물리적 경로 가져오기(TO 업로드) (0) | 2021.04.16 |
[JSP] 수정한 canvas를 file 타입의 input태그에 넣기 (0) | 2021.03.30 |
[JSP] input으로 데이터를 넘겼는데 왜 자꾸 ,(콤마)가 붙어서 오는지 (3) | 2021.03.23 |
댓글