본문 바로가기
카테고리 없음

[Spring] DI

by devinv 2023. 2. 24.
728x90

의존성 주입(Dependency Injection, DI)은 객체지향 프로그래밍에서 객체 간의 의존 관계를 느슨하게 만들기 위한 방법입니다. 즉, 객체가 다른 객체를 사용할 때 직접 객체를 생성하거나 참조하지 않고, 외부에서 필요한 객체를 주입받아 사용하는 것을 말합니다. 이를 통해 코드의 유연성과 확장성이 향상되며, 유닛 테스트를 수행하기 용이해지는 등의 이점이 있습니다.

 

Spring에서는 다음과 같은 대표적인 의존성 주입 방법을 제공합니다.

  • 생성자 주입(Constructor Injection) - 객체를 생성할 때 생성자를 이용해 필요한 의존 객체를 주입하는 방식입니다.
  • 세터 주입(Setter Injection) - 객체 생성 후 Setter 메소드를 이용해 의존 객체를 주입하는 방식입니다.
  • 필드 주입(Field Injection) - 객체 생성 후 필드에 직접 의존 객체를 주입하는 방식입니다.

Spring에서는 생성자 주입 방식을 권장합니다. 생성자 주입 방식을 사용하면, 객체가 생성될 때 필요한 의존 객체가 모두 주입되기 때문에, 객체 생성 이후에는 불변 상태를 유지할 수 있습니다. 또한, 필수적인 의존 객체가 주입되지 않았을 때는 객체를 생성할 수 없도록 만들 수 있어서 코드의 안정성을 높일 수 있습니다. Spring Boot에서는 생성자 주입 방식을 권장하는 경향이 있습니다. 이는 Spring Boot DI 컨테이너에서 객체를 생성할  생성자를 우선적으로 호출하기 때문입니다.

 

아래는 @RequiredArgsConstructor 어노테이션을 사용하여 생성자 주입을 하는 예제 코드입니다.

import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

@Service
@RequiredArgsConstructor
public class UserService {
    
    private final UserRepository userRepository;
    private final EmailService emailService;

    public void sendWelcomeEmail(Long userId) {
        User user = userRepository.findById(userId);
        emailService.sendWelcomeEmail(user.getEmail());
    }
}

 

 코드에서 @RequiredArgsConstructor 어노테이션은 UserService 클래스에서 사용된 final 키워드가붙은 userRepository emailService 필드에 대한 생성자를 자동으로 생성합니다. 이렇게 생성된 생성자를 통해 필드에 대한 의존성 주입이 이루어지게 됩니다.

728x90