Spring
[Spring] 스프링 컨테이너(Spring Container), 스프링 빈(Bean), 빈 설정 방법(XML, Java 기반, Annotation 기반)
cloud-grace
2024. 6. 4. 23:40
스프링 빈(Spring Bean)
- 스프링 빈(Spring Bean)은 스프링 컨테이너에 등록하여 관리하는 자바 객체이다.
- 스프링의 IoC는 제어의 역전에서 객체 생성과 제어권을 스프링에게 넘겨주는 것이다. 여기서 사용자가 new 연산으로 객체를 생성하는 것이 아닌, 스프링에 의해 관리되는 자바 객체를 사용하며, 이를 빈(Bean)이라고 한다.
- 또한, 자바 어플리케이션 동작을 책임지는 객체들은 독립적이지 않고 상호작용하여 동작한다. 서로 상호작용하는 객체들은 서로 의존 관계를 가진다. 따라서 스프링 컨테이너에 생성된 빈들에게 의존성 주입(Dependency Injection)을 해주는 역할도 가지고 있다.
스프링 컨테이너(Spring Container)
- 스프링에서 빈(객체)들을 관리하는 공간이며, 빈의 생성부터 소멸까지 관리해준다.
- 빈의 생명 주기를 관리하고 이 객체들에게 추가적인 기능도 제공한다.
- 또한, 의존성 주입을 통해 애플리케이션 컴포넌트들을 관리하며, 서로 다른 빈들을 연결하여 애플리케이션의 빈을 연결해주는 역할을 한다.
- 스프링 컨테이너는 ApplicationContext이며, IoC 컨테이너 혹은 DI 컨테이너라고도 부른다.
스프링 컨테이너 종류
1. BeanFactory
- 빈 팩토리(BeanFactory)는 스프링 컨테이너의 최상위 인터페이스이다.
- 빈 등록, 생성, 조회 등의 관리 역할을 맡고, getBean() 메서드로 빈을 인스턴스화도 할 수 있다.
- BeanFactory 계열의 인터페이스만 구현한 클래스는 단순 객체 생성 및 DI 기능만 제공한다.
- 또한, 팩토리 디자인 패턴을 구현한 것이다. 주로, BeanFactory보다 이를 확장한 ApplicationContext를 사용한다.
2. ApplicationContext
- 애플리케이션 컨텍스트(ApplicationContext)는 BeanFactory의 기능을 상속받아 제공한다.
- 빈 관리 기능은 BeanFactory가 제공하고, 그 외의 부가 기능들은 ApplicationContext가 제공한다.
- 부가 기능
- MessageSource : 메시지 다국화 인터페이스
- EnvironmentCapable : 개발, 운영, 환경 변수 등으로 나누어 수행하고, 애플리케이션을 구동할 때 필요한 정보를 관리하는 인터페이스
- ApplicationEventPublisher : 이벤트 관련 기능 인터페이스
- ResourceLoader : 클래스 패스, 파일, 외부 리소스를 편하게 조회하는 인터페이스
스프링 컨테이너 사용하는 이유
- 객체 생성을 위해 new 생성자를 사용하면 객체 수가 많아질수록 서로를 참조하는 객체가 많아진다.
- 이는 자연스레 의존성이 높아지고, 결합도가 강해진다.
- 객체 지향 프로그래밍의 지향점에 맞게 느슨한 결합도와 높은 캡슐화가 필요하다.
스프링 컨테이너에 빈(Bean) 등록 방법
컨테이너는 BeanDefinition을 기반으로 빈을 생성하고 구성한다. 빈 등록을 위해서 BeanDefinition 메타데이터를 구성해 주어야 하며, Spring은 XML 문서, Annotation, 프로퍼티 파일과 같은 외부 리소스로 빈의 메타 정보를 작성하고, 이것을 ApplicationContext가 사용할 수 있는 정보로 변환해준다.
XML 문서 or 어노테이션 or 자바 코드 ▶ BeanDefinition 메타 정보 ▶ 스프링 컨테이너
1. 직접 스프링 빈 등록
1-1. XML 기반 설정
- applicationContext.xml
- id : 빈 식별자
- class : 빈 클래스 지정
<bean id="myBean" class="com.example.MyBean">
<property name="property" value="value"/>
</bean>
1-2. Java 기반 설정(Java Configuration)
- AppConfig Class
- @Bean은 @Configuration 설정된 클래스의 메서드에서 사용한다.
- 메서드의 리턴 객체가 스프링 빈 객체임을 선언한다.
- 빈의 이름은 기본적으로 메서드 이름이다. (@Bean(name="name")으로 변경이 가능하다.)
- @Scope를 통해 객체 생성을 조정할 수 있다.
- 빈 객체에서 init(), destroy() 등의 라이프사이클 메서드를 추가하여 @Bean에서 지정할 수 있다.
@Configuration
public class AppConfig {
@Bean
public MyBean myBean() {
return new MyBean();
}
}
2. 컴포넌트 스캔
2-1. XML 기반 설정
- applicationContext.xml
- XML을 이용하여 빈 스캐너 등록
<context:component-scan base-package="com.example"/>
2-2. Java 기반 설정(Java Configuration)
- AppConfig Class
- 클래스에서 @Component 어노테이션을 붙이면 스프링 빈으로 등록한다.
@Configuration
@ComponentScan(basePackages = "com.example")
public class AppConfig {
}
2-3. 어노테이션 기반 설정(Annotation Configuration) (*스프링 부트 활용 시)
- 클래스 선언부에 @Configuration나 Java 설정 파일 없이 @Component 어노테이션만을 사용할 수 있다.
- 스프링 컨테이너에 의해 자동으로 생성되어 스프링 빈으로 등록된다.
- @Component는 일반적인 컴포넌트 역할을 하는 빈을 등록할 때 사용하며, @Component를 확장한 특적 목적 클래스를 빈으로 등록하기 위해 많이 사용한다.
@Component
public class MyBean {
public void doSomething() {
System.out.println("Doing something");
}
}
- @Component를 확장한 어노테이션으로는 @Controller, @Service, @Repository가 있다.
- 이들은 스테레오타입 어노테이션으로 불리며 @Component 메타 어노테이션을 갖고 있어 자동으로 빈을 등록한다.
- @Repository : Data Access 데이터 접근 계층의 DAO, Repository 클래스에서 사용된다.
- @Service : Service 계층 클래스에서 사용되며, 스프링 비즈니스 로직에서 사용한다.
- @Controller : 프레젠테이션 계층의 MVC Controller에서 사용된다. 스프링의 Web Servlet에 의해 웹 요청을 처리하는 컨트롤러 빈으로 등록된다.
참고 자료
이미지 출처 및 내용 참고 : 인프런 김영한 님의 강의 "스프링 핵심 원리 - 기본편"
https://jie0025.tistory.com/269
https://dev-coco.tistory.com/69