[Basic-3] 관심사의 분리와 의존관계 주입(DI)

2025. 12. 30. 12:58·Spring/Core

 앞선 글에서 살펴본 것처럼, 구현 객체가 스스로 다른 구현 객체를 생성하고 연결하는 구조는 DIP와 OCP 원칙을 위반한다. 이 문제를 해결하기 위해 애플리케이션의 전체 동작 방식을 구성하고 객체 간의 관계를 설정하는 별도의 존재가 필요하다.


1. 관심사의 분리 (Separation of Concerns)

 애플리케이션을 하나의 공연이라고 가정해본다. 이전의 설계는 로미오 역할을 맡은 배우가 줄리엣 역할을 할 배우를 직접 초빙하는 것과 같았다. 즉, 배우가 연기라는 본연의 책임 외에 '상대 배우 캐스팅'이라는 과도한 책임까지 지고 있었던 것이다.

  • 배우: 자신의 배역을 수행하는 것에만 집중해야 한다. 어떤 상대 배우가 오더라도 똑같이 공연할 수 있어야 한다.
  • 공연 기획자: 공연을 구성하고, 담당 배우를 섭외하며, 역할에 맞는 배우를 지정하는 책임을 진다.

이처럼 객체의 '생성 및 연결' 책임과 '실행' 책임을 명확히 분리하는 것이 객체 지향 설계의 핵심이다.


2. AppConfig의 도입

애플리케이션의 실제 동작에 필요한 구현 객체를 생성하고 연결하는 책임을 가지는 별도의 설정 클래스, AppConfig를 도입한다.

public class AppConfig {
    public MemberService memberService() {
        // 생성자 주입을 통해 구현체를 전달한다.
        return new MemberServiceImpl(memberRepository());
    }

    public OrderService orderService() {
        return new OrderServiceImpl(
            memberRepository(),
            discountPolicy());
    }

    public MemberRepository memberRepository() {
        return new MemoryMemberRepository();
    }

    public DiscountPolicy discountPolicy() {
        // 나중에 정책이 바뀌면 이 부분만 수정하면 된다.
        return new FixDiscountPolicy();
    }
}

변화된 서비스 코드 (생성자 주입)

 MemberServiceImpl과 OrderServiceImpl은 이제 구체적인 클래스(MemoryMemberRepository 등)를 전혀 몰라도 된다. 단지 생성자를 통해 어떤 객체가 주입될지만 기다리면 된다.

public class MemberServiceImpl implements MemberService {
    private final MemberRepository memberRepository;

    // 설계 변경으로 이제 인터페이스에만 의존한다. (DIP 준수)
    public MemberServiceImpl(MemberRepository memberRepository) {
        this.memberRepository = memberRepository;
    }
}

3. 새로운 구조의 장점

AppConfig의 등장으로 애플리케이션은 사용 영역과 구성(Configuration) 영역으로 명확히 나뉘게 된다.

  1. DIP 완성: 클라이언트 코드는 추상화(인터페이스)에만 의존하며, 구체 클래스를 몰라도 된다.
  2. OCP 완성: 할인 정책을 변경하더라도 사용 영역의 코드는 단 한 줄도 수정할 필요가 없다. 오직 구성 영역(AppConfig)의 코드만 변경하면 된다.
  3. 책임의 명확화: 각 객체는 자신의 로직을 실행하는 데만 집중할 수 있게 되었다.

4. 제어의 역전(IoC)과 의존관계 주입(DI)

이 과정에서 핵심적인 두 가지 개념이 정립된다.

4.1. 제어의 역전 (Inversion of Control, IoC)

기존 프로그램은 구현 객체가 스스로 프로그램의 제어 흐름을 조종했다. 하지만 AppConfig 도입 이후, 구현 객체는 자신의 로직을 실행할 뿐이며 프로그램의 제어 흐름은 AppConfig가 가져간다. 이렇듯 제어권이 외부로 넘어가는 것을 제어의 역전이라고 한다.

4.2. 의존관계 주입 (Dependency Injection, DI)

애플리케이션 실행 시점(Runtime)에 외부에서 실제 구현 객체를 생성하고 클라이언트에 전달하여, 클라이언트와 서버의 실제 의존관계가 연결되는 것을 의미한다.

  • 정적인 클래스 의존관계: 소스 코드 상에서 import 문만 보고 파악할 수 있는 관계.
  • 동적인 객체 인스턴스 의존관계: 실행 시점에 결정되는 객체 참조값의 연결.

5. 결론: 이제 스프링으로

 지금까지 순수한 자바 코드만으로 훌륭한 객체 지향 설계를 완성하였다. AppConfig와 같은 존재를 IoC 컨테이너 또는 DI 컨테이너라고 부른다. 이제 이 수동적인 과정을 스프링 프레임워크가 어떻게 자동화하고 관리해주는지, 본격적인 스프링의 세계로 넘어갈 준비가 되었다.

'Spring > Core' 카테고리의 다른 글

[Basic-5] 싱글톤 컨테이너와 CGLIB의 동작 원리  (0) 2025.12.30
[Basic-4] 스프링 컨테이너의 생성과 빈 관리 메커니즘  (0) 2025.12.30
[Basic-2] 순수 자바 예제로 이해하는 DIP와 OCP 위반  (0) 2025.12.30
[Basic-1] 객체 지향 설계와 스프링의 탄생 배경  (0) 2025.12.30
[Practice-3] Spring Core: 깔끔하고 확장성 있는 예외 처리  (1) 2025.12.16
'Spring/Core' 카테고리의 다른 글
  • [Basic-5] 싱글톤 컨테이너와 CGLIB의 동작 원리
  • [Basic-4] 스프링 컨테이너의 생성과 빈 관리 메커니즘
  • [Basic-2] 순수 자바 예제로 이해하는 DIP와 OCP 위반
  • [Basic-1] 객체 지향 설계와 스프링의 탄생 배경
h6bro
h6bro
백엔드 개발자의 기술 블로그
  • h6bro
    Jun's Tech Blog
    h6bro
  • 전체
    오늘
    어제
    • 분류 전체보기 (241) N
      • Java (18)
        • Core (9)
        • Design Pattern (9)
      • Spring (80)
        • Core (24)
        • MVC (6)
        • DB (10)
        • JPA (26)
        • Monitoring (3)
        • Security (11)
        • WebSocket (0)
      • Database (33)
        • Redis (15)
        • MySQL (18)
      • MSA (16)
        • MSA 기본 (11)
        • MSA 아키텍처 (5)
      • Kafka (30) N
        • Core (18) N
        • Connect (12)
      • ElasticSearch (11)
        • Search (11)
        • Logging (0)
      • Test (4)
        • k6 (4)
      • Docker (9)
      • CI&CD (10)
        • GitHub Actions (6)
        • ArgoCD (4)
      • Kubernetes (18)
        • Core (12)
        • Ops (6)
      • Cloud Engineering (4)
        • AWS Infrastructure (3)
        • AWS EKS (1)
        • Terraform (0)
      • Project (8)
        • LinkFolio (1)
        • Secondhand Market (7)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

    • Cloud Engineering 포스팅 정리
  • 인기 글

  • 태그

    ㅈ
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
h6bro
[Basic-3] 관심사의 분리와 의존관계 주입(DI)
상단으로

티스토리툴바