학습 목표
- Spring 컨테이너(Container)와 빈(Bean)의 의미를 이해할 수 있다.
What(스프링 컨테이너는 무엇인가?)
ApplicationContext를 스프링 컨테이너라고 하고 인터페이스로 구현되어있다(다형성 적용)
스프링 컨테이너는 XML, 에너테이션 기반의 자바 설정 클래스로 만들 수 있따
예전에는 개발자가 xml을 통해 모두 설정해 줫지만 이러한 복잡한 부분들을 Spring Boot를 사용하면서 사용하지 않게되었다
빈의 인스턴스화, 구성, 전체 생명 주기 및 제거까지 처리한다
- 컨테이너는 개발자가 정의한 Bean을 객체로 만들어 관리하고 개발자가 필요로 할 때 제공한다
스프링 컨테이너를 통해 원하느 만큼 많은 객체를 가질수 있다
의존성 주입을 통해 애플리케이션의 컴포넌트르 관리한다
스프링컨테이너는 서로 다른 빈을 연결해 애플리케이션의 빈을 연결하는 역할을 한다
개발자는 모듈간에 의존 및 결합으로 인해 발생하는 문제로부터 자유로울 수 있다
메서드가 언제,어디서 호출되야 하는지, 메서드를 호출하기 위해 필요한 매개 변수를 준비해서 전달하지 않는다.
Why(스프링 컨테이너는 왜 사용하나?)
객체를 사용하기 위해서 new 생성자를 써야했다.
애플리케이션에서 이러한 객체가 무수히 많이 존재하고 서로 참조하게 되어있다
서로 참조가 심할수록 의존성이 높다고 표현한다
낮은 결합도와 높은 캡슐화가 객체지향프로그래밍의 핵심중 하나인데 높은 의존성은 이를 지키지 못하는 방법이 될수 밖에 없다.
객체간의 의존성을 낮추기 위해 spring 컨테이너가 사용된다
문제점 및 Spring컨테이너가 해결법이 되는이유
기존방식으론 새로운 정책이 생기게 될 경우 변경 사항들이 수작업으로 수정이 필요햇다
서로 의존이 많이 되어 있지 않는 작업 초반부에는 하나한 수정할 수 있겠지만, 점점 서비스의 코드가 거대해질 경우 의존도는 높아져 있을것이고 그에 따른 코드의 변경도 많이 필요해 질것이다
하지만 스프링 컨테이너를 사용하면서 구현 클래스에 있는 의존을 제거하고 인터페이스에만 의존하도록 설계할 수 있다
How(스프링 컨테이너의 생성과정은 어떻게 되나?)
주로 사용하게 되는 설정 방식은 Java기반의 애너테이션 기반 설정이지만, 기존에 사용하던 XML방식에대해서도 이해해야한다
![](https://blog.kakaocdn.net/dn/brlhHT/btrPg1u9Kin/iqX5N8CYnyzluYQMuGY9M0/img.png)
- 스프링 컨테이너는 Configuration Metadata를 사용한다
- 스프링 컨테이너는 파라미터로 넘어온 설정 클래스 정보를 사용해서 스프링 빈을 등록한다
- new AnnotationConfigApplicationContext(구성정보.class)로 스프링에 있는 @Bean의 메서드를 등록한다
- 애너테이션 기반 컨테이너 구성
- 애너테이션 기반 자바 설정 클래스로 Spring을 만드는 것을 의미한다.
스프링 컨테이너를 만드는 다양한 방법은 ApplicationContext 인터페이스의 구현체이다
DependencyConfig.class등의 구성 정보를 지정해줘서 스프링 컨테이너를 생성해야한다
DependencyConfig에 있는 구성 정보를 통해서 스프링 컨테이너는 필요한 객체들을 생성하게 된다.
애플리케이션 클래스는 구성 메타데이터와 결합되어 ApplicationContext 생성 및 초기화된 후 완전히 구성되고 실행 가능한 시스템 또는 애플리케이션을 갖게 된다
스프링 빈 조회에서 상속관계가 있을 시 부모타입으로 조회하면 자식타입도 함께 조회된다
모든 자바 객체의 최고 부모입 object타입으로 조회하면 모든 스프링 빈을 조회한다.
스프링 컨테이너의 종류
파라미터로 넘어온 설정 클래스 정보를 참고해서 빈의 생성, 관계 설정 등의 제어작업을 총괄하는 컨테이너이다.
- BeanFactory
- 스프링 컨테이너의 최상위 인터페이스
- BeanFactory는 빈을 등록하고 생성하고 조회하고 돌려주는 등 빈을 관리하는 역할을한다
- getBean()메소드를 통해 빈을 인스턴스화할 수 있다.
- @Bean이 붙은 메서드의 명을 스프링 빈의 이름을 사용해서 빈등록을 한다.
Applicaton Context
- BeanFactory의 기능을 상속받아 제공한다
- 빈을 관리하고 검색하는 기능을 BeanFactory가 제공하고 그 외에 부가기능을 제공한다
- 부가기능
-MessageSource : 메세지 다국화를 위한 인터페이스
-EnvironmentCapable : 개발, 운영 등 환경변수 등으로 나눠 처리하고, 애플리케이션 구동 시 필요한 정보들을 관리하기 위한 인터페이스
-ApplicationEventPublisher : 이벤트 관련 기능을 제공하는 인터페이스
-ResourceLoader : 파일, 클래스 패스, 외부 등 리소스를 편리하게 조회
컨테이너 인스턴스화
ApplicationContext 생성자에 제공된 위치 경로 또는 경로는 컨테이너가 로컬 파일시스템, java CLASSPATH등과 같은 다양한 외부 리소스로부터 구성 메타데이터를 로드할 수 있도록 하는 리소스 문자열이다.
- 빈과 빈 스코프(Bean Scope)의 의미를 이해할 수 있다.
스프링 컨테이너에 관리되는 재사용 소프트웨어 컴포넌트이다.
Spring컨테이너가 관리하는 자바 객체를 의미하며, 하나 이상의 빈을 관리한다
- 빈은 인스턴스화된 객체를 의미한다.
- 스프링 컨테이너에 등록된 객체를 스프링 빈이라 한다
- @Bean이 적힌 메서드를 모두 호출해서 반환된 객체를 스프링 컨테이너에 등록한다
- 빈은 클래스의 등록정보,getter/setter메서드를 포함한다
- 빈은 컨테이너에 사용되는 설정 메타데이터로 생성된다
- 설정 메타데이터 ( XML 또는 자바 애너테이션, 자바 코드로 표현한다. 컨테이너의 명령과 인스턴스화, 설정,조립할 객체를 정의한다)
bean접근방법
ApplicationContext 사용하여 bean 정의를 읽고 액세스 할 수 있다
getBean을 사용해서 bean의 인스턴스를 가져올 수 있다
ApplicationContext 인터페이스는 bean을 가져오는 몇가지 방법들이 있다
실제적으로 응용프로그램 코드에서는 getBean()메서드로 호출하여 사용하면 안된다.
BeanDefinition(빈 설정 메타정보)
속성에 따라 컨테이너가 Bean을 어떻게 생성하고 관리할지 결정한다
@Bean or <bean>당 각 1개씩 메타 정보가 생성된다
Spring이 설정 메타정보를 BeanDefinition 인터페이스를 통해 관리하기 때문에 컨테이너 설정을 XML,Java로 할 수 있는것이다
-스프링 컨테이너는 설정 형식이 XML인지 Java 코드인지 모르고 Beanfinition만 알면된다.
Point
컨테이너의 의미
소프트웨어 개발 용어의 관점에서 컨테이너란 내부에 또 다른 컴포넌트를 가지고 있는 어떤 컴포넌트를 의미한다.
- 컨테이너는 먼저 객체를 생성하고 객체를 서로 연결합니다.
- 객체를 설정하는 단계를 지나 마지막으로 생명주기 전반을 관리합니다.
- 컨테이너는 객체의 의존성을 확인해 생성한 뒤 적절한 객체에 의존성을 주입합니다.
- 스프링은 스프링 컨테이너를 통해 객체를 관리합니다.
- 스프링 컨테이너에서 관리되는 객체를 빈(Bean)이라고 합니다.
빈스코프(Bean Scope)
학습을 위해 필요한 기본 개념
- 스프링은 스프링 컨테이너를 통해 객체를 관리합니다.
- 스프링 컨테이너에서 관리되는 객체를 빈(Bean)이라고 합니다.
- 스프링 컨테이너, 객체, 빈 등의 용어 및 개념에 대한 이해가 필요합니다.
bean definition을 만들 때 해당 bean definition에 의해 정의된 크랠스의 실제 인스턴스를 만들기 위한 레시피를 만든다(빈이 존재할 수 있는 범위를 의미한다)
- 특정 bean 정의에서 생성된 개체에 열결한 다양한 의존성 및 구성 값뿐만 아니라 특정 bean정의에서 생성된 개체의 범위도 제어할 수 있다.
- SpringFramework는 6개의 범위를 지원하며, 그 중 4개는 ApplicationContext를 사용하는 경우에만 사용할 수 있다.
- Bean은 여러 범위 중 하나에 배치되도록 정의할 수 있다
- 구성을 통해 생성하는 개체의 범위를 선택할 수 있기 대문에 강력하고 유연하다.
- 사용자 정의 범위를 생성할 수도 있다.
Scope | Description |
singleton | (Default)각 Spring 컨테이너에 대한 단일 객체 인스턴스에 대한 단일 bean definition의 범위를 지정한다 |
prototype | 스프링 컨테이너는 프로토타입 빈의 생성과 의존관계 주입까지만 관여하고 더는 관리하지 않는 매우 짧은 범위의 스코프이다. |
request | 웹요청이 들어오고 나갈때 까지 유지되는 스코프이다 |
session | 웹 세션이 생성되고 종료될 때 까지 유지되는 스코프이다. |
application | 웹의 서블릿 컨텍스와 같은 범위로 유지되는 스코프이다. |
websocket | 단일 bean definition 범위를 WebSocket의 라이프사이클까지 확장한다.Spring ApplicationContext의 컨텍스트에서만 유효한다. |
싱글톤 스코프 : 클래스의 인스턴스가 딱 1개만 생성되는 것을 보장하는 디자인 패턴
스프링 컨테이너의 시작과 함께 생성되어서 스프링 컨테이너가 종료될 때 까지 유지된다
싱글톤 빈의 하나의 공유 인스턴스만 관리하게 된다.
해당 bean definition와 일치하는 ID또는 Id를 가진 빈에 대한 모든 요청은 스프링 컨테이너에서 해당 특정 빈 인스턴스를 반환한다
스프링 컨테이너 종료시 소멸 메서드도 자동으로 실행된다.
정리-
- 싱글톤은 해당 빈의 인스턴스를 오직 하나만 생성해서 사용하는 것을 의미한다
- 단일 인스턴스는 싱글톤 빈의 캐시에 저장된다
- 이름이 정해진 빈에 대한 모든 요청과 참조는 캐시된 개체를 반환한다.(싱글톤 스코프의 스프링 빈은 여러번 호출해도 모두 같은 인스턴스 참조 주소값을 가진다.)
- 작동방식
![](https://blog.kakaocdn.net/dn/pyhcU/btrPgVBSfu2/fUk1gKMWaB4reLxKv5eEtk/img.png)
Level Up
아래 스코프들에 대해서 검색 후 정리
- prototype scope
- requset, session, application scope
- websocket scope
'TIL' 카테고리의 다른 글
[SpringFramework][POJO] (0) | 2022.10.14 |
---|---|
[Spring Framework][사용하는 이유] (0) | 2022.10.14 |
[데이터베이스와 SQL][SQL문정리] (0) | 2022.10.10 |
[DB][SQL][WHERE][TRUNCATE,DELETE,DROP 차이] (0) | 2022.10.10 |
[HTTP][HEADER][캐시와 조건부 요청] (1) | 2022.10.10 |