-
[Spring boot] Service와 ServiceImpl의 분리프로젝트/아카이뷰 2024. 1. 16. 21:22
Service와 ServiceImpl의 분리 왜 궁금했을까❓
SSAFY 1학기 때, Service와 ServiceImple와 같이 구현체와 인터페이스를 나누어 구조를 설계하면 구현체를 독립적으로 확장할 수 있으며, 구현체 클래스를 변경하거나 확장해도 클라이언트의 코드에 영향을 주지 않아 다형성과
개방-폐쇄 원칙(OCP)을 지향하는 설계를 했다. ArchiVIEW의 경우 Service와 ServiceImpl이 1:1로 이루어져 굳이 분리해야 될까라는 의문이 들어 학습해 보려고 한다.Service와 ServiceImpl 분리하는 이유
1. OOP의 다형성과 개방-폐쇄 원칙(OCP)
- 위에서 언급했던 것처럼 Service와 ServiceImpl을 분리함으로써 구현체는 독립적이고 확장이 자유롭다.
- 구현체의 클래스를 변경하거나 확장해도 클라이언트의 응답에는 영향을 주지 않는다.
2. AOP Proxy
- 과거 Spring에서 AOP Proxy를 구현할 때, JDK Dynamic Proxy를 사용했는데 인터페이스를 구현한 객체에 대해서만 AOP Proxy를 생성이 가능했다.
2번의 경우 Spring 3.2 / Spring Boot 1.4 버전부터는 CGLIB를 기본적으로 포함하여 클래스를 기반으로 프록시 객체를 생성할 수 있게 됐다. 그러므로 1번의 이유로 과거부터 분리해서 사용한 것임을 알 수 있다.
ArchiVIEW에서의 문제점
ArchiVIEW 프로젝트의 경우 Service와 ServiceImpl이 1:1로 이루어져 있어서 불필요한 계층 구조를 만들고 추상화로 인해 코드가 복잡해진다.
이러한 근거를 가지고 백엔드 팀원들과 함께 이야기를 해보았는데 추후 리팩토링과 확장성 그리고 프로젝트 규모가 작아서 코드가 딱히 복잡하지 않다는 점을 고려하여 분리하기로 결정이 나서 분리하기로 했다.
'프로젝트 > 아카이뷰' 카테고리의 다른 글
[Spring boot] NoArgsConstructor에 Protected를 쓰는 이유 (0) 2024.01.18 [Spring boot] Controller Payload 유효성 검증 (0) 2024.01.17 [Spring boot] 유저 인증 처리 (0) 2024.01.15 [Spring boot] JPA(Java Persistence API) (0) 2024.01.13 [Spring boot] Error Handling (1) 2024.01.10