꾸준한 개발일기

스프링 의존관계 자동 주입 4가지 방법은? 본문

Programing/스프링

스프링 의존관계 자동 주입 4가지 방법은?

꾸개일 2025. 3. 23. 08:54
반응형

 

 

🔍 스프링 의존관계 자동 주입 4가지 방법

주입 방식 설명 장점 단점
생성자 주입 생성자를 이용한 주입 불변성 보장, 테스트 용이 의존성이 많아지면 코드가 길어질 수 있음
수정자(setter) 주입 setXxx() 메서드를 이용한 주입 선택적 의존성 주입 가능 필수 의존성을 보장할 수 없음
필드 주입 @Autowiredㄹ르 필드에 직접 사용 코드가 짧고 간단 테스트 및 유지보수 어려움(지양)
일반 메서드 주입 특정 메서드를 호출하여 주입 여러 의존성을 한 번에 주입 가능 필수 의존성이 보장되지 않음

1️⃣ 생성자 주입 (Constructor Injection) [권장]

  • 생성자를 통해 의존성을 주입하는 방식
  • 주입할 객체를 final로 선언 가능 → 불변성 보장
  • 순수한 Java 코드로도 테스트 가능

예제 코드

@Service
public class OrderService {
    private final MemberRepository memberRepository;

    @Autowired  // 생성자가 하나일 경우 생략 가능
    public OrderService(MemberRepository memberRepository) {
        this.memberRepository = memberRepository;
    }
}

 

특징

  • @Autowired 생략 가능 (스프링이 자동으로 주입)
  • 불변성 보장 (final 필드 사용 가능)
  • 순수 Java 코드로 테스트 가능

단점

  • 의존성이 많아지면 생성자 코드가 길어질 수 있음

2️⃣ 수정자(setter) 주입 (Setter Injection)

  • @Autowired를 setter 메서드에 붙여 주입하는 방식
  • 선택적 의존성(필수가 아닌 의존성)을 주입할 때 유용
  • 런타임 중에 변경 가능하여 주의 필요

예제 코드

 
@Service
public class OrderService {
    private MemberRepository memberRepository;

    @Autowired
    public void setMemberRepository(MemberRepository memberRepository) {
        this.memberRepository = memberRepository;
    }
}

 

특징

  • @Autowired(required = false) 설정을 통해 선택적 주입 가능
  • 의존성을 변경할 수 있어 유연성이 있음

단점

  • 필수 의존성이 보장되지 않음 (객체 없이 실행될 수도 있음)
  • 불변성이 깨질 가능성이 있음

🚨 3️⃣ 필드 주입 (Field Injection) [지양]

  • 필드에 직접 @Autowired를 붙여 주입하는 방식
  • 코드가 간결하지만 테스트 및 유지보수 어려움
  • 외부에서 객체를 변경할 방법이 없어 테스트가 어려움

예제 코드

@Service
public class OrderService {
    @Autowired
    private MemberRepository memberRepository;
}

 

특징

  • 코드가 짧고 간단

단점 (지양해야 하는 이유)

  • 순수한 Java 코드로 테스트 불가능 (객체 주입 불가)
  • DI 프레임워크 없이는 사용 불가능
  • 객체 변경이 불가능해 유연성이 떨어짐

필드 주입은 사용하지 않는 것이 좋음. 대신 생성자 주입을 사용하는 것이 좋음.


4️⃣ 일반 메서드 주입 (Method Injection)

  • 임의의 메서드에 @Autowired를 붙여 주입하는 방식
  • 한 번에 여러 개의 의존성을 주입할 때 사용 가능

예제 코드

@Service
public class OrderService {
    private MemberRepository memberRepository;
    private DiscountPolicy discountPolicy;

    @Autowired
    public void init(MemberRepository memberRepository, DiscountPolicy discountPolicy) {
        this.memberRepository = memberRepository;
        this.discountPolicy = discountPolicy;
    }
}

 

특징

  • 여러 의존성을 한 번에 주입 가능

단점

  • 필수 의존성이 보장되지 않음
  • 생성자 주입보다 사용 빈도가 낮음

🎯 결론: 언제 어떤 방법을 써야 할까?

주입 방식 사용 추천 여부
생성자 주입 가장 권장됨 (불변성 보장, 테스트 용이)
수정자(setter) 주입 ⭕ 선택적 의존성 주입이 필요할 때
필드 주입 테스트 및 유지보수 어려움 → 사용 지양
일반 메서드 주입 ⭕ 여러 개의 의존성을 한 번에 주입할 때

 

💯 정답: 웬만하면 생성자 주입을 사용하라!

 

반응형
Comments