[SEB BE]Section 2. 스프링 컨테이너와 빈

박두팔이·2023년 2월 6일
0

스프링프레임워크

목록 보기
4/18

💡 참고 | 주로 사용하는 설정방식은 Java기반의 애너테이션으로 하지만 기존에 사용하던 XML방식에 대해서도 알아야함.

💡사전지식

  • Bean? 빈 이란, 스프링 IoC컨테이너가 관리하는 객체이다.
  • 빈으로 등록된 객체는 기본적으로 싱글톤 스코프로 정해진다.
  • 싱글톤이란? 객체가 하나만 만들어진다. 싱글톤의 장점은 객체를 재사용한다는 것인데 이렇게 하면 메모리를 절약할 수 있고 런타임시 성능 최적화에 유리하다. <-> 프로토타입: 매번 다른 객체가 만들어진다.

스프링 컨테이너

1. 스프링 컨테이너 생성 방법

스프링 컨테이너는 'ApplicationContext' 인터페이스다.
❗️스프링 컨테이너의 기능?

  • 메시지 소스 처리 기능
  • 이벤트 발행 기능
  • 리소스 로딩 기능 등이 있다

❗️스프링 컨테이너를 만드는 방식?

  • XML
  • 애너테이션

2. 스프링 컨테이너의 구분

  • 빈 팩토리(BeanFactory)
  • 애플리케이션 컨텍스트(ApplicationContext)

1️⃣ 빈 팩토리는 스프링 IoC 컨테이너의 가장 최상위 인터페이스다. 그러나 이것을 직접 사용하는 경우는 거의 없다. BeanFactory는 빈을 관리하고 검색하는 기능을 담당한다.(빈 등록,생성,조회,return)

2️⃣ 일반적으로는 애플리케이션 컨텍스트(ApplicationContext)를 스프링 컨테이너라고 한다. ApplicationContext는 BeanFactory의 기능을 상속받아 그 외에 부가기능을 제공해준다.

부가기능으로는,

  • MessageSource : 메세지 다국화 (𝐢:인터페이스)
  • EnvironmentCapable : 애플리케이션 구동 시필요정보 관리 𝐢
  • ApplicationEventPublisher : 이벤트관련기능 𝐢
  • ResourceLoader : 리소스 조회

3. 스프링 컨테이너의 생성

스프링 컨테이너 생성하기

  • 스프링 컨테이너를 생성한다.
  • 스프링 컨테이너를 생성할 때는 구성정보를 .class파일로 지정한다.
// Spring Container 생성하기

ApplicationContext applicationContext = 
	new AnnotationConfigApplicationContext(DependencyConfig.class);

빈(Bean)

  • 스프링 컨테이너가 관리하는 자바 객체이다.

  • 빈은 인스턴스화된 객체이다.

  • 스프링 컨테이너에 등록된 객체가 스프링 빈이다.

  • @Bean이 적힌 메서드를 모두 호출해서 스프링 컨테이너에 등록한다.

  • 빈은 클래스의 등록정보, getter/setter를 포함하고 있다.

  • 빈은 컨테이너에 사용되는 설정 메타데이터로 생성된다.

    • 설정 메타데이터란?
      • XML 또는 애너테이션, 자바 코드로 표현한다.
      • 컨테이너의 명령과 인스턴스화, 설정, 조립할 객체를 정의한다.
  • 빈 이름은 메서드 이름을 사용한다.

  • 빈 이름을 직접 부여할 수 있다. ex)@Bean(name="memberService")

    • 🚨 주의할 점:
      빈 이름은 각기 달라야 한다. 같은 이름을 부여하면 다른 빈이 무시되거나 기존 빈을 덮어버리는 등 설정에 오류가 발생하기 때문이다.
  • BeanDefintion
    : 스프링에서 설정 정보를 BeanDefinition 인터페이스로 추상화 하여 컨테이너에게 정보를 제공한다.

💡 ApplicationContext 인터페이스 구현체 확인하기

  • Mac에서 Cmd + O → 클래스에서 ApplicationContext로 검색
  • Windows에서 Ctrn + N → 클래스에서 ApplicationContext로 검색
  • 화면에서 가장 첫번째 파일인 ApplicationContext 인터페이스를 구현한 하위 클래스들이 나오는 걸 확인할 수 있습니다.

2. 스프링 빈 등록하기
빈을 설정하는 방법에는 여러가지 방법이 있지만 그 중 살펴볼 것은 xml로 설정하는 원초적인 방법과 스프링2.5버젼, 스프링 부트를 통한 빈 설정방법을 살펴보겠다.

1️⃣ xml로 빈 등록하기 - 원초적 방법

  • 기존에는 xml 설정파일에 두 클래스를 각각 빈으로 등록하는 원초적 방법을 사용했었다.
// ex) xml 설정파일에 두 클래스를 각각 빈으로 등록하고,
bookService의 특성(프로퍼티)으로 bookRepository를 등록하여 참조함.
<bean id="bookService"
    class="me.wordbe.springgoahead.BookService">
    <property name="bookRepository" ref="bookRepository" />
</bean>

2️⃣ Spring 2.5버전

  • xml파일 + component-scan기능 추가
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
	<context:component-scan base-package="me.wordbe.springgoahead" /> 
</beans>

패키지의 각각 클래스에 애노테이션을 붙여 빈을 등록한다.

  • 클래스 위에 @Component을 붙여 빈을 등록한다
  • @Repository, @Service 어노테이션을 추적하면 결국 @Component 애노테이션을 따라간다. 명시적으로 저장소와 서비스를 나타내 주기에 용이하다.
  • 여기에 의존성을 주입할 때 (DI) @Autowired 애노테이션을 활용한다.
import org.springframework.stereotype.Repository;
 
@Repository
public class BookRepository {
}
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
 
@Service
public class BookService {
 
    @Autowired
    BookRepository bookRepository;
 
    public void setBookRepository(BookRepository bookRepository) {
        this.bookRepository = bookRepository;
    }
}

3️⃣ springboot로 빈 등록하기

  • @SpringBootApplication 어노테이션에는 @ComponentScan 과 @Configuration이 내포되어 있다.
  • 즉 자바 설정 파일자체가 이 어노테이션 하나로 완성된 것이다. 빈 등록, 의존성 주입을 알아서 해준다

profile
기억을 위한 기록 :>

0개의 댓글