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의 상속을 받고 있으므로 모두 컴포넌트 스캔의 대상이다.
- @Controller
- 스프링 MVC 컨트롤러로 인식된다.
- @Repository
- 스프링 데이터 접근 계층으로 인식하고 해당 계층에서 발생하는 예외는 모두 DataAccessException으로 변환한다.
- @Service
- 특별한 처리는 하지 않으나, 개발자들이 핵심 비즈니스 계층을 인식하는데 도움을 준다.
- @Configuration
- 스프링 설정 정보로 인식하고 스프링 빈이 싱글톤을 유지하도록 추가 처리를 한다. (물론 스프링 빈 스코프가 싱글톤이 아니라면 추가 처리를 하지 않음.)
5. @Bean vs @Component
- @Bean
- 개발자가 컨트롤이 불가능한 외부 라이브러리들을 Bean으로 등록하고 싶은 경우에 사용
- @Component
- 개발자가 직접 컨트롤이 가능한 클래스들의 경우에 사용
'Java > Spring' 카테고리의 다른 글
[Spring] DAO / DTO / VO (0) | 2024.09.22 |
---|---|
[Spring] 의존성 주입(DI) (0) | 2024.09.22 |
[Spring] 제어의 역전(IoC) (0) | 2024.09.22 |