본문 바로가기
Java/Spring

[Spring] 의존성 주입(DI)

by 깨준 2024. 9. 22.

1. 의존성(의존 관계)이란?

객체를 생성 및 사용함에 있어, 하나의 객체가 다른 객체를 필요로 하는 상태(관계)

= 다른 객체를 참조

2. 의존성 주입(DI)이란?

객체 간의 관계(의존성)를 외부에서 결정해주는 방식으로,

객체를 직접 생성하는 대신 외부에서 생성한 후 주입하는 방법이다.

3. 의존성 주입의 장점

  1. 코드의 재사용성, 유연성이 높아진다. 하나의 작업만 수행하는 작은 객체는 많은 상황에서 재결합하고 재사용하기가 쉽기 때문이다.
  2. 객체간 결합도가 낮기 때문에 한 클래스를 수정했을 때 다른 클래스도 수정해야 하는 상황을 막아준다.
  3. 유지보수가 쉬우며 테스트가 용이해진다.
  4. 확장성을 가진다.

4. 의존성 주입의 3가지 방법

생성자 주입(Construct Injection)

의존성을 생성자의 매개변수로 전달받는 방법으로 객체가 생성될 때 필요한 의존성을 반드시 제공해야 하므로, 주입받은 의존성은 불변이다.(제일 선호)

public class Engine {
    // 엔진 관련 코드
}
=======================
public class Car {
    private final Engine engine;

    // 생성자를 통해 Engine 의존성을 주입받음
    public Car(Engine engine) {
        this.engine = engine;
    }
}

필드 주입(Field Injection)

클래스의 필드에 직접 @Autowired 어노테이션을 사용하여 의존성을 주입받는 방법입니다. 스프링이 자동으로 필드를 초기화합니다.

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class Car {
    @Autowired // 필드에 의존성을 주입
    private Engine engine;

    public void start() {
        // 엔진을 사용하여 차를 시작하는 코드
    }
}

 

세터 주입(Setter Injection)

의존성을 세터 메서드를 통해 주입받는 방법입니다. 객체가 생성된 후 필요한 의존성을 설정할 수 있습니다.

public class Car {
    private Engine engine;

    // 세터 메서드를 통해 Engine 의존성을 주입받음
    public void setEngine(Engine engine) {
        this.engine = engine;
    }

    public void start() {
        // 엔진을 사용하여 차를 시작하는 코드
    }
}
  • 생성자 주입: 필수 의존성을 주입받아 객체를 생성하며, 불변성을 유지할 수 있다.
  • 필드 주입: 코드가 간결하지만 가독성이 떨어질 수 있고, 테스트에 불리할 수 있다.
  • 세터 주입: 의존성을 선택적으로 주입받을 수 있지만, 초기화 순서에 주의해야 한다.

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

[Spring] DAO / DTO / VO  (0) 2024.09.22
[Spring] 스프링 빈(Bean)  (0) 2024.09.22
[Spring] 제어의 역전(IoC)  (0) 2024.09.22