Spring Bean

2025. 6. 9. 22:01Java/Spring

Spring Bean

  • Spring IoC(Inversion of Control) 컨테이너에 의해 관리되는 자바 객체
  • 재사용 가능한 소프트웨어 컴포넌트
  • 객체를 직접 new 키워드로 생성하지 않고, Spring Container가 대신 Life Cycle 관리
  • 즉, 스프링 간 객체가 의존관계를 관리

@Bean 어노테이션을 사용한 빈 등록

@Configuration - 설정 클래스

  • Spring 설정 정보를 담는 클래스임을 표시하는 어노테이션
  • 컨테이너 초기화 시점에 해당 클래스 내용이 해석
  • 내부에 @Bean 메서드들을 포함할 수 있음
  • Bean에 추가 설정을 주지 않는 이상, 무조건 싱글톤 보장
  • XML 설정 파일을 Java 코드로 대체

@Bean - Bean 등록

  • 메서드가 컨테이너에 등록한 Bean을 생성함을 표시하는 어노테이션
  • 예시 코드 (@Configuration 클래스 정의 → @Bean 메서드 생성)
@Configuration
public class ProjectConfig {

// 이 클래스는 Spring 설정을 담고 있습니다
// Bean 정의들을 포함
    @Bean
    Parrot parrot() {
        var p = new Parrot();
        p.setName("Koko");
        return p;
    }
}
  • 컨텍스트 초기화 및 빈 추출
  • public class Main { public static void main(String[] args) { var context = new AnnotationConfigApplicationContext(ProjectConfig.class); Parrot p = context.getBean(Parrot.class); System.out.println(p.getName()); // 출력: Koko } }

@Component - 자동으로 Bean으로 등록할 클래스임을 표시

  • @ComponentScan이 이 어노테이션을 찾아서 자동으로 Bean 등록
  • @ComponentScan - 자동으로 Bean으로 등록하도록 지시
    • 지정된 패키지에서 @Component, @Service, @Repository, @Controller 등을 스캔
    • 찾은 클래스들을 자동으로 Spring Container에 Bean으로 등록
    • "자동 Bean 등록"의 핵심 메커니즘
@Component // 빈 이름: parrot (클래스명의 camelCase)
public class Parrot {
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
@Configuration
@ComponentScan(basePackages = "org.scoula.domain")  
// org.scoula.domain 패키지와 하위 패키지에서 @Component, @Service, @Repository 등을 찾아서 Bean으로 등록
public class ProjectConfig3 {

   // 별도의 @Bean 메소드 없이도 @ComponentScan이 자동으로 Bean들을 등록해줌
   // org.scoula.domain 패키지의 모든 @Component 계열 어노테이션이 붙은 클래스들이 
   // Spring Container에 Bean으로 등록됨
}

@PostContruct

  • Bean이 생성되고 의존성 주입이 완료된 후 자동으로 실행될 메소드를 지정하는 어노테이션
  • Bean 생성 직후 한 번만 자동 실행
  • 의존성 주입이 완료된 상태에서 실행
@Component
public class Parrot {
    private String name;

    @PostConstruct
    public void init() {
        this.name = "Kiki";
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

🔑 스프링 빈 간의 관계 설정

  • IoC Container
  • Spring Container : IoC Container를 Spring ****방식으로 구현한 실제 시스템
  • Dependency Injection
  • Bean Wiring

1. @Bean 메서드 간 직접 호출 방식

@Configuration
public class ProjectConfig {

    @Bean
    public Parrot parrot() {
        Parrot p = new Parrot();
        p.setName("Koko");
        return p;
    }

    @Bean
    public Person person() {
        Person p = new Person();
        p.setName("Ella");
        **p.setParrot(parrot()); // Parrot 빈을 반환하는 메서드 직접 메서드 호출**
        return p;
    }
}

2. 매개변수를 통한 의존성 주입

  • 코드가 더 명확함
  • 스프링이 자동으로 의존성 해결
  • 메서드 직접 호출보다 권장되는 방식
@Configuration
public class ProjectConfig {

    @Bean
    public Parrot parrot() {
        Parrot p = new Parrot();
        p.setName("Koko");
        return p;
    }

    @Bean
    public Person person(**Parrot parrot**) { **// 매개변수로 빈 주입**
        Person p = new Person();
        p.setName("Ella");
        **p.setParrot(parrot);**
        return p;
    }
}

3. @Autowired - 필드 기반 의존성 주입

  • 지정된 필드/메서드(setter, 생성자)에 적절한 Bean을 찾아서 자동으로 주입
  • 스프링 컨테이너에서 타입이 맞는 Bean을 찾아서 자동 연결

4. 생성자 기반 의존성 주입

  • 더 안전한 방식 final 필드 사용 가능하여 불변성 보장
  • 가장 권장되는 방식

5. Setter 기반 의존성 주입

 

@Qualifier - 대상 지정

  • 같은 타입의 Bean이 여러 개 있을 때 특정 Bean을 선택해서 주입받기 위한 어노테이션
  • Bean 이름을 직접 지정하여 모호함 해결
public class Person3 {
    private String name = "Ella";
    private final Parrot parrot;

    public Person(@Qualifier("parrot2") Parrot parrot) {
        this.parrot = parrot;
    }
    ...
}

참고자료

'Java > Spring' 카테고리의 다른 글

Spring MVC  (0) 2025.06.12