모르지 않다는 것은 아는것과 다르다.

Books

스프링 IoC 와 애플리케이션 컨텍스트 (토비의 스프링 1장)

채마스 2022. 2. 26. 09:49

IoC

  • 객체가 사용할 객체를 스스로 선택하거나 생성하지 않는다.
  • 객체 자신도 어떻게 만들어지고 어디서 사용되는지 알 수 없다.
  • 모든 제어권을 다른 대상에게 위임한다.

 

스프링의 IoC

    • Spring Container가 제어권을 가지고 직접 생성하고 관계를 부여하는 대상이 되는 객체를 말한다.
  • 빈 팩토리
    • Bean을 생성하고 관계를 설정하는 IoC 객체이다.
    • Bean을 등록하고 생성하고 반환하고 관리한다.
    • 보통 Bean Factory 를 확장한 애플리케이션 컨텍스트를 사용한다.
  • 애플리케이션 컨텍스트
    • Bean Factory 를 상속하여 확장한 것으로 IoC 방식을 따라 만들어진 일종의 Bean Factory 이다.
    • Bean Factory 가 빈을 제어하는 IoC 기본 기능에 초점을 맞춘것이라면, 애플리케이션 컨텍스트는 애플리케이션 전반에 걸쳐 모든 구성요소의 제어를 담당하는 IoC 엔진에 더 중점을 두고 있다.

 

IoC 컨테이너 / 스프링 컨테이너

  • IoC 컨테이너와 스프링 컨테이너는 다른 것이 아니다. 다만 관점이 조금 다를 뿐이다.
  • IoC 컨테이너의 경우 주로 빈 팩토리 관점에서 이야기할 때 쓰인다.
  • 컨테이너/스프링 컨테이너라고 할 때는 애플리케이션 컨텍스트를 추상적으로 가리킬 때 사용한다.
  • 결론은 컨테이너 == 스프링 컨테이너 == IoC 컨테이너 == 애플리케이션 컨텍스트 == 빈 팩토리 == 스프링 모두 같은 것이라고 생각하면 된다.

 

애플리케이션 컨텍스트

  • 애플리케이션 컨텍스트는 객체를 직접 생성하고 할당하는 코드가 없다.
  • 대신 그것에 대한 정보를 설정 정보를 통해서 얻는다.
  • 동작방식
    • @Configuration 등이 붙은 클래스를 설정 정보로 등록해둔다.
    • @Bean이 붙은 메소드들의 이름을 가져와 이름과 메소드를 매핑해둔 Bean List를 생성해둔다.
    • getBean()이 호출되면 Bean List에서 해당되는 이름의 메소드를 찾아 호출하고 그 결과를 클라이언트에게 반환한다.
  • 장점
    • 직접 코드를 작성하는 대신, 어노테이션, XML 등의 간단한 방법으로 IoC 설정을 할 수 있다.
    • 종합적인 IoC 서비스를 제공한다.
    • 빈의 생성과 관계 설정 뿐만 아니라 생성 방식이나 생성 시점 그리고 전략까지 설정할 수 있다.
    • 빈이 사용할 수 있는 기반 기술 서비스나 외부 시스템과의 연동 등을 컨테이너 차원에서 지원해 줄 수도 있다.

 

싱글톤 레지스트리

  • 스프링이 직접 싱글톤 객체를 만들고 관리하는 기능을 제공하는 것을 말한다.
  • 애플리케이션 컨텍스트가 싱글톤을 저장하고 관리하는 싱글톤 레지스트리이다.
  • 애플리케이션 컨텍스트가 싱글톤 레지스트리인 이유는 애초에 스프링은 서버 환경을 고려해서 설계되었기 때문이다.
    • 초당 수많은 요청이 들어오는 가운데, 요청이 들어올 때마다 객체를 새로 생성하는 것은 엄청난 낭비이다.
    • 자바에서는 서블릿 또한 싱글톤으로 존재한다.
  • 빈 객체는 모두 싱글톤으로 만들어진다.
  • 디자인 패턴에서의 싱글톤과 개념은 비슷하지만, 구현방식은 완전히 다르다.
  • 싱글톤 레지스트리의 장점
    • 평범한 public 생성자를 가진 자바 클래스를 싱글톤으로 활용할 수 있게 만들어준다.
    • 제어권을 IoC 방식의 컨테이너에게 넘기면 해당 컨테이너가 객체 생성에 대한 모든 권한을 가지고 있기 때문에 객체가 싱글톤으로 존재할 수 있게 관리할 수 있다.

 

DI 컨테이너

  • 두 객체 사이의 런타임 의존관계를 설정해주는 의존 관계 주입 작업을 주도하는 존재이다.

 

의존관계 주입 (DI)

  • 오브젝트 레퍼런스를 외부로부터 주입 받고, 이를 통해 여타 오브젝트와 동적으로 의존관계가 만들어지는 것을 말한다.
  • 의존관계 주입이란 의존 오브젝트와 그것을 사용할 주체 오브젝트를 런타임 시에 연결해주는 작업을 말한다.

 

의존관계 검색 (DL)

  • 객체 스스로 검생하여 의존관계를 맺는 것을 말한다.
  • 의존관계를 맺을 대상 객체를 결정하고 생성하는 작업은 외부 컨테이너에게 IoC로 맡기지만, 이를 가져올 때는 메소드나 생성자를 통한 주입 대신 스스로 컨테이너에게 요청하는 방법을 사용한다.
  • context.getBean("connectionMaker", ConnectionMaker.class); 이렇게 컨테이너에게 직접 요청하는 것이다.
  • DL에서는 검색을 하는 주체 객체는 꼭 스프링 빈일 필요가 없다는 것다.
  • 하지만 DI의 경우에는 반드시 스프링 빈 객체여야만 한다.

 

 

REFERENCES

  • 토비의 스프링 1장

'Books' 카테고리의 다른 글

클린코드 4장 (주석)  (0) 2022.04.23
클린코드 3장 (함수)  (0) 2022.04.17
클린코드 1장, 2장  (0) 2022.04.17
템플릿 콜백 패턴 (토비의 스프링 3장)  (0) 2022.02.28
테스트란 (토비의 스프링 2장)  (0) 2022.02.27