본문 바로가기
강의 실습/스프링 핵심 원리 - 기본편

다양한 의존관계 주입 방법

by jint 2026. 4. 24.

4가지의 의존관계 주입 방법
1) 생성자 주입
2 )수정자 주입(setter 주입)
3 )필드 주입
4 )일반 메서드 주입


1. 생성자 주입
생성자 주입 : 생성자를 통해 의존 관계 주입
· 생성자 호출 시점에 딱 1번만 호출되는 것이 보장
· 불변, 필수 의존관계에 사용
· 빈 등록하며 의존관계 주입도 같이 일어남

- src/main/java/hello/core/order/OrderServiceImpl.java

@Component
public class OrderServiceImpl implements OrderService {

    private final MemberRepository memberRepository;
    private final DiscountPolicy discountPolicy;

    @Autowired // 생략 가능
    public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy discountPolicy) {
        this.memberRepository = memberRepository;
        this.discountPolicy = discountPolicy;
    }

}


final 은 값이 무조건 있어야 함을 언어적으로 세팅.
생성자엔 값을 무조건 채워 넣는다.

스프링 빈이면서 생성자가 딱 1개만 있으면 @Autowired를 생략해도 자동 주입


2. 수정자 주입(setter 주입)
수정자 주입(setter 주입) : setter라 불리는 필드의 값을 변경하는 수정자 메서드를 통해 의존관계 주입
· 선택, 변경 가능성이 있는 의존관계에 사용
· 자바빈 프로퍼티 규약의 수정자 메서드 방식을 사용하는 방법
· 빈 등록된 후 의존관계 주입할 때 setter가 호출됨

- src/main/java/hello/core/order/OrderServiceImpl.java

@Component
public class OrderServiceImpl implements OrderService {

    private MemberRepository memberRepository;
    private DiscountPolicy discountPolicy;

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

    @Autowired
    public void setDiscountPolicy(DiscountPolicy discountPolicy) {
        this.discountPolicy = discountPolicy;
    }

}


스프링은 2가지 라이프 사이클로 나뉜다.
1) 빈 등록
2) 의존관계 주입

* 참고1
@Autowired 기본 동작은 주입 대상이 없으면 오류 발생.
@Autowired(required = false) : 주입할 대상 없어도 동작하도록 설정

* 참고2
자바빈 프로퍼티
자바빈 프로퍼티 규약 : 필드의 값을 직접 변경하지 않고 setXxx(), getXxx() 메서드를 통해 값을 읽거나 수정하는 규칙 (자바의 과거부터 있던 규칙)

자바빈 프로퍼티 규약 예시)
- Data.java

class Data {

    private int age;

    public void setAge(int age) {
        this.age = age;
    }

    public int getAge() {
        return age;
    }

}



3. 필드 주입
필드 주입 : 필드에 바로 의존관계 주입
· 코드가 간결하지만 외부에서 변경이 불가능하여 테스트가 힘듦
· DI 프레임워크가 없으면 아무것도 할 수 없음
· 사용하지 않는 것을 권장
사용시, 애플리케이션의 실제 코드와 관계 없는 테스트 코드나, 스프링 설정을 목적으로 하는 @Configuration 이 있는 곳에서만 특별한 용도로 사용

- src/main/java/hello/core/order/OrderServiceImpl.java

@Component
public class OrderServiceImpl implements OrderService {

    @Autowired private MemberRepository memberRepository;
    @Autowired private DiscountPolicy discountPolicy;

}


* 참고1
순수한 자바 테스트 코드에서 @Autowired 동작 안하니, @SpringBootTest 처럼 스프링 컨테이너를 테스트에 통합한 경우에만 가능

* 참고2
@Bean 파라미터의 의존관계는 자동 주입된다. 수동 등록시 자동 등록된 빈의 의존 관계가 필요할 때 문제 해결 가능

 

@Bean
OrderService orderService(MemberRepository memberRepoisitory, DiscountPolicy discountPolicy) {
    return new OrderServiceImpl(memberRepository, discountPolicy);
}



4. 일반 메서드 주입
일반 메서드 : 일반 메서드를 통해서 의존관계 주입
· 한 번에 여러 필드 주입 가능
· 잘 사용하지 않음

- src/main/java/hello/core/order/OrderServiceImpl.java

@Component
public class OrderServiceImpl implements OrderService {

    private MemberRepository memberRepository;
    private DiscountPolicy discountPolicy;

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

}


* 참고
의존관계 자동 주입은 스프링 컨테이너가 관리하는 스프링 빈이어야 동작한다.
스프링 빈이 아닌 클래스에 @Autowired 코드를 적용하면 동작하지 않는다.


참고링크 : https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B8%B0%EB%B3%B8%ED%8E%B8?cid=325969

 

스프링 핵심 원리 - 기본편| 김영한 - 인프런 강의

현재 평점 5.0점 수강생 49,563명인 강의를 만나보세요. 스프링 입문자가 예제를 만들어가면서 스프링의 핵심 원리를 이해하고, 스프링 기본기를 확실히 다질 수 있습니다. 스프링 기본 기능, 스프

www.inflearn.com

'강의 실습 > 스프링 핵심 원리 - 기본편' 카테고리의 다른 글

생성자 주입을 선택해라!  (0) 2026.04.26
옵션 처리  (0) 2026.04.25
중복 등록과 충돌  (0) 2026.04.23
필터  (0) 2026.04.22
탐색 위치와 기본 스캔 대상  (0) 2026.04.21

댓글