-
Spring에서 Service class를 만들때 반드시 Interface를 구현해야할까Spring 2020. 2. 28. 16:05
일반적으로 Spring에서 xxxService를 만들 때 아래와 같은 방식을 주로 사용한다.
interface UserService { }
class UserServiceImpl implement UserService { }
하지만 아래와 같이 만들면 안되는걸까?
class UserService { }
의존관계 주입(DI)의 기본 개념에 따르면, 인터페이스를 사이에 둬서 클래스 레벨에서는 의존관계가 고정되지 않게 하고,
런타임 시에 의존할 오브젝트와의 관계를 다이나믹하게 주입해주는 것이 맞다. 따라서 인터페이스를 사용하지 않았다면
엄밀히 말해서 온전한 DI라고 볼 수 없다.
그러나 스프링의 DI는 넓게 보자면 객체의 생성과 관계설정에 대한 제어권한을 오브젝트에서 제거하고
외부로 위임했다는 IoC라는 개념을 포괄한다. 그런 의미에서는 위 UserService를 Controller에서 주입 받아 사용한다는 것은
Spring DI의 기본을 따르고 있다고 볼 수 있다.
그렇지만 인터페이스를 사용해서 클래스를 자유롭게 변경할 수는 없게 되었고, UserService와 Controller가 강한 응집도를 갖게 된다.
위 경우는 UserService의 변경 예상 요소가 통째로 변경해야된다면 굳이 인터페이스를 두지 않고 강력한 결합을 가진 관계를
허용하면서 객체를 싱글톤으로 만드는 것과 빈으로 등록해서 DI 되도록 만들어서 사용해도 좋다.
단, 이런 클래스를 바로 사용하는 코드 구성을 DI에 적용하는 것은 가장 마지막 단계에서 고려해볼 사항임을 잊지 말자.
단순히 인터페이스를 만들기가 귀찮으니까 그냥 클래스를 사용하자는 건 잘못된 생각이다.
- 참고 : 토비의 스프링
'Spring' 카테고리의 다른 글
Spring IoC와 DI에 관하여 (0) 2023.02.20 Spring Boot 구글 OAuth2 로그인 구현 방법(spring-securify-oauth2) (0) 2023.02.16 Spring에서 DBMS별 mybatis LIKE문 사용법 (0) 2019.03.13 [Mybatis ] 클래스[ex)DTO] 를 새로 만들지 않고도 파라미터 2개 넘기는 방법 (0) 2019.03.12 Spring(Java) 실행시간 측정 (0) 2019.03.08