스프링을 개발하다 보면 컨트롤러 영역에서 @Service 클래스가 아닌 Interface를 주입받아서 실행하는데, 어떻게 Interface를 선언했는데 실행할 수 있는 메소드를 사용할 수 있는 객체가 되는건지 여태 궁금해하지도 않은 내 자신이 놀랍다.
우선 MyService라는 인터페이스와 MyServiceImpl이라는 @Service가 붙은 구현체를 만들어보자.
public interface MyService {
String test();
}
@Service
public class MyServiceImpl implements MyService {
@Override
public String test() {
return "MyServiceImpl";
}
}
@Autowired
MyService myService;
해당 서비스를 사용하는 곳에서 보통 bean을 주입받아서 사용하게 된다.
이때 myService에 담기는 객체는 프록시 객체를 주입받게된다.
Spring에서는 @Service가 붙은 객체에 대해 프록시 객체를 만들게 된다.
여기서 프록시 객체를 어떤 대상으로 보고 만들 것인지에 대한 값을 spring.aop.proxy-target-class를 통해 정의할 수 있다.
spring.aop.proxy-target-class 값은 기본적으로 true다.
proxy-target-class는 말 그대로 target을 class로 해서 프록시 객체를 만들 것이냐라는 말이다.
false값을 주면 class가 아닌 interface를 기반으로 프록시 객체를 만든다.
인터페이스 기반으로 만들면
MyServiceProxy는 인터페이스인 MyService로 부터 만들어지고
MyServiceImpl는 인터페이스인 MyService로 만들어진다.
클래스 기반으로 만들면
MyServiceImpl는 인터페이스인 MyService를 통해 만들어지고
ProxyMyService는 클래스인 MyServiceImpl를 통해 만들어진다.
'🍃 Spring' 카테고리의 다른 글
Spring Boot로 만드는 Spring Security 로그인 구현 - JWT(2) (6) | 2022.10.18 |
---|---|
Spring Boot로 만드는 Spring Security 로그인 구현 - Session(1) (2) | 2022.10.10 |
Spring Boot에서 Redis로 세션 클러스터링 구축 (4) | 2022.10.03 |
gradle build bootJar 차이 (0) | 2022.09.23 |
@PostConstruct와 bean 생명주기 (0) | 2022.09.19 |