관리 메뉴

개발하는 동그리

[Spring] 스프링 컨테이너 본문

IT 정보/Spring

[Spring] 스프링 컨테이너

개발하는 동그리 2022. 6. 16. 22:57
반응형

스프링 컨테이너

스프링 프레임워크의 핵심 컴포넌트이며, 내부에 존재하는 애플리케이션 빈의 생명주기를 관리한다. 
( bean 생성, 관리 제거 등의 역할)

  • 스프링 컨테이너는 인터페이스로 구현되어 있으며, 여러 개의 객체로 구성되어 있다. 
  • 스프링 컨테이너는 XML, 애너테이션 기반의 자바 설정 클래스로 만들 수 있다. 
  • 예전에는 개발자가 xml을 통해 모두 설정했지만, Spring Boot를 통해 쉽게 설정할 수 있게 되었다. 
  • 빈의 인스턴스화, 구성, 전체 생명 주기 및 제거까지 처리한다. 
  • 컨테이너는 개발자가 정의한 bean을 객체로 만들어 관리하고 개발자가 필요할 때 제공해준다. 
  • 스프링 컨테이너를 통해 원하는 만큼 많은 객체를 가질 수 있다. 
  • 의존성 주입을 통해 애플리케이션의 컴포넌트를 관리한다. 
    • 스프링 컨테이너는 서로 다른 빈을 연결해 애플리케이션의 빈을 연결하는 역할을 한다. 
    • 개발자는 모듈 간에 의존 및 결합으로 인해 발생하는 문제로부터 자유로울 수 있다. 
    • 메서드가 언제, 어디서 호출되어야 하는지, 메서드를 호출하기 위해 필요한 매개 변수를 준비해서 전달하지 않는다. 
  • 애플리케이션에서 많은 객체가 서로 참조하게 되어있는데, 낮은 결합도와 높은 캡슐화를 통해 객체지향 프로그래밍을 하기 위해 방법으로 스프링 컨테이너를 이용한다.
  •  기존에는 새로운 정책이 생기면 변경 사항을 수작업으로 수정했으나, 스프링 컨테이너를 통해 인터페이스에 의존해서 구현 클래스를 쉽게 수정, 생성할 수 있다.
  • 스프링 컨테이너는 Configuration Metadata를 사용한다. 

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

 

  • 스프링 컨테이너는 파라미터로 넘어온 설정 클래스 정보를 사용하여, 스프링 빈을 등록한다. 
  • new AnnotationConfigApplicationContext(구성정보.class)로 스프링에 있는 @Bean의 메서드를 등록합니다.
  • 애너테이션 기반 컨테이너 구성
  • 애너테이션 기반의 자바 설정 클래스로 Spring을 만드는 것을 의미합니다.
  • 스프링 컨테이너를 만드는 다양한 방법은 ApplicationContext 인터페이스의 구현체입니다.
    • AppConfig.class 등의 구성 정보를 지정해줘서 스프링 컨테이너를 생성해야 합니다.
    • AppConfig에 있는 구성 정보를 통해서 스프링 컨테이너는 필요한 객체들을 생성하게 됩니다.
    • 애플리케이션 클래스는 구성 메타데이터와 결합되어 ApplicationContext 생성 및 초기화된 후 완전히 구성되고 실행 가능한 시스템 또는 애플리케이션을 갖게 됩니다.
  • 스프링 빈 조회에서 상속관계가 있을 시 부모 타입으로 조회하면 자식 타입도 함께 조회합니다.
    • 모든 자바 객체의 최고 부모인 object타입으로 조회하면 모든 스프링 빈을 조회합니다.

스프링 컨테이너의 종류

파라미터로 넘어온 설정 클래스 정보를 참고하여 빈의 생성, 관계 설정 등의 제어 작업을 하는 컨테이너

BeanFactory

  • 스프링 컨테이너의 최상위 인터페이스
  • BeanFactory는 빈을 등록하고 생성하고 조회하고 돌려주는 등 빈을 관리하는 역할
  • getBean() 메서드를 통해 빈을 인스턴스 화할 수 있다.
  • @Bean이 붙은 메서드의 명을 스프링 빈의 이름으로 사용해 빈 등록을 한다.

ApplicationContext

  • BeanFactory 기능을 상속받아 제공한다. 
  • 빈을 관리하고 검색하는 기능을 BeanFactory가 제공하고 그 외의 부가기능을 제공한다. 
  • 부가기능 
    • MessageSource : 메시지 다국화를 위한 인터페이스
    • EnvironmentCapable : 개발, 운영 등 환경변수 등으로 나눠 처리하고, 애플리케이션 구동 시 필요한 정보들을 관리하기 위한 인터페이스
    • ApplicationEventPublisher : 이벤트 관련 기능을 제공하는 인터페이스 
    • ResourceLoader : 파일, 클래스 패스, 외부 등 리소스를 편리하게 조회

 

컨테이너의 인스턴스화

  • ApplicationContent 생성자에 제공된 위치 경로 또는 경로는 컨테이너가 로컬 파일 시스템, java CLASSPATH등과 같은 다양한 외부 리소스로부터 구성 메타데이터를 로드할 수 있도록 하는 리소스 문자열이다. 

 

New 키워드를 대신한 생성자 주입 코드 

  • 의존 객체가 주입되어, 느슨한 의존 관계 성립
  • 실제 구현 클래스는 Bean 설정에 따라 유연하게 변할 수 있음
  • 어떤 객체가 주입될지 결정하는 것은 외부 (AppConfig)에 의해 결정된다. 
  • 해당 클래스는 어떤 객체와도 연관성 없이 오직 실행만 담당한다.

 

Bean

스프링 컨테이너에 의해 관리되는 재사용 소프트웨어 컴포넌트로, Spring 컨테이너가 관리하는 자바 객체를 의미하며, 하나 이상의 빈을 관리한다. 

  • 빈은 인스턴스화 된 객체를 의미한다. 
  • 스프링 컨테이너에 등록된 객체를 스프링 빈이라고 한다. 
  • @Bean이 적힌 메서드를 모두 호출해서 반환된 객체를 스프링 컨테이너에 자동 등록된다.
  • @Configuration 구성정보를 담당하는 것을 설정할 때 사용한다. 
  • 빈은 클래스의 등록정보, getter/setter 메서드를 포함한다. 
  • 빈은 컨테이너에 사용되는 설정 메타데이터로 생성된다. 
  • 설정 메타데이터 
    • xml 또는 자바 애너테이션, 자바 코드로 표현한다. 
    • 컨테이너의 명령과 인스턴스화, 설정, 조립할 객체를 정의한다.

Bean 접근 방법

  • ApplicationContext 사용하여 Bean을 읽고 액세스 할 수 있다. 
  • getBean을 이용하여 bean의 인스턴스를 가져올 수 있다. 
  • ApplicationContext 인터페이스는 bean을 가져오는 몇 가지 방법들이 있다. 
  • 실제적으로 응용 프로그램 코드에서는 getBean() 메서드로 호출하여 사용하면 안 된다. 
// create and configure beans
ApplicationContext context = new ClassPathXmlApplicationContext("services.xml", "daos.xml");

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

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

 

BeanDefinition

스프링은 다양한 설정 형식을 BeanDefinition이라는 추상화 덕분에 지원이 가능하다.

  • Bean은 BeanDefinition(빈 설정 메타정보)로 정의되고 BeanDefinition에 따라 사용하는 방법도 달라진다. 
  • BeanDefinition (빈 설정 메타정보)
    • 속성에 따라 컨테이너가 bean을 어떻게 생성하고 관리할지 결정
    • @Bean or <bean> 당 각 1개씩 메타 정보가 생성된다. 
    • Spring이 설정 메타정보를 BeanDefinition 인터페이스를 통해 관리하기 때문에 컨테이너 설정을 XML, Java로 할 수 있다. 
    • 스프링 컨테이너는 설정 형식이 xml인지 java인지 모르고 BeanDefinition만 알면 된다. 

 

 

반응형

'IT 정보 > Spring' 카테고리의 다른 글

[Spring] 스프링 컨테이너와 빈 ( 생성, 등록, 조회 )  (44) 2022.06.17
[Spring] Bean Scope (Singleton pattern)  (43) 2022.06.16
[Spring] FrameWork  (36) 2022.06.15
[네트워크] HTTP 메서드  (44) 2022.06.08
[네트워크] HTTP 헤더 2  (30) 2022.06.07