728x90

 Spring Boot를 이용해서 개발을 진행하면 @Transactional이란 어노테이션을 이용하여 데이터의 영속성을 지키고자 한다. 제대로 알고 사용하는 것일까? 프록시조차 모르는 나는 Spring Boot의 의도에 대로 비즈니스 로직에만 신경을 쓰는 것이었을까? 오늘은 그저 사용 중이었던 @Transactional에 대한 내 생각을 서술한 글을 쓴다.

@Transactional을 제대로 이해하려면 유튜브 뉴렉처 강의가 직관적이었다. Spring 자체를 이용해본 적이 없기 때문에 Bean을 xml에 직접적으로, 프록시를 직접적으로 설정해서 AOP를 구현하는 것을 본 것이 이해가 잘 가는 부분이었다.

https://www.youtube.com/watch?v=y2JkXjOocZ4&t=2s

문제는 그 다음이다. Spring Boot는 AspectJ 라이브러리를 이용한 것이 아니라, 컴파일 단계에 AOP를 구현한 것이라 Spring Aop 라이브러리는 프록시를 이용하였기에 Self-invocation이란 문제가 발생한다.

해당 문제는 자기 자신의 메소드를 호출할 때 AOP가 제대로 적용되지 않는 문제가 발생한다.

A 메소드에서 @Tranascational이 붙은 B를 호출하면 @Transcational이 적용이 안 된다. 하지만 A가 @Transcaional이 붙어 있으면 제대로 적용된다.

 해당 문제를 보면서 서비스를 하나 더 생성하여 해당 문제를 해결하고자 하였는데, 생각해보니 @Transcaional이 붙은 B는 insert 만 실행하는 코드가 하나만 있다. 그렇기에 해당 메소드에는 어노테이션이 필요없겠다는 생각이 들었다. Rollback할 요소가 없기 때문이다. Insert가 실패하면 어차피 데이터가 삽입되지 않기 때문이다.

문제는 반대로 A에서 @Transcational을 붙여서 해결할 수도 있는데 이때 DB Pool을 잡아 먹는 것인지는 더 알아볼만한 요소라 찾고 이후 글을 하나 더 작성하려고 한다.

반응형

+ Recent posts