본문 바로가기
Spring

[Spring] Service, 인터페이스 사용하는 이유?

by asdft 2024. 1. 25.

개요

지금 진행하고 있는 Socket 이라는 사이드프로젝트를 계획할때, 같은 백엔드 팀원과 최대한 객체지향성을 지키면서 코딩을 하자고 했었다. 그래서 Service에서도 인터페이스를 만들어 진행해 왔다.

이 부분에 대해서 조금더 자세히 파고들어가보자 한다.

 

그렇다면 왜 예전부터 서비스에 인터페이스를 습관적으로 사용하였을까?

예전에는 Spring 에서 AOP Proxy 를 만드는 방식이 JDK Dynamic Proxy 를 사용하여 인터페이스 기반으로만 만들게 되어 있었다. 예를 들어, 인터페이스가 있어야지 @Transactional 이런 어노테이션이 동작이 가능하기 때문이다. (AOP Proxy 만들어서 트랜잭션을 처리하기 때문에)

 

특정 버전부터 CGLIB 라이브러리를 사용하여, 클래스 기반으로 AOP Proxy 를 만들도록 지원을 하게 되었다.

그래서 개발자는 AOP Proxy를 만드는 방식을 선택을 할 수 있게 되었다.

 

SpringBoot 에서는 디폴트로 클래스 기반으로 만들도록 아래와 같이 설정되어 있다.

spring.aop.proxy-target-class=true
  • true : CGLIB를 사용하여, 클래스를 상속받아 AOP Proxy를 만든다
  • false : JDK Dynamic Proxy를 사용하여 인터페이스를 데코레이션 해서 AOP Proxy를 만든다

 

결론적으로 인터페이스 사용하는 이유는?

 

OOP 관점에서 봤을때 인터페이스는 다형성(Polymorphism) 혹은 개방 폐쇄 원칙 때문에 사용한다. 보통 흔히 얘기하는 느슨한 결합 혹은 유연해지도록 하기 위해 사용한다고 봐야 한다.

 

제 경험으로 봤을때 대부분의 Spring 프로젝트에서 Service 가 하나의 인터페이스에 하나의 구현체로 있는 것이 대부분이였다. 이 부분만 단편적으로 생각한다면 굳이 다형성이 필요한가? 라고 느꼈었다.

 

하지만 나는 조금더 느슨한 결합 즉, 프로그램이 유연하게 돌아가는것에 더 중요하다고 생각해 특별한 규칙이 없는 한 이 방식을 사용하려고 한다. 유연하고 변경이 용이하다는 점과 결합도가 높은 상태는 객체 지향적인 설계를 하는데 매우 불리하기 때문이다.

 

 

 

[참고]

https://www.codestates.com/blog/content/%EA%B0%9D%EC%B2%B4-%EC%A7%80%ED%96%A5-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-%ED%8A%B9%EC%A7%95