[Spring] 컴포넌트 스캔를 이용한 자동빈설정에서 인터페이스는 필요할까?

조시현·2023년 2월 17일

Spring

목록 보기
4/4

강의를 듣다가 원래는 DIP를 준수하고 역할과 구현을 분리하기 위해서 인터페이스를 사용하다가 어느 순간부터 인터페이스가 위주가 아니라 구현체를 위주로 사용하는 것을 보고 인터페이스가 굳이 필요한가 라는 생각이 들었다

질문

컴포넌트 스캔를 이용한 자동빈설정에서 인터페이스는 필요할까?

대답

https://velog.io/@hsw0194/Spring-Boot%EC%97%90%EC%84%9C-interface%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%B4%EC%95%BC-%ED%95%A0%EA%B9%8C

위의 글에 따르면 Spring에서 인터페이스를 만들 필요가 없다고한다.

interface가 필요없어진 이유

과거의 Spring에서 어노테이션이 작동하는 방식은 bean들을 위해 porxy를 만들고 그 proxy들에 필요한 로직을 추가하는 방식인 JDK dynamic proxies를 사용하였다. 이 방식은 오직 interface를 위해서 만들어 졌고, 이것이 예전에는 interface를 작성해줘야했던 이유다.

그러나 10년 전부터 Spring에 CGLIB proxying을 지원하며 interface가 필요하지 않아졌다.

그러나 interface를 사용하며 이점도 있는데

  1. interface를 통해서 다양한 구현체들을 효과적으로 관리할 수 있기 때문이다.

이럴 때 클래스간 느슨한 결합으로 인해 변화에 빠르게 적응 할 수있다.
이때, @Primary나 @Qualifier등을 사용하여서 사용하는 구현체를 명시적으로 설정해야한다.

  1. 제어의 역전 떄문이다.
    클래스에 있는 다양한 객체들을 컨트롤 해야하는 상황에서
    클래스 객체를 받아오는 대신 interface객체를 사용함으로써 헤당 클레스의 제어를 interface가 맡아준다..(?)

그러하면서 하나의 클래스에서 책임을 줄여주면서 역할을 명확히 함으로 인해 이점이 있다.

그럼 Test는??

몇몇 사람들은 dummy 구현체를 가지고 Test를 하기위해서 interface가 필요하다고 주장하는 사람이 있다.( 나도 이글을 보기전에는 그렇다고 생각했다)
그런데 Mockito같은 mocking 라이브러리가 이 문제를 해결해준다고한다. (아직 이정도 단계는 아닌거 같아 있구나 하고 넘어간다)

결론

spring에서 interfacer가 필요한가? 라고 하면 위의 글의 글쓴이와 같은 생각으로 필요 없는거 같다. 그치만 interface는 여전히 중요한 역할이 있기떄문에 사용을 해야한다고 생각한다. (interface는 도구이므로 잘 사용하면 좋다고 생각한다.)
(도구에 의존되지말자!!)


참조
https://velog.io/@hsw0194/Spring-Boot%EC%97%90%EC%84%9C-interface%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%B4%EC%95%BC-%ED%95%A0%EA%B9%8C

profile
Luck favors the prepared. Chance favors the prepared mind

0개의 댓글