BE/Spring & Spring Boot

[Spring Boot] 스프링의 생성자 주입

baek-dev 2025. 3. 19. 18:58

스프링(Spring)의 생성자(Constructor) 주입이란?

 

스프링(Spring)에서 생성자 주입(Constructor Injection)이란, 객체를 생성할 때 스프링이 필요한 의존성(변수)을 생성자의 매개변수(parameter)를 통해 주입해주는 것을 의미함.

 

즉, 클래스가 의존하는 객체를 클래스 스스로 생성하는 것이 아니라, 스프링 컨테이너가 대신 생성하여 클래스의 생성자를 통해 전달하는 방식임.

 


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

 

생성자 주입을 제대로 이해하려면 우선 의존성 주입(DI)의 개념을 알아야 함.

 

의존성 주입이란 객체가 직접 의존하는 다른 객체를 생성하지 않고, 외부(스프링 컨테이너)로부터 제공받는 방법임.

 

스프링에서는 의존성을 다음과 같은 방법으로 주입할 수 있음:

생성자 주입(Constructor Injection)

필드 주입(Field Injection)ㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇ

세터 주입(Setter Injection)

 

그 중에서도 생성자 주입을 권장하는 이유는 다음과 같음:

불변성 보장: 한 번 주입된 객체가 변경될 일이 없어서 안정적임.

명확한 의존관계 표현: 생성자의 매개변수를 보면 어떤 객체에 의존하고 있는지 쉽게 알 수 있음.

테스트 용이성: 필요한 객체만 생성자를 통해 전달하면 테스트하기 편함.

 


📌 생성자 주입의 원리와 사용법

 

스프링은 클래스가 생성될 때 자동으로 필요한 객체를 생성자에 전달함.

 

예를 들어 아래처럼 UserService라는 클래스가 UserRepository라는 클래스를 의존할 때 생성자 주입 방식으로 표현하면 다음과 같음:

 

✅ 예제 코드

@Service
public class UserService {

    private final UserRepository userRepository;

    // 생성자 주입
    @Autowired
    public UserService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }
}

위 코드에서 UserService는 직접 UserRepository를 생성하지 않고 생성자를 통해 전달받음.

스프링 컨테이너가 UserRepository 객체를 자동으로 생성하여 주입해줌.

 


📌 Spring 4.3 이후부터의 개선점

 

스프링 4.3 이후 버전부터는 생성자가 하나뿐일 경우@Autowired 어노테이션을 생략할 수 있게 되었음. 다음 코드도 동일한 결과를 보여줌:

 

✅ 예제 코드 (개선된 버전)

@Service
public class UserService {

    private final UserRepository userRepository;

    // 생성자 하나만 존재 시 @Autowired 생략 가능
    public UserService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }
}

 

 


📌 스프링에서 생성자 주입의 동작 원리

 

스프링 컨테이너가 실행될 때 일어나는 과정은 다음과 같음.

1. 스프링 컨테이너가 실행되면서 애플리케이션 내의 모든 클래스들을 스캔함.

2. 컴포넌트 스캔을 통해 @Component, @Service, @Repository, @Controller 등으로 표시된 클래스를 찾음.

3. 찾은 클래스의 객체(Bean)를 생성함.

4. 생성 시 해당 클래스의 생성자에 필요한 의존성(다른 Bean)이 있는지 확인함.

5. 필요한 의존성을 먼저 생성하여 객체를 주입함.

6. 최종적으로 객체가 완성되면 이를 컨테이너에 관리함.

 

즉, 스프링이 각 클래스의 객체 생성을 책임지기 때문에 개발자는 객체 간의 의존관계만 설정하면 됨.

 


📌 생성자 주입의 장점 정리

명확성: 어떤 객체가 필수적으로 필요한지 명확하게 알 수 있음.

불변성: 생성 시점에만 주입되어 객체 상태가 안정적임.

테스트 용이성: 생성자에 Mock 객체를 넣어 유연하게 테스트할 수 있음.

순환 의존성 방지: 잘못된 객체 간의 순환참조를 방지할 수 있음.

 


📌 생성자 주입 시 주의할 점

생성자 파라미터가 너무 많으면 복잡해질 수 있음

→ 의존성이 너무 많다면 설계를 재검토해야 함.

순환 참조(Circular Dependency) 발생 시 문제될 수 있음

→ 순환 의존성을 가지지 않도록 설계를 구성해야 함.

 


📌 생성자 주입과 필드 주입, 세터 주입 비교

구분 생성자 주입 필드 주입 세터 주입
명확성 ✅ 매우 높음 ❌ 낮음 ⚠️ 보통
불변성 ✅ 보장됨 ❌ 보장되지 않음 ❌ 보장되지 않음
테스트 용이성 ✅ 높음 ❌ 낮음 ⚠️ 보통
순환참조 방지 ✅ 가능 ❌ 어려움 ⚠️ 어려움
권장 여부 ✅ 적극 권장 ❌ 권장하지 않음 ⚠️ 가끔 사용

따라서 스프링 공식적으로도 생성자 주입 방식을 적극 권장함.

 


📌 간단히 요약하면:

생성자 주입이란 클래스 생성 시 스프링이 생성자를 통해 필요한 의존성을 제공하는 방법임.

명확성, 불변성, 테스트 용이성 면에서 우수하여 적극 권장됨.

스프링 4.3 이후 버전부터 생성자가 하나면 @Autowired 어노테이션을 생략할 수 있어 더 편리해짐.

 

 

 

 

출처 : ChatGPT

'BE > Spring & Spring Boot' 카테고리의 다른 글

[Spring Boot] DAO  (0) 2025.03.30
[Spring Boot] ApplicationContext  (0) 2025.03.23
[Spring Boot] Spring AI  (0) 2025.03.13
[Spring Boot] DispatcherServlet  (0) 2025.03.07
[Spring Boot] 스프링 배치 (Spring Batch)  (0) 2025.03.01