본문 바로가기
Java/Spring

[Spring] 스프링 빈(Bean)

by 깨준 2024. 9. 22.

1. 빈(Bean)이란?

의존성 주입을 하기 위해서, IoC 컨테이너가 관리하는 자바 POJO 객체

2. POJO(Plain Old Java Object)란?

복잡한 프레임워크나 특정한 구조에 얽매이지 않고 순수한 자바 객체

3. Bean 등록 방법

1. XML

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd">
       
    <!-- 빈 설정 시작 -->
    <bean id="myService" class="com.example.MyService" />
    <!-- id는 빈의 이름을 정의, class는 생성할 객체의 클래스를 지정 -->

</beans>

전통적인 방식이지만 요즘 사용 X

 

2. 자바 코드로 직접 스프링 빈 등록(@Bean & @Configuration) → 수동 빈

  • @Configuration: 해당 클래스가 스프링 빈을 구성하는 클래스임을 나타낸다. 이 클래스 안에는 여러 개의 @Bean 메서드가 있을 수 있다.
  • @Bean: 해당 메서드가 반환하는 객체를 스프링 컨테이너에 빈으로 등록한다는 의미. 즉, 이 메서드를 통해 직접 정의한 객체가 스프링의 관리 대상이 된다
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration // 이 클래스가 스프링 설정 클래스임을 명시 (스프링 빈을 정의할 수 있는 클래스)
public class AppConfig { // AppConfig 클래스는 스프링 빈 설정을 담고 있는 클래스

    @Bean // 이 메서드가 반환하는 객체를 스프링 컨테이너의 빈으로 등록
    public MyService myService() { // MyService라는 이름의 빈을 생성하는 메서드
        return new MyService(); // MyService 객체를 생성하여 반환, 이 객체는 스프링이 관리하는 빈이 됨
    }
}

클래스와 메서드를 통해 명시적으로 스프링 빈을 정의하고 관리

3. 컴포넌트 스캔과 자동 의존관계 설정(@Component & @Autowired) → 자동 빈

  • @Component: 스프링이 관리해야 하는 클래스로, 스프링의 컴포넌트 스캔에 의해 자동으로 빈으로 등록된다.
  • @Autowired: 스프링이 자동으로 의존성 주입을 처리해주는 어노테이션이다. 이 어노테이션을 통해, 스프링 컨테이너에 등록된 빈이 해당 필드나 생성자에 자동으로 주입된다.
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component // 이 클래스를 스프링 빈으로 등록하기 위한 어노테이션
public class MyController { // MyController 클래스는 스프링 컨테이너에 의해 관리되는 빈이 됨

    private final MyService myService; // MyService 타입의 의존성을 가짐

    @Autowired // 스프링이 MyService 빈을 자동으로 주입하도록 하는 어노테이션 (생성자 주입 방식)
    public MyController(MyService myService) { // MyController 생성자에서 MyService를 받아서 의존성을 설정함
        this.myService = myService; // 주입된 MyService를 필드에 할당
    }

    public void execute() { // 실제로 MyService의 메서드를 실행하는 메서드
        myService.doSomething(); // 주입된 MyService 객체의 doSomething 메서드를 호출
    }
}

컴포넌트 스캔은 Spring이 @Component로 지정된 클래스를 자동으로 탐색하고 스프링 컨테이너에 빈으로 등록하는 방식이다. @Autowired를 사용하면, 스프링이 자동으로 해당 클래스의 의존성을 주입한다. (필요한 빈을 자동 주입)

4. 컴포넌트 스캔의 대상

@Component 외에 @Controller, @Service, @Repository, @Configuration는 @Component의 상속을 받고 있으므로 모두 컴포넌트 스캔의 대상이다.

  1. @Controller
    •     스프링 MVC 컨트롤러로 인식된다.
  2. @Repository
    •     스프링 데이터 접근 계층으로 인식하고 해당 계층에서 발생하는 예외는 모두 DataAccessException으로 변환한다.
  3. @Service
    •     특별한 처리는 하지 않으나, 개발자들이 핵심 비즈니스 계층을 인식하는데 도움을 준다.
  4. @Configuration
    •     스프링 설정 정보로 인식하고 스프링 빈이 싱글톤을 유지하도록 추가 처리를 한다. (물론 스프링 빈 스코프가 싱글톤이 아니라면 추가 처리를 하지 않음.)

5. @Bean vs @Component

  1. @Bean
    •     개발자가 컨트롤이 불가능한 외부 라이브러리들을 Bean으로 등록하고 싶은 경우에 사용
  2. @Component
    •     개발자가 직접 컨트롤이 가능한 클래스들의 경우에 사용

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

[Spring] DAO / DTO / VO  (0) 2024.09.22
[Spring] 의존성 주입(DI)  (0) 2024.09.22
[Spring] 제어의 역전(IoC)  (0) 2024.09.22