회사에서 spring을 사용하면서 생긴 의문.
프로젝트에서 사용중인 spring 구조
1.Controller Service ServiceImpl DAO SQL
2.ServiceImpl DAO SQL
보기 쉬운건 2번이다. 처음 입사할 때부터 모르는 코드를 하나씩 다 찾아보면서 유지보수를 진행해보니 2번이 더 알아보기 쉬웠고 코드를 찾아가기도 쉬웠다.
그래서 오늘은 평소에 계속 의문이었던 1번 구조에 대해 왜 이렇게 사용하는지 정리해보려고 한다.
코드가 동작할 때 위와 같은 순서로 진행된다.
대부분의 프로젝트는 Service를 인터페이스로 설계하고 ServiceImpl에서 실제로 사용하기 위해 구현체를 생성해서 사용하는 방식으로 설계된다고 한다.
-> 추상화를 통한 구현 방식
객체지향의 특징 중 하나인 다형성과
객체지향의 다섯 가지 원칙 중 하나인 *OCP 원칙을
가장 잘 실현해주는 설계 방식
*OCP (Open Closed Principle)
개방, 폐쇄 원칙이라고 하며 '소프트웨어 개체(클래스, 모듈, 함수 등)는 확장에 대해 열려 있어야 하고, 수정에 대해서는 닫혀 있어야 한다.'는 프로그래밍 원칙입니다.
목적. 인터페이스와 구현체를 분리함으로써
1) 구현체를 독립적으로 확장 가능
2) 구현체 클래스를 변경하거나 확장하여도 이를 사용하는 클라이언트 코드에 영향을 주지 않기 위함
단점. (이 글을 쓰게 된 이유)
1) 코드 구조가 복잡
2) 인터페이스를 거쳐 구현체를 확인해야하는 번거로움
결론.
1) 인터페이스와 구현체가 1:1의 관계인 경우에는 굳이 추상화를 사용 할 필요가 없다.
2) 서비스 확장을 위해 추상화를 통하여 1:N의 방식으로 구조를 변경 할 수 있다.
*참고자료
https://multifrontgarden.tistory.com/97
https://see-one.tistory.com/1
https://wildeveloperetrain.tistory.com/49