Java_스프링 컨테이너/빈

Minki CHO·2023년 1월 26일
0

CodeStates

목록 보기
27/43

Spring Container 스프링 컨테이너

:스프링 컨테이너는 스프링 프레임워크의 핵심 컨포넌트임
:내부에 존재하는 애플리케이션 빈의 생명주기를 관리
:Bean 생성, 관리, 제거 등의 역할을 담당함

? 스프링 컨테이너는 무엇일까?
:ApplicationContext를 스프링 컨테이너라고 하고 인터페이스로 구성됨

스프링 컨테이너는
:빈의 인스턴스화, 구성, 전체 생명 주기 및 제거까지 처리
:스프링 컨테이너를 통해 원하는 만큼 많은 객체를 가질 수 있음
:의존성 주입을 통해 애플리케이션의 컴포넌트를 관리함

? 왜 스프링 컨테이너를 사용할까?
:DI의존성 주입 에서 학습한 내용과 같음
:객체를 사용하기 위해서는 new 생성자를 써야 했음
:애플리케이션에서 이러한 객체가 무수히 많이 존재하고 서로 참조되어 있음
-서로 참조가 심할수록 의존성이 높다고 표현
-낮은 결합도와 높은 캡슐화 = 객체지향프로그래밍의 핵심 중 하나이므로
높은 의존성은 이를 충족하지 못함
:객체간의 의존성을 낮추기 위해 스프링 컨테이너가 사용됨

문제점 및 스프링 컨테이너가 해결법이 되는 이유
:기존의 방식으로는 새로운 정책이 생기게 될 경우 변경 사항들을 수작업으로 수정이 필요했음
:서로 의존이 많이 되어있지 않은 작업 초반부에는 하나하나 수정할 수 있으나,
서비스의 코드가 거대해지면 의존도가 높아지고 이에 따라 코드 변경도 많이 필요할 것
:하지만 스프링 컨테이너를 사용하면서 구현 클래스에 있는 의존을 제거하고 인터페이스만 의존하도록 설계할 수 있음

? 스프링 컨테이너의 생성 과정은 어떻게 될까?

:스프링 컨테이너는 Configuration Metadata를 사용함
:스프링 컨테이너는 파라미터로 넘어온 설정 클래스 정보를 사용해서 스프링 빈을 등록함
:new AnnotationConfigApplicationContext(구성정보.class)로 스프링에 있는 @Bean의 메서드를 등록함
:애너테이션 기반 컨테이너 구성
:애너테이션 기반의 자바 설정클래스로 Spring을 만드는 것을 의미

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

(Configuration Metadata
:스프링 컨테이너가 객체를 어떻게 생성할 것인지 표현하기 위한 메타데이터
:XML-based metadata(외부 XML 파일로 표현)/Java-based metadata(애너텥이션 등의 자바 코드로 표현))

(메타데이터
:일반적으로 데이터에 관한 구조화된 데이터)

스프링 컨테이너의 종류

(:파라미터로 넘어온 설정 클래스 정보를 참고해서 빈의 생성, 관계 설정 등의 제어 작업을 총괄하는 컨테이너)
1) BeanFactory
:스프링 컨테이너의 최상위 인터페이스
:빈을 등록하고 생성하고 조회하고 돌려주는 등 빈 관리하는 역할을 함
:getBean() 메서드를 통해 빈을 인스턴스화할 수 있음
:@Bean이 붙은 메서드의 명을 스프링 빈의 이름으로 사용해 빈 등록함

2) ApplicationContext
:BeanFactory의 기능을 상속받아 제공함
:빈을 관리하고 검색하는 기능을 BeanFactory가 제공하고 그외 부가 기능을 제공함

Bean 빈

빈 bean = 인스턴스화된 객체

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

ApplicationContext 사용하여 bean 정의 읽고 액세스 가능함

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

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

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

:getBean 이용하여 bean의 인스턴스를 가져올 수 있음(but 실제로 사용하면 안됨 왜??)

Bean은 BeanDefinition(빈 설정 메타정보)으로 정의되고 BeanDefinition에 따라서 활용하는 방법이 달라짐
BeanDefinition 빈 설정 메타정보
:속성에 따라 컨테이너가 Bean을 어떻게 생성하고 관리할지 결정
:@Bean or <bean> 당 각 1개씩 메타정보가 생성됨

컨테이너의 의미
:먼저 객체를 생성하고 객체를 서로 연결함
:객체를 설정하는 단계를 지나 마지막으로 생명주기 전반을 관리
:컨테이너는 객체의 의존성을 확인한 뒤 적절한 객체에 의존성을 주입함
:스프링은 스프링 컨테이너를 통해 객체를 관리함
:스프링 컨테이너에서 관리되는 객체를 빈Bean이라고 함

Bean Scope 빈 스코프

singletone 싱글톤 스코프
:클래스의 인스턴스가 딱 1개만 생성되는 것을 보장하는 디자인 패턴<노이해중>
:스프링 컨테이너의 시작과 함께 생성되어 스프링 컨테이너가 종료될 때까지 유지됨
:싱글톤 빈의 하나의 공유 인스턴스만 관리하게 됨
-private 생성자를 사용해 외부에서 임의로 new를 사용하지 못하도록 막아야 함
:해당 bean definition과 일치하는 ID 또는 ID를 가진 빈에 대한 모든 요청은 스프링 컨테이너에서 해당 특정 빈 인스턴스를 반환함<노이해중>
:스프링 컨테이너 종료시 소멸 메서드도 자동으로 실행됨

싱글톤 내용 정리
:싱글톤은 해당 빈의 인스턴스를 오직 하나만 생성해서 사용하는 것을 의미
:단일 인스턴스는 싱글톤 빈의 캐시에 저장됨
:이름이 정해진 빈에 대한 모든 요청과 참조는 캐시된 개체를 반환함
-싱글톤 스코프의 스프링 빈은 여러번 호출해도 모두 같은 인스턴스 참조 주소값을 가짐
:작동방식

핵심
:bean 하나에 하나씩 메타정보가 생성되고
:스프링 컨테이너는 이런 메타 정보를 기반으로 스프링 빈을 생성함

profile
Developer

0개의 댓글