먼저 레거시입니다.
클라이언트 클래스가 MemberRepository라는 인터페이스뿐만 아니라 MemoryMemberRepository라는 구체 클래스에도 의존하고 있다.
그래서 DIP, OCP를 위반하고 있다.
이해를 안갈 수 있으니 예를 들어보자. 만약 구체(구현) 클래스가 JpaRepository로 바뀌었다.
그러면 클라이언트 클래스 (MemberServiceImpl) 에서 new JpaRepository로 변경할 것이다.
의존관계에서 구체 클래스를 의존하고 있어 DIP를 위반하고 있다.
그리고 만약 구체 클래스를 변경하려면 클라이언트 클래스를 직접 수정해야 하므로 OCP를 위반한다.
문제를 해결하는 방법이다.
인터페이스에만 의존하는 방법으로 생성자를 통해 구현 객체를 주입(DI) 받는다.
하지만 이렇게만 하면 NullPointerException가 뜨게된다.
왜냐하면 인터페이스에만 의존하고 있기 때문이다.
해결하려면 누군가가 구현객체를 대신 생성하고 주입해줘야 한다.
그리고 AppConfig라는 클래스를 새로 만든 뒤 외부에서 의존성을 주입한다.
만약 의존관계를 변경시 클라이언트 클래스를 변경하지 않고 이 클래스를 수정하면 되는 것이다. (OCP위반 해결)
이렇게 수정을 하게 되면 MemberServiceImpl(클라이언트 클래스)는 인터페이스만 의존하게 된다. (DIP 위반 해결)
이렇게 AppConfig처럼
외부에서 객체를 생성하고 관리하면서 의존관계를 연결해주는 것을 DI 컨테이너라고 한다.
'Spring Framework' 카테고리의 다른 글
[Spring] Bean Validation (검증) - 1 (4) | 2024.10.31 |
---|---|
[Spring] 스프링 메시지, 국제화 (1) | 2024.10.29 |
[Spring] Argument Resolver 란? (0) | 2024.10.24 |
@Transactional을 선언해도 내부 메서드를 실행 시 ROLLBACK이 되지 않는 문제 (0) | 2024.08.03 |
객체 지향 설계의 5가지 원칙(SOLID) (0) | 2024.03.30 |