Spring bean (1)

굴착드릴·2024년 7월 31일

IOC, DI

IOC(제어의 역전) DI(의존성 주입)은 큰 큐모의 어플리케이션에서 개발자가 객체의 생명주기, 의존성 관리에 어려움을 격는 것을 해결하기 위해 등장한 개념입니다.

프레임워크, 어플리케이션에 객체 생명주기, 의존성을 위임하고 개발자는 제공받은 객체를 사용하기만 하면 됩니다.

아래는 express에서 수동으로 container에 객체들을 넣어주는 부분입니다.

export default ({ mongoConnection, models }: { mongoConnection; models: { name: string; model: any }[] }) => {
  try {
    models.forEach(m => {
      Container.set(m.name, m.model);
    });

    const agendaInstance = agendaFactory({ mongoConnection });
    const mgInstance = new Mailgun(formData);


    Container.set('agendaInstance', agendaInstance);
    Container.set('logger', LoggerInstance);
    Container.set('emailClient', mgInstance.client({ key: config.emails.apiKey, username: config.emails.apiUsername }));
	...
};

Bean

Spring bean은 IOC container에 의해 초기화, 관리되는 객체입니다.

Spring은 모든 객체를 bean으로 관리하지 않고 bean 설정이 되어있는 객체들만 bean으로 관리합니다.

Bean 설정

빈설정은 아래와 같이 합니다.

  • xml에서 설정
  • annotation을 통한 설정

Spring 버전 별 bean 설정

Spring 1.x

<bean id="myBean" class="com.example.MyBean">
    <property name="myDependency" ref="myDependencyBean"/>
</bean>

Spring 2.x

<bean id="myBean" class="com.example.MyBean" autowire="byType"/>
  • NameSpace의 도입으로 AOP, Transaction 설정 관리가 편해졌습니다.
  • Auto wiring을 지원하기 시작했습니다.

Spring 3.x

@Configuration
public class AppConfig {
    @Bean
    public MyBean myBean() {
        return new MyBean();
    }
}
  • XML 파일 없이 설정을 관리할 수 있습니다.
  • Annotation을 사용해 bean을 등록할 수 있습니다.
    • @Component, @Controller, ...

Spring 4.x

  • java 8의 기능을 적극적으로 활용하며 람다식을 통한 설정이 가능합니다.
  • @Conditional 어노테이션을 통해 특정 조건에 따라 bean 정의가 가능합니다.
    • ex) Production에서 사용되는 결제 서비스와 Develop에서 사용되는 Mock 결제 서비스를 profile(env)에 따라 bean을 등록

Scope

Spring은 다른 설정이 있지 않는 한 Singletone으로 관리합니다.

대표적인 Bean scope

  • Singletone (Default)
  • Prototype
    • 요청할 때마다 새로운 인스턴스 생성
  • Request (Web관련 scope)
    • HTTP 요청당 하나의 인스턴스
  • Session (Web관련 scope)
    • 세션당 하나의 인스턴스
  • Application (Web관련 scope)
    • 서블릿 컨텍스트당 하나의 인스턴스

LifeCycle

Bean의 초기화화 소멸시점은 보통 Spring application의 초기화, 소멸시점과 같습니다.

  • 특수한 bean의 경우 라이프사이클이 다를 수 있습니다.
  • 대표적인 예로 Web관련 scope가 있습니다.

LifeCycle method

  • @PostConstruct: Bean 초기화 시점에 호출
  • @PreDestroy: Bean 소멸시점에 호출

Bean 등록

Spring에서 bean을 등록하는 방법은 크게 5가지 과정으로 수행됩니다.

  1. 컴포넌트 스캔
  2. 빈정의
  3. 빈 팩토리와 어플리케이션 컨텍스트에 빈 등록
  4. 빈 인스턴스화 및 의존성 주입
  5. 초기화

컴포넌트 스캔

ClassPathBeanDefinitionScanner

  • 클래스패스에서 @Component, @Service, @Repository, @Controller 어노테이션이 붙은 클래스를 스캔하여 빈 정의를 생성하고, 이를 스프링 컨테이너에 등록합니다.

    1~3 단계를 동시에 수행합니다.

ClassPathScanningCandidateComponentProvider

  • 클래스패스에서 스캔할 후보 컴포넌트를 찾고, 이를 빈 정의로 변환하여 반환합니다. 직접 빈을 등록하지 않습니다.
profile
두두두두..

0개의 댓글