2024. 7. 13. 22:12ㆍ프레임워크(Framework)/Spring
영한님 강의를 듣던 중 서비스를 인터페이스로 생성하고 이에 대한 구현체를 따로 만드시는 것을 보고 이렇게 하는 이유에 대한 궁금증이 생겼다.
참고로 위의 사진을 설명하자면
- 인터페이스: MemberService는 서비스가 제공해야 할 기능(메서드)을 정의한다.
- 구현체: MemberServiceImpl은 그 기능을 실제로 구현하는 클래스이다.
이렇게 서비스 단에서 인터페이스와 그에 대한 구현체를 만드는 이유는 4가지가 있다.
1. 유연한 설계 및 느슨한 결합
코드를 변경하는 범위가 최소화되어 유지보수가 쉬워진다.
나중에 MemberService의 구현체를 변경해야 하는 상황을 생각해보자.
예를 들어, 현재 데이터베이스를 MySQL에서 MongoDB로 변경하고 싶을 때, 인터페이스가 없다면 모든 클라이언트 코드에서 MemberSevice의 구현체를 직접 사용하고 있을 것이다.
하지만 인터페이스를 사용하면 클라이언트 코드는 인터페이스에 의존하고, 실체 구현체는 쉽게 변경할 수 있다.
2. 테스트 용이성
테스트 환경에서 외부 시스템(ex: 데이터베이스)에 의존하지 않고, 독립적으로 테스트를 수행할 수 있다.
MemberService를 테스트할 때, 실제 데이터베이스에 접근하는 구현체를 사용하는 대신 Mock 객체를 사용하고 싶을 수 있다.
이 때, 인터페이스가 있으면 Mock 객체를 MemberService 인터페이스에 구현하도록 만들고, 테스트 시에 이를 주입할 수 있다.
3. 다형성 활용
다양한 구현체를 동일한 방식으로 사용할 수 있어 코드의 재사용성과 확장성이 높아진다.
어플리케이션의 초기 버전에서는 간단한 로컬 메모리 기반의 MemberService 구현체를 사용하다가, 나중에 성능 향상이 필요해지면 Redis나 다른 캐시 솔루션을 사용하는 구현체로 교체할 수 있다.
이 때, 인터페이스를 통해 클라이언트 코드를 수정하지 않고도 쉽게 구현체를 변경할 수 있다.
4. 명확한 계약 정의
협업 시 역할 분담이 명확해지고, 코드의 일관성과 가독성이 높아진다.
팀 내에서 여러 개발자가 함께 작업할 때, 인터페이스를 통해 각 서비스가 제공해야 할 기능을 명확히 정의할 수 있다.
이를 통해 각 개발자는 인터페이스를 기준으로 자신의 작업을 진행할 수 있다.
'프레임워크(Framework) > Spring' 카테고리의 다른 글
[Spring] 컨테이너에 등록된 빈 조회 방법 (0) | 2024.07.16 |
---|---|
[Spring] Entity 클래스에서 생성자, getter, setter를 선언하는 이유 (0) | 2024.07.13 |
[Spring] IntelliJ Live template (0) | 2024.04.18 |
[Spring Boot] WebSecurityConfigurerAdpater 지원 안함 (0) | 2024.03.18 |
[JUnit5 오류] mustache 한글만 출력 오류 인코딩 오류 (0) | 2024.03.15 |