스프링 컨텍스트: 빈 작성

김우진·2026년 2월 17일

Spring

목록 보기
3/17
post-thumbnail

[Spring] 03. 스프링 컨텍스트: 빈 작성과 의존성 주입(DI)

빈을 정의하는 것을 넘어, 빈과 빈 사이의 관계를 설정하는 와이어링(Wiring)의존성 주입(Dependency Injection)에 대해 정리했습니다.


1. 빈 간의 관계 설정 (Wiring)

구성 클래스(@Configuration) 내에서 빈 사이의 관계를 맺어주는 방법입니다.

  • 직접 호출 방식: 하나의 @Bean 메서드에서 다른 @Bean 메서드를 직접 호출합니다. 스프링은 컨테이너에 이미 해당 빈이 있다면 새로 생성하지 않고 기존 빈을 반환합니다.
  • 매개변수 방식: 메서드의 매개변수로 다른 빈을 정의하면, 스프링이 컨텍스트에서 해당 빈을 찾아 자동으로 주입해 줍니다.

2. @Autowired를 이용한 3가지 주입 방식

가장 많이 쓰이는 의존성 주입 방법들입니다.

① 필드 주입 (Field Injection)

  • 클래스 필드 위에 바로 @Autowired를 붙입니다.
  • 단점: 필드를 final로 선언할 수 없어 객체 변경이 가능해지며, 유지보수와 테스트가 어렵습니다.

② 생성자 주입 (Constructor Injection) ✅ 권장

  • 생성자를 통해 의존성을 주입받습니다.
  • 장점: 필드를 final로 선언할 수 있어 불변성을 보장합니다. 클래스에 생성자가 하나뿐이라면 @Autowired를 생략할 수 있습니다.

③ Setter 주입 (Setter Injection)

  • Setter 메서드 위에 @Autowired를 붙입니다. 상황에 따라 의존성을 선택적으로 주입해야 할 때 사용합니다.

3. 순환 의존성 (Circular Dependency)

  • 현상: A가 B를 의존하고, B가 다시 A를 의존하는 것처럼 서로가 서로를 참조하는 상황입니다.
  • 결과: 스프링 실행 시 예외가 발생하며 애플리케이션이 구동되지 않습니다.
  • 해결: 설계를 다시 검토하여 의존 관계를 분리하거나 재작성해야 합니다.

4. 여러 빈 중 선택하기 (Ambiguity 해결)

동일한 타입을 가진 빈이 여러 개일 때, 스프링은 어떤 빈을 주입해야 할지 고민에 빠집니다. 이때 해결 방법 3가지입니다.

  1. 파라미터 이름 매칭: 매개변수 이름을 등록된 빈의 이름과 동일하게 작성합니다.
  2. @Qualifier 사용: 명시적으로 어떤 빈을 사용할지 이름을 지정합니다.
    public Person person(@Qualifier("parrot2") Parrot parrot) {
        p.setParrot(parrot);
    }
  3. @Primary 사용: 여러 후보 중 "이게 기본이야!"라고 우선순위를 부여합니다.

💡 요약

  • 의존성 주입은 객체 간의 결합도를 낮춰준다.

  • 가능하면 생성자 주입을 사용하여 객체의 안정성을 높이자.

  • 같은 타입의 빈이 여러 개라면 @Qualifier@Primary로 명확하게 지시하자.

#Spring #DependencyInjection #Autowired #ConstructorInjection #백엔드공부

0개의 댓글