개발 이론/Spring

프록시??? 스프링 AOP?? 트랜젝션?? (4)

dal_been 2024. 4. 10. 21:53
728x90

약 한달만에 이어쓰는 프록시이야기...ㅎㅎ

최근 한달동안 서류합격한거 과제하느라 바빴다.. 또 이번주는 꼭 최종합격하고 싶은지라... 열심히 면접 준비하라... 애를 마니 썼다.. 뭐랄까 부족함은 존재하지만 잘할수 있는 신입 개발자라는 걸 어필하고 싶어서...ㅎㅎㅎ

 

어째든 시간이 좀 나서 그동안 궁금했던 트랜젝션 동작원리를 알아보고자 한다.

 

 


트랜젝션은 AOP의 예이다

 

찾아보니 나는 단순히 트랜젝션이 프록시 패턴 이용해서 구현했거니.. 추측하고 있었는데 그게 아니라 AOP의 대표적인 예였다.

 

앞서 말했듯이 AOP는 여러 클래스의 비즈니스 로직과 공통적인 부가로직을 구분하게 위하여 사용되는 기술?? 이다.

그래서 생각해보면 트랜젝션도 결국 여러 서비스 코드에서 @Transactional이 붙으면 AOP에 의해 공통적인 트랜젝션 코드가 실행되는 것이다.

 

 

간단하게 표현하자면 위와 같다.

일단 target에 대해서 어떤 메서드가 호출되면

AOP proxy가 가로챈다 -> 그럼 Transaction advisor가 호출되면 시작된다 -> traget Method가 실행되고

-> 결과에 따라 Trasaction Advisor가 commit, rollback을 한다 -> 이후 결과값을 전달

(밑에 간단하게 코드로 정리해봤다.)

try{ 
        trasaction.begin();
        target.method();
        transaction.commit();
   } catch ( Exception e) {
   
   		trasaction.rollback();
   
   }

 

 

어째든 프록시를 이용하는 트랜젝션

 

트랜젝션이 AOP를 이용한다고 해도 결과적으로는 프록시라는 개념을 이용하는 것이다.

그래서 주의할 부분을 말하자면

 

1. private?? 메서드

 

프록시의 경우 타겟 객체를 상속받아서 구현한다. 그렇게 되면 private메서드는 프록시 객체에서 알수 없는 존재이다.

그래서 만약 @Transactional을 사용하고 싶다면 public으로 열어둬야 적용이 된다.

 

 

2. 트랜젝션을 부르고 또 트랜젝션을 부른다? 아님 다른 메서드안에서 트랜젝션을 부른다?

 

결과적으로 말한다면 만약 트랜젝션이 안!붙은 메서드 안에서 트랜젝션이 붙은 메서드를 호출한다고 해서 트랜젝션이 호출되지 않는다.

그 이유를 위와 같이 생각해보면 

트랜젝션이 안붙은 메서드는 프록시 객체가 아니라 객체가 소환된다. 그렇기 때문에 객체가 안붙은 메서드를 소환하고 붙은 메서드를 소환하기 때문에 적용이 안되는 것이다.


 

생각보다 간단하게 트랜젝션 동작원리를 정리했다. AOP개념이 섞여있다보니 이전 블로그내용과 함께 참고한다면 잘 이해될것이라고 생가된다.

 

다음은 어떤 내용을 쓸지 고민중이긴한데.. 일단 사실... SET을 좀 파보고 싶다.. 중복검증에 MAP을 사용한다는 거는 대충알겠는데 어떻게 되는지 잘 모르겠다.... 흠... 근데 일단 회사 합격했으면...!!!!!!!!!!!!! 제발루!!!!!!!! 합격해랏합격해랏!!!!!!!

 

아 근데 추가적으로 데이터베이스 관련된 옵티마이저도 궁금하긴함... 그것도 공부해봐야지..ㅎ