[토비의 스프링 3.1] 1.5 스프링의 IoC

2022. 5. 27. 11:08토비의 스터디

1.5, 1.6장은 스터디에서 내가 맡은 부분이라 발표에 사용한 자료를 그대로 가져왔다.

이제 스프링을 사용해본다.
기존에 만든 DaoFactory을 스프링이 사용 가능하도록 만들어보자.

간단한 개념을 소개하자면,

  • 스프링이 제어권을 가지고 직접 생성과 관계를 맺어주는 오브젝트를 빈(Bean)이라고 한다.
  • 빈의 생성, 관계 설정 등의 제어를 담당하는 IoC 오브젝트를 빈 팩토리라고 하며 애플리케이션 컨텍스트를 사용한다.
  • 애플리케이션 컨텍스트는 별도의 설정 정보를 참고해서 빈에 대한 제어 작업을 총괄한다.

1.5.1 오브젝트 팩토리를 이용한 스프링 IoC

앞서 만든 DaoFactory를 스프링의 애플리케이션 컨텍스트가 사용할 수 있는 설정정보로 만들어보자.

  • 먼저, 설정을 담당하는 클래스는 스프링이 인식할 수 있도록 @Configuration이라는 애노테이션을 추가한다.
  • 오브젝트를 생성해주는 메소드에는 @Bean이라는 애노테이션을 붙여준다.
  @Configuration // 애플리케이션 컨텍스트가 사용할 설정정보
  public class DaoFactory{
      @Bean // 오브젝트 생성을 담당하는 메소드
      public UserDao userDao(){
          return new UserDao(connectionMaker());
      }

      @Bean
      public ConnectionMaker connectionMaker(){
          return new DConnectionMaker();
      }
  }

이제 DaoFactory를 설정정보로 사용하는 애플리케이션 컨텍스트를 만들어보자. @Configuration 애노테이션을 사용하므로 AnnotationConfigApplicationContext를 이용한다.

public class UserDaoTest{
    public static void main(String[] args) throws ClassNotFoundException, SQLException{
        ApplicationContext context = new AnnotationConfigApplicationContext(DaoFactory.class);
        UserDao dao = context.getBean("userDao", UserDao.class);
    }
}

ApplicationContext을 생성했다면 이제 클라이언트는 getBean() 메소드를 이용해 ApplicationContext가 관리하는 오브젝트를 요청할 수 있다.

  • 첫 번째 파라미터는 ApplicationContext에 등록된 빈의 이름이다. @Bean 애노테이션이 붙은 메소드 이름이 빈의 이름이다.
  • 두 번째 파라미터에는 리턴타입을 입력할 수 있다. getBean()메서드는 Object를 반환하므로, 리턴타입을 입력할 경우 지저분한 형 변환 코드를 생략할 수 있다.

참고로 타입만 입력하는 경우, 검색한 타입의 자손 타입의 Bean들도 함께 조회된다. 첫 번째 파라미터로 이름을 적어주면 원하는 Bean을 단건으로 조회할 수 있다.

1.5.2. 애플리케이션 컨텍스트의 동작방식

  • 기존의 오브젝트 팩토리인 DaoFactory는 직접 DAO 오브젝트를 생성하고 DB 오브젝트와 관계를 직접 맺어주었다. 이와 달리 ApplicationContext는 생성과 연관관계 정보를 별도의 설정정보를 통해 얻는다.
  1. 애플리케이션 컨텍스트는 등록된 설정정보에서 @Bean이 붙은 메소드의 이름을 가져와 Bean 목록을 생성한다.
  2. 클라이언트가 getBean() 메소드를 호출하면, 만들어둔 Bean 목록에서 요청한 이름을 찾는다.
  3. 일치하는 이름이 있다면 Bean을 생성하는 메소드를 호출해서 오브젝트를 생성한 후 클라이언트에 돌려준다.
  • 오브젝트 팩토리와 비교한 ApplicationContext의 장점
    • 클라이언트는 구체적인 팩토리 클래스를 알 필요가 없다.
      • 애플리케이션이 발전할수록 오브젝트는 계속 추가된다. 각각의 오브젝트가 요하는 팩토리 클래스를 알 필요 없이 일관된 방식으로 원하는 오브젝트를 가져올 수 있다.
    • 종합 IoC 서비스를 제공해준다.
      • 오브젝트 생성, 관계 설정뿐만 아니라 오브젝트의 생성 방식, 시점과 전략을 선택할 수 있다.
      • 부가적으로 자동생성, 오브젝트에 대한 후처리, 인터셉팅 등 다양한 기능을 제공한다.
    • 빈을 검색하는 다양한 방법을 제공한다.
      • getBean() 메소드는 빈의 이름을 이용해 빈을 찾는다.
      • 타입으로도 빈을 검색할 수 있으며 특정 애노테이션 설정이 되어 있는 빈을 찾을 수도 있음.

1.5.3. 스프링 IoC 용어 정리

  • Bean(빈)
    • 스프링이 IoC 방식으로 관리하는 오브젝트
    • 스프링이 직접 생성과 제어를 담당하는 오브젝트
  • Bean Factory(빈 팩토리)
    • 스프링 IoC를 담당하는 핵심 컨테이너
    • 빈을 등록, 생성, 조회, 반환, 관리하는 기능
  • Application Context(애플리케이션 컨텍스트)
    • 빈 팩토리를 확장한 IoC 컨테이너
    • 빈 팩토리의 기능에 부가 서비스를 추가로 제공
  • Configuration metadata(설정정보)
    • 애플리케이션 컨텍스트 또는 빈 팩토리가 IoC를 적용하기 위해 사용하는 메타정보
    • IoC 컨테이너에 의해 관리되는 애플리케이션 오브젝트를 생성하고 구성할때 사용
    • 애플리케이션의 청사진
  • IoC Container(IoC 컨테이너)
    • IoC 방식으로 빈을 관리하는 애플리케이션 컨텍스트, 빈 팩토리