본문 바로가기
☕Java/Spring

스프링 프로젝트에서 service 인터페이스나 serviceImpl 클래스를 사용하는 이유와 사용해야 하는지 여부

by 캔 2022. 11. 26.

 

Do I need an interface with Spring boot?

In this blog post, we discover whether we have to use an interface when writing services with Spring boot.

dimitri.codes

항상 서비스 인터페이스와 구체 클래스를 만들어 다른 클래스에 주입해야 한다고 묻는다면, 답은 X이다.

 

서비스 클래스를 교체해야 하는 경우가 아니라면 굳이 서비스 인터페이스를 만들어서 사용할 필요가 없다. 과거에는 스프링이 JDK Dynamic proxy를 사용해서 프록시를 생성하려면 인터페이스가 필요했지만 최근 버전의 스프링 프레임워크들은 CGLIB 프록시를 지원하고 권장하기 때문에 인터페이스가 필요하지 않다. 이런 이유를 제외하고 서비스와 컨트롤러 간의 결합도를 낮출 수 있다는 점이 있지만 의존하는 서비스가 하나인 시점에서 서비스를 인터페이스로 만드는 것은 코드의 복잡성을 높이고 개발자에게 불편함을 주기만 할 거 같다는 것이 원문 글쓴이의 생각이다.

 

레거시한 코드들에서는 서비스 구체 클래스(*ServiceImpl 클래스들)가 하나만 존재함에도 관습적으로 서비스 인터페이스를 사용하는 경우가 많다. 하지만 구체 클래스를 변경할 필요가 없다면 사용을 재고하는 것이 좋을 거 같다. 미래에 언젠가 확장할지도 모른다는 것은 YAGNI(You Aren't Going to Need It) 원칙에 어긋난다는 것을 명심하자.