TIL 22/12/08 목 - 1. Spring container & Bean

Woojin·2022년 12월 8일
0

Spring container & Bean

Spring container
1. 스프링 프레임워크의 핵심 컴포넌트
2. 빈의 인스턴스화, 구성, 전체 생명주기 관리 및 제거를 한다.(Bean 생성, 관리, 제거 등의 역할 담당 - 컨테이너는 개발자가 정의한 bean을 객체로 만들어 관리하고 개발자가 필요로 할 때 제공한다.
3. 인터페이스로 구현되어있고 다형성이 적용된다.
4. XML, 애너테이션 기반의 자바 설정 클래스로 만들 수 있다.

예전에는 개발자가 XML을 통해 모두 설정해줬지만 이런 복잡한 부분들을 spring boot를 사용하면서 거의 사용하지 않게 되었다.
스프링 컨테이너를 통해 원하는 만큼 많은 객체를 가질 수 있다.
의존성 주입을 통해 애플리케이션의 컴포넌트를 관리한다.(스프링 컨테이너는 서로 다른 빈을 연결해 애플리케이션의 빈을 연결한다. 개발자는 모듈 간에 의존 및 결합으로 인해 발생하는 문제로부터 자유로울 수 있다. 메서드 호출을 위해서 필요한 매개 변수를 준비해서 전달하지 않는다.)

객체 간에 의존성을 낮추기 위해 스프링 컨테이너가 사용된다. 객체 사용을 위해서 new 생성자를 쓰는 기존의 방식으로는 변경사항을 일일히 수작업으로 수정해야 했다. 서로 참조하는 경우가 많아질수록 의존도가 높다고 하는데, 이렇게 되면 객체지향 프로그래밍의 특징인 낮은 결합도와 높은 캡슐화에 어긋나게 된다.
하지만 스프링 컨테이너를 사용하면서 구현 클래스에 있는 의존을 제거하고 인터페이스에만 의존하도록 설계할 수 있다.

스프링 컨테이너의 종류
Bean Factory
: 스프링 컨테이너의 최상위 인터페이스, 빈을 등록-생성-조회-돌려주는 등 빈을 관리한다. getBean() 메서드를 통해 빈을 인스턴스화 할 수 있다. @Bean이 붙은 메서드의 명을 스프링 빈의 이름으로 사용해 빈 등록을 한다.
ApplicationContext
: Bean의 기능을 상속받아 제공한다. 빈을 관리하고 검색하는 기능을 BeanFactory가 제공하고 그 외의 부가기능을 제공한다.

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

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

//XML example
ApplicationContext context = new classPathXmlApplicationContext("Sevice.xml", "docs.xml");

빈(Bean)
1. 스프링 컨테이너에 의해 관리되는 재사용 소프트웨어 컴포넌트
2. 스프링 컨테이너가 관리하는 자바 객체, 하나 이상의 빈을 관리한다.
3. 인스턴스화된 객체를 의미한다.
4. 스프링 컨테이너에 등록된 객체를 스프링 빈이라고 한다.
5. @Bean이 적힌 메서드를 모두 호출해서 반환된 객체를 스프링 컨테이너에 등록한다.
6. 클래스의 등록 정보, 게터/세터 메서드를 포함한다.
7. 컨테이너에 사용되는 설정 메타데이터로 생성된다.(설정 메타데이터: XML 또는 자바 애너테이션, 자바코드로 표현하며 컨테이너의 명령과 인스턴스화, 설정, 조립할 객체를 정의한다.)

Bean 접근 방법
: ApplicationContext를 사용하여 bean의 정의를 읽고 액세스할 수 있다.
getBean()사용하여 bean의 인스턴스를 가져올 수 있다.
ApplicationContext 인터페이스는 bean을 가져오는 몇가지 방법들이 있다.
실제적으로 응용프로그램 코드에서는 getBean() 메서드로 호출해서 사용하면 안된다. - 이 이유에 대해서 고민해보자.

Bean Definition(빈 설정정보)
: Spring은 다양한 설정형식을 BeanDefinition 이라는 추상화 덕분에 지원할 수 있다. Bean은 BeanDefinition으로 정의되고 이에 따라서 활용방법이 달라진다. (속성에 따라 컨테이너가 Bean을 어떻게 생성하고 관리할 지 결정한다. @Bean 당 1개씩 메타정보가 생성된다. Spring이 설정 메타정보를 BeanDefinition 인터페이스를 통해 관리하기 때문에 컨테이너 설정을 XML, Java로 할 수 있는 것이다.)

컨테이너의 의미
: 소프트웨어 개발용어의 관점에서 컨테이너란 내부에 또 다른 컴포넌트를 가지고 있는 어떤 컴포넌트를 의미한다.
컨테이너는 먼저 객체를 생성하고 객체를 서로 연결한다. 객체를 설정하는 단계를 지나 마지막으로 생명주기 전반을 관리한다. 스프링 컨테이너에서 관리되는 객체를 Bean 이라고 한다.

  • 스프링은 스프링 컨테이너를 통해 객체를 관리한다.
  • 스프링 컨테이너에서 관리되는 객체를 Bean이라 한다.
profile
개발 공부하는 일상

0개의 댓글