본문 바로가기

코딩/자바

스프링 셀프조인을 하는 이유

그기능이왜생겼나 하는 의문은 멀티스레드랑은 큰 상관이 없습니다.

AOP에 관련한 내용인데 스프링은 AOP 대상 객체의 하위 객체(proxy object)를 동적으로 생성해서 AOP를 적용합니다.

그런데 자기 내부에있는 메서드를 호출하겠다고 this를 때려버리면 proxy 객체가 아닌 AOP가 적용되지않은 정말 자기자신을 호출하기때문에 AOP가 정상적으로 작동하지않습니다.

이를 해결하기위해 this로 접근하는게 아니라 자기자신을 참조(실제로는 자기자신이 아니라 AOP가 적용된 proxy 참조)로 가져 호출하는겁니다.

 

UserSerivce.java 파일에서

 

public List<Vo> findByUser() {

    getUserName();

}

 

@Transaction

public String userName(){

    repository.insertSomething();

    repository.findByUserName();

}

 

와 같이 메서드에서 트랜잭션(Aop)메서드를 호출할때 문제가 생긴다고 한다. 테스트는 안해봄

 

이럴 경우 getUserName();이 아니라 

 

자기 자신을 Autowired로 해서 셀프 주입을 받아서 해야한다고 함.

@Autowired 

UserService userService;

 

userService.getUserName();