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

https://dev-coco.tistory.com/80

https://kkkdh.tistory.com/entry/Spring-%EC%8A%A4%ED%94%84%EB%A7%81-%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88%EC%99%80-%EC%8A%A4%ED%94%84%EB%A7%81-%EB%B9%88-%EA%B0%9C%EB%85%90-%EC%A0%95%EB%A6%AC

https://steady-coding.tistory.com/459