별 개수: 50
속도: 2

JavaScript

웹 개발의 필수 언어

동적인 웹 페이지 구현을 위한 핵심 프로그래밍 언어.

Java

객체지향 프로그래밍

안정적이고 확장성 있는 백엔드 개발의 대표 언어.

HTML

웹의 기초

웹 페이지의 구조를 정의하는 마크업 언어.

React

현대적 UI 라이브러리

효율적인 사용자 인터페이스 구축을 위한 JavaScript 라이브러리.

CSS

웹 디자인의 핵심

웹 페이지의 시각적 표현을 담당하는 스타일 언어.

Spring

자바 웹 프레임워크

기업급 애플리케이션 개발을 위한 강력한 프레임워크.

JavaScript

웹 개발의 필수 언어

동적인 웹 페이지 구현을 위한 핵심 프로그래밍 언어.

Java

객체지향 프로그래밍

안정적이고 확장성 있는 백엔드 개발의 대표 언어.

HTML

웹의 기초

웹 페이지의 구조를 정의하는 마크업 언어.

React

현대적 UI 라이브러리

효율적인 사용자 인터페이스 구축을 위한 JavaScript 라이브러리.

CSS

웹 디자인의 핵심

웹 페이지의 시각적 표현을 담당하는 스타일 언어.

Spring

자바 웹 프레임워크

기업급 애플리케이션 개발을 위한 강력한 프레임워크.

JavaScript

웹 개발의 필수 언어

동적인 웹 페이지 구현을 위한 핵심 프로그래밍 언어.

Java

객체지향 프로그래밍

안정적이고 확장성 있는 백엔드 개발의 대표 언어.

HTML

웹의 기초

웹 페이지의 구조를 정의하는 마크업 언어.

React

현대적 UI 라이브러리

효율적인 사용자 인터페이스 구축을 위한 JavaScript 라이브러리.

CSS

웹 디자인의 핵심

웹 페이지의 시각적 표현을 담당하는 스타일 언어.

Spring

자바 웹 프레임워크

기업급 애플리케이션 개발을 위한 강력한 프레임워크.

Spring

[3편] 좋은 DI 설계: 스프링의 빈 탐색 원리와 OCP

lamarcK 2025. 6. 3. 12:58

I. 의존성 주입 동작 원리 : 스프링은 어떻게 빈(Bean)을 찾는가?

  • 객체와 타입 : Java에서는 클래스(Class)가 곧 타입(Type)이다. public class ItemRepositoryItemRepository라는 새로운 타입을 정의하는 것이다.
  • 주입 대상 : DI는 클래스 내부의 특정 요소가 아닌, 클래스 설계도로 만들어진 객체(Object) 전체를 주입한다. 주입된 객체의 public 메서드를 통해 내부 기능에 접근한다.
  • 주입 원칙: 스프링은 기본적으로 타입(Type)을 보고 주입할 Bean을 찾는다.
    • 만약 해당 타입의 Bean이 여러 개라면(DiscountPolicy 예시), @Primary 어노테이션이 붙은 Bean을 우선적으로 선택하거나, @Qualifier를 통해 특정 이름의 Bean을 지정하여 주입한다.

II. 의존성 주입과 인터페이스 : 개방-폐쇄 원칙(OCP)의 실현

  • OCP (개방-폐쇄 원칙): DI가 '기능 변화와 확장'에 유리한 이유는, "기존 코드는 수정하지 않고(Closed), 새로운 클래스를 추가하여(Open)" 시스템의 동작을 바꿀 수 있기 때문이다.
  • 인터페이스의 역할: 이러한 OCP를 제대로 실현하고 느슨한 결합을 극대화하기 위해 인터페이스 사용이 거의 필수적이다. 클라이언트는 구체적인 구현 클래스가 아닌 역할(인터페이스)에만 의존하게 되어, 구현체를 손쉽게 교체할 수 있다.
  • 구체 클래스 의존: 기술적으로 인터페이스 없이 구체 클래스를 직접 주입하는 것도 가능하지만, 이는 OCP를 위반하여 유연성과 테스트 용이성을 크게 떨어뜨리므로 권장되지 않는다.

III. 관점의 확장 : 객체 지향 DI와 함수형 프로그래밍

  • 공통점: DI의 목적은 '동작(Behavior)을 외부에서 주입하여 교체'할 수 있게 하는 것이다. 이는 함수형 프로그래밍에서 고차 함수(Higher-Order Function)에 다른 함수를 인자로 전달하는 것과 본질적으로 같은 아이디어다.
  • 차이점: 객체 지향 DI는 데이터와 동작을 캡슐화한 객체를 단위로, 함수형 프로그래밍은 순수한 동작인 함수를 단위로 다룬다는 점에서 표현 방식의 차이가 있다.