loop-study
개발 공부할래?
loop-study
전체 방문자
오늘
어제
  • 분류 전체보기 (186)
    • 목표 및 회고 (25)
    • 세미나 & 워크샵 (1)
    • 교육 및 인강 (67)
      • TDD, Clean Code with Java (5)
      • ATDD, 클린 코드 with Spring (6)
      • DDD 세레나데 (3)
      • 인프라 공방 (6)
      • 이규원의 현실 세상의 TDD (19)
      • 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술 (18)
      • 스프링 MVC 2편 - 백엔드 웹 개발 활용 기술 (0)
      • 모든 개발자를 위한 HTTP 웹 기본 지식 - 김영한 (8)
      • 코딩으로 학습하는 GoF의 디자인 패턴 (1)
      • 스프링 시큐리티 완전정복 6.x (1)
    • 서적 (62)
      • 객체지향의 사실과 오해 (1)
      • 객체지향과 디자인패턴 (7)
      • 만들면서 배우는 클린 아키텍처 (3)
      • 테스트 주도 개발로 배우는 객체 지향 설계와 실천 (1)
      • 오브젝트: 코드로 이해하는 객체지향 설계 (17)
      • 리팩토링 : 코드 구조를 체계적으로 개선하여 효율적인 리팩터링 구현하기 (0)
      • 토비의 스프링 (3)
      • 엔터프라이즈 애플리케이션 아키텍처 패턴 (9)
      • 개발자의 글쓰기 (1)
      • 소프트웨어 장인 (17)
      • Real MySQL 8.0 (2)
      • JVM 밑바닥까지 파헤치기 (0)
    • 개발 & 방법론 (29)
      • Java (13)
      • TDD (5)
      • ATDD (3)
      • DDD (6)
      • 인프라 (2)
      • SQL (0)
    • 개인이야기 (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

  • 백엔드 로드맵

인기 글

태그

  • 인프라공방
  • 스터디
  • nextstep
  • 마틴 파울러
  • 김영한
  • 모든 개발자를 위한 HTTP 웹 기본 지식
  • Patterns of Enterprise Application Architecture
  • 테스트 주도 개발
  • 조영호
  • 스프링
  • 넥스트스탭
  • ATDD
  • java
  • 자바
  • study
  • JUnit
  • fastcampus
  • 소프트웨어 장인
  • 오브젝트
  • TDD
  • 객체지향
  • 엔터프라이즈 애플리케이션 아키텍처 패턴
  • 추상화
  • 백기선
  • DDD 세레나데
  • 장인정신
  • 이규원
  • 인프런
  • Test Driven Development
  • 현실세상의 TDD

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
loop-study

개발 공부할래?

서적/객체지향과 디자인패턴

챕터6, DI(Dependency Injection)와 서비스 로케이터

2021. 6. 4. 15:44

📖책의 내용을 요약하니 자세한 부가설명이 궁금하시면 보시는걸 추천드립니다. 📖

 

객체 지향과 디자인 패턴 - 교보문고

■ 책에서 다루는 내용- 객체 지향 (객체, 책임, 의존, 캡슐화)- 다형성과 추상화- 상속보단 조립- SOLID 설계 원칙- DI와 서비스 로케이터- 주요 디자인 패턴■ 베타 리더들의 서평책 전반에서 상황

www.kyobobook.co.kr


로버트 C 마틴(Robert C. Martin)은 소프트웨어를 두 개의 영역으로 구분해서 설명한다.

- 고수준 정책 및 저수준 구현을 포함한 애플리케이션 영역

- 어플리케이션이 동작하도록 각 객체들을 연결해 주는 메인 영역

 

1. 어플리케이션 영역과 메인 영역

SOLID 설계 원칙으로 프로그램을 개발하다보면 클라이언트는 고수준 모듈을 의존하지만 실제로 사용할 때 콘크리트 클래스의 객체가 필요하다. 

class Worker {
    
    public void run() {
        JobQueue jobQueue = ...;
        Transcoder transcoder = ...;
        ...
    }
}

 

실제 객체를 구할 방법으로 Locatoer라는 객체를 사용하기로 결정했다.

class Worker {

    public void run() {
        JobQueue jobQueue = Locator.getInstance().getJobQueue();
        Transcoder transcoder = Locator.getInstance().getTranscoder();
        ...
    }
}

여기서 의문점이 생긴다. 누가 Locator를 초기화 해주고 Worker를 생성할까?

 

메인(main) 영역이 등장한다. 메인 영역은 다음과 같은 일을 한다.

- 어플리케이션 영역에서 사용될 객체를 생성한다.

- 각 객체 간의 의존 관계를 설정한다.

- 어플리케이션을 실행한다.

 

public class Main {

    public static void main(String[] args) {
        // 상위 수준 모듈에서 사용될 하위 수준 모듈 객체 생성
        JobQueue jobQueue = new FileJobQueue();
        
        // 상위 수준 모듈이 하위 수준 모듈을 사용할 수 있도록 Locator 초기화 
        Locator locator = new Locator(jobQueue);
        Locator.init(locator);
        
        ...
    }
}

메인 영역의 역할을 보면 알 수 있듯이 모든 의존은 메인 영역에서 어플리케이션 영역으로 향한다. 반대의 경우 어플리케이션 영역에서 메인 영역으로이 의존은 존재하지 않는다.

따라서 어플리케이션에서 사용될 객체를 교체하기 위해 메인 영역의 코드를 수정해도 영향을 끼치진 않는다.

그리고 어플리케이션에서 사용될 객체를 제공하는 책임을 갖는 객체를 서비스 로케이터(Service Locator)라고 부른다.

단, 객체를 직접 찾는 서비스 로케이터는 몇 가지 단점이 존재하여 외부에서 사용할 객체를 주입해 주는 DI(Dependency Injection) 방식이 일반적이다.

 


2. DI(Dependency Injection)을 이용한 의존 객체 사용

DI는 필요한 객체를 외부에서 넣어주는 방식으로 사용할 객체를 전달받을 방법을 제공하면 DI 준비는 끝난다.

* 스프링 프레임워크가 DI 프레임워크다

 

2.1 생성자 방식과 설정 메서드 방식

생성자 방식은 생성자를 통해서 의존 객체를 전달 받는다.

class Worker {
    private JobQueue jobQueue;

    public Worker(JobQueue jobQueue) {
        this.jobQueue = jobQueue;
    }
    ...
}

생성자 방식은 객체를 생성하는 시점에 모든 의존 객체를 준비할 수 있다. 객체가 정상적으로 동작함을 보장받을 수 있다.

 

설정 메서드 방식은 메서드를 통해 의존 객체를 받는다.

class Worker {
    private JobQueue jobQueue;

    public void setJobQueue(JobQueue jobQueue) {
        this.jobQueue = jobQueue;
    }
    ...
}

설정 메서드 방식은 생성 후 의존 객체를 주입받는다. 실수할 경우 의존 객체를 주입하지 않고 사용하여 NullPointerException이 발생할 수 있다.

 

2.2 DI와 테스트

DI는 의존 객체를 Mock객체로 쉽게 대체할 수 있도록 함으로써 단위 테스트를 돕는다.

 


3. 서비스 로케이터를 이용한 의존 객체 사용

(* 단점만 진행하겠다)

 

3.2 서비스 로케이터의 단점

서비스 로케이터의 가장 큰 단점은 의존 객체마다 제공 메서드를 만들어야 하며 이는 콘크리트 클래스에 직접 의존하는 것과 동일한 효과를 발생시킨다. 

즉, 서비스 로케이터는 변경의 유연함을 떨어뜨리는 문제를 갖게 된다. 

'서적 > 객체지향과 디자인패턴' 카테고리의 다른 글

객체지향과 디자인패턴 마무리 후기  (0) 2021.06.04
챕터5, 설계 원칙 : SOLID  (0) 2021.06.03
챕터4, 재사용 : 상속보단 조립  (0) 2021.06.03
챕터3, 다형성과 추상 타입  (0) 2021.06.03
챕터2, 객체지향  (0) 2021.06.02
    '서적/객체지향과 디자인패턴' 카테고리의 다른 글
    • 객체지향과 디자인패턴 마무리 후기
    • 챕터5, 설계 원칙 : SOLID
    • 챕터4, 재사용 : 상속보단 조립
    • 챕터3, 다형성과 추상 타입
    loop-study
    loop-study
    오늘도 공부하자

    티스토리툴바