본문 바로가기
Web/Spring

의존성 주입(Dependency Injection, DI)이란?

by tabasco 2023. 5. 15.

의존성 주입(Dependency Injection, DI) 이란?

의존성 주입은 객체 간의 의존 관계를 관리하는 디자인 패턴입니다. 일반적으로 객체는 다른 객체와 협력하여 동작하기 때문에 이 과정에서 객체는 다른 객체에 의존하게 됩니다.

의존성 주입은 이러한 의존 관계를 개발자가 직접 생성하는 것이 아니라 프레임워크 또는 컨테이너가 주입하는 방식으로 처리합니다. 주입되는 방법은 크게 세 가지로 나눌 수 있습니다.

1. 생성자 주입(Constructor Injection)

생성자 주입은 의존성을 객체 생성 시에 생성자를 통해 주입하는 방식입니다. 생성자에 필요한 의존 객체를 매개변수로 전달받아 해당 객체를 초기화합니다.


예를 들어, 다음은 UserService 클래스가 UserRepository에 의존하며 생성자 주입을 사용한 예시입니다.

 

/* 생성자 주입 과정 예시 */
public class UserService {
    private UserRepository userRepository;

    public UserService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }
    
    // ...
}

 

2. 세터 주입(Setter Injection)

세터 주입은 의존성을 객체 생성 후 세터 메서드를 통해 주입하는 방식입니다.

주입할 의존 객체를 설정하기 위한 세터 메서드를 제공하고, 프레임워크는 이 세터 메서드를 호출하여 의존 객체를 주입합니다.

 

예를 들어, 다음은 UserService 클래스가 EmailService에 의존하며 세터 주입을 사용한 예시입니다.

/* Setter Injection 예시 */
public class UserService {
    private EmailService emailService;

    public void setEmailService(EmailService emailService) {
        this.emailService = emailService;
    }
    
    // ...
}

 

3. 필드 주입(Field Injection)

의존성을 필드로 직접 주입하는 방식입니다.

의존 객체를 바로 필드로 선언하고, 프레임워크가 이 필드에 의존 객체를 주입합니다.

주로 어노테이션을 사용하여 의존 객체를 식별합니다.


예를 들어, 다음은 UserService 클래스가 Logger에 의존하며 필드 주입을 사용한 예시입니다.

/* Field Injection 예시 */
public class UserService {
    @Autowired
    private Logger logger;
    
    // ...
}

 

Spring Framework에서는 XML 구성 파일, 어노테이션 또는 Java 설정 파일을 사용하여 의존성 주입을 설정합니다. 이를 통해 객체 간의 결합도를 낮추고, 유연하고 테스트 가능한 코드를 작성할 수 있습니다.

 

그럼 각 주입 방식은 어떤 상황에 사용해야 좋을까?

  1. 생성자 주입(Constructor Injection)
    • 의존성 객체가 필수적인 경우에 적합합니다. 즉, 해당 객체를 필수로 가져야 하는 경우 생성자 주입을 사용하는 것이 좋습니다.
    • 객체의 불변성(Immutability)을 보장할 수 있습니다. 생성자를 통해 의존성 객체를 주입받기 때문에, 의존성 객체는 객체 생성 후 변경되지 않습니다.
  2. 세터 주입(Setter Injection)
    • 선택적인 의존성을 가진 경우에 적합합니다. 즉, 해당 객체가 반드시 필요하지는 않지만 필요한 경우에 주입하는 것이 적절한 경우 세터 주입을 사용할 수 있습니다.
    • 유연한 의존성 주입이 필요한 경우에 사용될 수 있습니다. 다양한 의존성 객체를 주입할 수 있는 세터 메서드를 제공하므로, 런타임에 다른 객체를 주입하여 동작을 변경할 수 있습니다.
  3. 필드 주입(Field Injection)
    • 간단하고 깔끔한 코드를 작성하고자 할 때 사용할 수 있습니다. 필드 주입은 필드를 직접 주입받기 때문에 코드가 간결해지고 가독성이 좋아집니다.
    • 주입해야 하는 의존성 객체에 대한 별도의 세터 메서드나 생성자를 작성하지 않아도 됩니다.
    • 주로 Spring Framework의 @Autowired 어노테이션과 함께 사용되어 자동으로 의존성 객체를 주입받을 수 있습니다.
 
각 주입 방식의 선택은 개발자의 선호도나 프로젝트의 요구사항에 따라 달라질 수 있습니다.
일반적으로는 생성자 주입이 객체의 불변성과 의존성을 명확하게 표현하는 데 도움이 되므로 권장되는 방식입니다.
하지만 필드 주입이나 세터 주입은 유연성과 코드 가독성 측면에서 편리할 수 있으므로 특정 상황에서 적절하게 사용될 수 있습니다.

 

의존성 주입(DI) 관련해서는 @Autowired를 포함하여, Lombok 라이브러리에서 제공하는 다양한 어노테이션들이 존재하는데,
이는 다음 글에서 살펴보겠습니다.

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

우리가 Spring Framework을 사용하는 이유  (0) 2023.05.15