I. 의존성 주입 동작 원리 : 스프링은 어떻게 빈(Bean)을 찾는가?
- 객체와 타입 : Java에서는 클래스(Class)가 곧 타입(Type)이다.
public class ItemRepository
는ItemRepository
라는 새로운 타입을 정의하는 것이다. - 주입 대상 : DI는 클래스 내부의 특정 요소가 아닌, 클래스 설계도로 만들어진 객체(Object) 전체를 주입한다. 주입된 객체의
public
메서드를 통해 내부 기능에 접근한다. - 주입 원칙: 스프링은 기본적으로 타입(Type)을 보고 주입할 Bean을 찾는다.
- 만약 해당 타입의 Bean이 여러 개라면(
DiscountPolicy
예시),@Primary
어노테이션이 붙은 Bean을 우선적으로 선택하거나,@Qualifier
를 통해 특정 이름의 Bean을 지정하여 주입한다.
- 만약 해당 타입의 Bean이 여러 개라면(
II. 의존성 주입과 인터페이스 : 개방-폐쇄 원칙(OCP)의 실현
- OCP (개방-폐쇄 원칙): DI가 '기능 변화와 확장'에 유리한 이유는, "기존 코드는 수정하지 않고(Closed), 새로운 클래스를 추가하여(Open)" 시스템의 동작을 바꿀 수 있기 때문이다.
- 인터페이스의 역할: 이러한 OCP를 제대로 실현하고 느슨한 결합을 극대화하기 위해 인터페이스 사용이 거의 필수적이다. 클라이언트는 구체적인 구현 클래스가 아닌 역할(인터페이스)에만 의존하게 되어, 구현체를 손쉽게 교체할 수 있다.
- 구체 클래스 의존: 기술적으로 인터페이스 없이 구체 클래스를 직접 주입하는 것도 가능하지만, 이는 OCP를 위반하여 유연성과 테스트 용이성을 크게 떨어뜨리므로 권장되지 않는다.
III. 관점의 확장 : 객체 지향 DI와 함수형 프로그래밍
- 공통점: DI의 목적은 '동작(Behavior)을 외부에서 주입하여 교체'할 수 있게 하는 것이다. 이는 함수형 프로그래밍에서 고차 함수(Higher-Order Function)에 다른 함수를 인자로 전달하는 것과 본질적으로 같은 아이디어다.
- 차이점: 객체 지향 DI는 데이터와 동작을 캡슐화한 객체를 단위로, 함수형 프로그래밍은 순수한 동작인 함수를 단위로 다룬다는 점에서 표현 방식의 차이가 있다.
'Spring' 카테고리의 다른 글
인스턴스 생명 주기와 애너테이션 : 한눈에 보기 - 콜백 (1) | 2025.06.09 |
---|---|
스프링 프레임워크의 동작 방식 (2) | 2025.06.09 |
[2편] 스프링 DI의 3가지 방식 : 생성자 주입을 써야만 하는 이유 (0) | 2025.06.03 |
[1편] 의존성 주입(DI)과 제어의 역전(IoC), 왜 필요할까? (0) | 2025.06.02 |
✨ 스프링 빈(Bean) 조회: 컨테이너 객체 활용 가이드 (0) | 2025.05.29 |