의존성 주입(DI)

CHM·2022년 6월 9일
0

Spring

목록 보기
7/26

DI의 개념

  • 각 클래스 간의 의존관계를 빈 설정(Bean Definition) 정보를 바탕으로 컨테이너가 자동으로 연결해주는 것
  • 컨테이너가 흐름의 주체가 되어 애플리케이션 코드에 의존관계를 주입해줌.
  • DI를 이용하면 개발자들은 단지 빈 설정파일에서 의존관계가 필요하다는 정보를 추가하기만 하면 된다.
  • 객체 레퍼런스를 컨테이너로부터 주입받아서, 실행 시에 동적으로 의존관계가 생성됨.

DI의 장점

  • 객체 생성, 소멸 시의 오버헤드가 없어짐.
  • 코드의 간결화
  • 컴포넌트 간의 결합도가 제거된다. -> 설정 파일에서 인터페이스만 바라보면 된다.

DI의 유형

Setter Injection

  • Setter를 이용한 의존성 삽입
  • 빈 설정 파일 수정 - property 태그 사용
    • name : property 명
    • ref : 주입될 bean 이름
<bean id="helloService" class="kr.co.acomp.hello.service.HelloService">
    <property name="helloDAO" ref="helloDAO"></property>
</bean>
  • 구현체에 의존성을 입력 받는 setter 메서드를 만들고 이를 통해 의존성을 주입한다.
public class HelloService { 
	
    private HelloDAO helloDAO;

    public void setHelloDAO(HelloDAO dao) {
        this.helloDAO = dao;
    }

    public int calcTwoNumbers(int a, int b) {
        return helloDAO.addTwoNumber(a,b);
    }
}

Constructor Injection

  • 생성자를 이용한 의존성 삽입
  • 빈 설정 파일 수정 - constructor-arg 태그 사용
    • ref : 주입될 bean 이름
<bean id="helloService" class="kr.co.acomp.hello.service.HelloService">
    <constructor-arg ref="helloDAO"/>
</bean>
  • 필요한 의존성을 포함하는 클래스의 생성자를 만들고 이를 통해 의존성을 주입한다.
public class HelloService { 
    public HelloDAO helloDAO;

    public HelloService(HelloDAO hellodao) {
        this.helloDAO = dao;
    }

    public int calcTwoNumbers(int a, int b) {
        return helloDAO.addTwoNumber(a,b);
    }
}

Method Injection

  • 일반 메서드를 이용한 의존성 삽입
  • 의존성을 입력 받는 일반 메서드를 만들고 이를 통해 의존성을 주입한다.

Spring DI 컨테이너

(= Spring 컨테이너, DI 컨테이너)

  • Spring DI 컨테이너가 관리하는 객체를 빈이라고 하고, 이 빈들을 관리하는 의미로 컨테이너를 빈 팩토리(Bean Factory)라고 한다.
  • Bean Factory : 객체의 생성과 객체 사이의 런타임 관계를 DI 관점에서 볼 때 컨테이너
    • Bean을 등록, 생성, 조회, 반환 관리
    • 보통은 Bean Factory를 바로 사용하지 않고, 이를 확장한 Application Context를 사용
    • getBean()메서드가 정의되어 있음
  • Application Context : Bean Factory에 여러 가지 컨테이너 기능을 추가한 것
    • Spring의 각종 부가 서비스를 추가로 제공
    • Spring이 제공하는 Application Context 구현 클래스는 여러 종류가 있음.

0개의 댓글