Web

[Spring] MVC Controller 클래스에서 @Transactional을 사용할 수 있는가?

Code Bomber 2021. 3. 22.

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단에서 작성하도록 하자

 

댓글