본문 바로가기
Spring

[Spring] 스프링 컨테이너(Spring Container), 빈(Bean), 빈스코프(Bean Scope) 란? +싱글톤(Singleton) 스코프

by jungha_k 2022. 10. 13.

스프링 컨테이너 Spring Container

= 내부에 존재하는 애플리케이션 빈의 생명주기를 관리

(= Bean 생성, 관리, 제거 등의 역할)

 

* 스프링 프레임워크의 핵심 컴포넌트!

 


스프링 컨테이너는 무엇인가?

= ApplicationContext  (다형성 적용으로 인터페이스로 구현되어 있다.)

 

  • XML(과거 방식), 애너테이션 기반 자바 설정 클래스로 만들 수 있다.
  • 빈의 인스턴스화, 구성, 전체 생명 주기 및 제거 처리
  • 개발자가 정의한 Bean을 객체로 만들어 관리, 개발자 필요시 제공
  • through 스프링 컨테이너, 원하는 만큼 많은 객체 가질 수 있음

  • 의존성 주입을 통해 애플리케이션 컴포넌트 관리
    - 애플리케이션의 빈 ~ 빈 연결
    - 모듈간 의존, 결합 문제에서 자유로워질 수 있음 
    - 메서드 호출 위한 매개변수 준비해서 전달 X

 

스프링 컨테이너를 왜 사용할까? 

= 객체 간의 의존성을 낮추기 위해서!

 

이전에는 객체 사용시 'new 생성자'가 필요했다.

new 생성자로 객체 생성시 애플리케이션 내부 서로 참조 多

결합도가 높아지게 됨 (↔ 좋은 OOP : 낮은 결합도, 높은 캡슐화 지향) 

 

🔽

 

스프링 컨테이너 사용시 

구현 클래스에 있는 의존 제거, 인터페이스에만 의존하도록 설계 가능

(코드 변경 시 수작업으로 하나하나 수정 안해줘도 됨!)

 

 


스프링 컨테이너는 어떻게 생성될까?

: XML(과거 방식), 애너테이션 기반 자바 설정 클래스로 만들 수 있다.

ApplicationContext 인터페이스의 구현체로 스프링 컨테이너를 생성 가능

 

DependencyConfig.class 등의 구성 정보를 지정해줘서 스프링 컨테이너를 생성

DependencyConfig에 있는 구성 정보를 통해서 스프링 컨테이너는 필요한 객체들을 생성

 

애플리케이션 클래스구성 메타데이터와 결합되어 ApplicationContext 생성 및 초기화된 후

완전히 구성되고 실행 가능한 시스템 또는 애플리케이션을 갖게 됩니다.

 

 

* 스프링 빈 조회에서 상속관계가 있을 시 부모타입으로 조회 --> 자식 타입도 함께 조회

object타입으로 조회하면(모든 자바 객체의 최고 부모) --> 모든 스프링 빈을 조회

 

 

Configuration Metadata 사용 

 

1. Java Annotation 기반 방법

// Spring Container 생성
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(DependencyConfig.class);

new AnnotationConfigApplicationContext 를 통해 스프링에 있는 @Bean 메서드를 등록

 

 

2. XML 기반 방법

<?xml version="1.0" encoding="UTF-8"?>
<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
        https://www.springframework.org/schema/beans/spring-beans.xsd">
        
    <bean id="..." class="...">  
        <!-- collaborators and configuration for this bean go here -->
     </bean>
        
     <bean id="..." class="...">
         <!-- collaborators and configuration for this bean go here -->
     </bean>
        
     <!-- more bean definitions go here -->
        
</beans>

 

 

 


스프링 컨테이너의 종류

- Bean Factory
- ApplicationContext

 

 

1. Bean Factory

스프링 컨테이너 최상위 인터페이스

빈 관리 : 빈 등록, 생성, 조회 ...

getBean() 메소드로 빈 인스턴스화

@Bean 붙은 메서드 이름을 스프링 빈 이름으로 사용 --> 빈 등록

 

 

2. ApplicationContext

BeanFactory 기능 상속 받음

BeanFactory 기능 + 부가기능 (ex. MessageSource, EnvironmentCapable...)

 


컨테이너 인스턴스화

: 다양한 외부 리소스로부터 구성 메타데이터 로드 가능

// Annotation
ApplicationContext context = new AnnotationConfigApplicationContext(DependencyConfig.class);

// XML
ApplicationContext context = new ClassPathXmlApplicationContext("services.xml", "daos.xml");

 


빈이란?(Bean)

= 인스턴스화된 객체

= 스프링 컨테이너에 등록된 객체

= 스프링 컨테이너가 관리하는 객체

 

@Bean 이 적힌 메서드를 모두 호출 --> 객체를 스프링 컨테이너에 등록

 

1. 빈 = 클래스 등록 정보, Getter & Setter 메서드 포함

2. 빈 = 설정 메타데이터로 생성됨

(* XML, 자바 애너테이션로 표현됨, 컨테이너 명령, 인스턴스화, 설정 및 조립 객체 정의)

 


bean 접근 방법

= ApplicationContext 사용하여 bean 정의를 읽고 액세스 

 

ex)

// create and configure beans
ApplicationContext context = new ClassPathXmlApplicationContext("services.xml", "daos.xml");

// retrieve configured instance
PetStoreService service = context.getBean("memberRepository", memberRepository.class);

* getBean을 통해 bean 인스턴스 가져올 수 있음
(실제적으로 응용프로그램 코드에서는 getBean() 메서드로 호출 X

// use configured instance
List<String> userList = service.getUsernameList();

 

 

beanDefinition(빈 설정 메타정보) 

 

bean은 BeanDefinition 에 따라 활용하는 방법이 달라지게 됨

(XML or 애너테이션 방식)

 

1 @Bean = 1 메타 정보

 

스프링 컨테이너는 메타 설정정보를 BeanDefinition 인터페이스를 통해 관리한다.


빈 스코프

= 빈이 존재할 수 있는 범위 

 

Bean Definition 생성시에

Bean Definition에 의해 정의된 클래스의 실제 인스턴스를 만들기 위한 '레시피'

 

 

특정 bean 정의에서 생성된 개체에 연결할 다양한 의존성, 구성 값 

+

특정 bean 정의에서 생성된 개체의 범위 

 

제어 가능

 

구성을 통해 생성하는 개체 범위 선택

--> 강력하고 유연하다.

 

*Spring 에는 6개 범위를 지원, 그 중 4개는 Application Context 사용시에만 사용 가능.

 

Scope 설명
singleton (Default) 각 Spring 컨테이너에 대한 단일 객체 인스턴스에 대한
단일 bean definition의 범위를 지정
prototype 스프링 컨테이너는 프로토타입 빈의 생성과 의존관계 주입까지만 관여,
더는 관리하지 않는 매우 짧은 범위의 스코프이다
.
request 웹 요청이 들어오고 나갈때 까지 유지되는 스코프
session 세션이 생성되고 종료될 때 까지 유지되는 스코프
application 웹의 서블릿 컨텍스와 같은 범위로 유지되는 스코프
websocket 단일 bean definition 범위를 WebSocket의 라이프사이클까지 확장
Spring ApplicationContext의 컨텍스트에서만 유효함

빈스코프 中 싱글톤 스코프

= 해당 빈의 인스턴스를 오직 하나만 생성해서 사용하는 것

 

단일 인스턴스 --> 싱글톤 빈의 캐시에 저장

이름이 정해진 빈에 대한 모든 요청, 참조 --> 캐시된 개체 반환 

(여러번 호출해도 모두 같은 인스턴스 참조 주소값 有)

 

 

댓글