상세 컨텐츠

본문 제목

@Autowired 인터페이스 사용이유

Spring/개념

by Chan.94 2021. 10. 7. 11:00

본문

반응형

-이전 글-

[Spring/개념] - DI(의존성 주입)

[Spring/개념] - DI(의존성 주입) @Autowired 사용법


@Autowired [인터페이스] [변수명]

@Autowired를 사용하면서 관행적(?), 무조건적(?)으로 인터페이스를 선언하여 사용하지 않았는가?

이에 대해 정리해보도록 하겠다.

 

필자도 백기선 님의 유튜브 영상을 보고 정리할 수 있었다.

https://www.youtube.com/watch?v=C6nsjqrCJq4 


public interface MyService {
    void doSomething();
}
@Service
public class MyServiceImpl implements MyService {
    @Override
    public void doSomething() {
        System.out.println("Dev Log");
    }
}
@Controller
public class MyController{
    // 1. 인터페이스타입
    @Autowired
    private MyService myService;
    
    // 2. 클래스타입
    @Autowired
    private MyServiceImpl myService;
    
}
spring.aop.proxy-target-class=false

 


인터페이스 타입 (false)

구현 상속 관계 : MyService ---> MyserviceImpl
프록시 상속 관계 : MyService ---> ProxyMyService(임의로 명명)

 

따라서 ProxyMyService 가 인터페이스인 MyService를 상속받는다.


클래스 타입 (true)

구현 상속 관계 : MyService ---> MyserviceImpl
프록시 상속 관계 : MyServiceImpl ---> ProxyMyService(임의로 명명)
MyService ---> MyserviceImpl ---> ProxyMyService

 

이경우에 스프링이 생성하는 프록시가 MyServiceImpl을 부모로 하여 상속을 받는 구조인 것이다.

 


정리

"@Autowired를 사용하면서 관행적(?), 무조건적(?)으로 인터페이스를 선언하여 사용하지 않았는가?"

 : Spring AOP Proxy설정과 관련되어있다.

 

Spring AOP Proxy설정이 true라면 두 가지 방법 모두 정상적으로 의존성 주입이 가능하다.

하지만 설정이 false라면 클래스 타입으로 자료형을 선언하면 에러가 난다.

 

Spring AOP Proxy설정이 true여도 다음과 같은 상황이라면 에러가 난다.

1) 사용자가 service class를 final로 설정되어있다. (상속을 막음)

2) 생성자가 private으로 선언되어있다.

 

다음 포스팅은 Spring AOP Proxy에 대해 정리해보겠다.

[Spring/개념] - Spring AOP (Proxy)

 

======================================추가===================================

 

인터페이스를 사용할 경우 결합도가 느슨해져 프로그램은 더욱 유연해진다.

(객체 참조시 인터페이스 사용 이유)

 

인터페이스만 있으면 안되고 반드시 하나의 클래스 이상에서 인터페이스를 구현(재정의) 해야 한다.

 

@Autowired를 통해 인터페이스를 선언한 변수에 자동적으로 그 인터페이스를 재정의한 객체를 주입시킨다.

 

인터페이스를 구현한 구현클래스가 2개 이상일경우 어떤걸 주입해야할지 알 수 없어 예외가 발생한다.

 

@Qualifier 또는 @Resource 로 여러 개의 재정의한 클래스 중 특정 Bean을 가져오겠다. 라고 표시해야 합니다.

반응형

'Spring > 개념' 카테고리의 다른 글

[Spring] IoC 컨테이너 / Bean  (0) 2021.10.14
Spring AOP (Proxy)  (0) 2021.10.08
@Autowired 사용법  (0) 2021.10.06
[Spring] component-scan 사용이유  (0) 2021.10.05
DI(의존성 주입)  (0) 2021.10.03

관련글 더보기

댓글 영역

>