본문 바로가기

Spring/토비의 스프링 3.1

1.5 스프링의 IoC


1.5 스프링의 IoC

스프링의 핵심

  • 빈 팩토리 또는 애플리케이션 컨텍스트
  • DaoFactory가 하는 일을 일반화한 것

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

애플리케이션 컨텍스트와 설정정보

빈(Bean)

  • 스프링이 제어권을 가지고 직접 만들고 관계를 부여하는 오브젝트
  • 스프링 컨테이너가 생성과 관계설정, 사용 등을 제어해주는 IoC가 적용된 오브젝트

빈 팩토리(Bean Factory)

  • 빈의 생성과 관계설정 등의 제어를 담당하는 IoC 오브젝트
  • 애플리케이션 컨텍스트(Application Context) : IoC 방식을 따라 만들어진 일종의 빈 팩토리
  • 빈 팩토리와 애플리케이션 컨텍스트는 동일하다고 봐도 무방
  • 설계도 : 애플리케이션 컨텍스트와 그 설정정보

DaoFactory를 사용하는 애플리케이션 컨텍스트

DaoFactory를 스프링의 빈 팩토리가 사용할 수 있는 설정정보로 변경하기

  • @Configuration : 빈 팩토리를 위한 오브젝트 설정하는 담당하는 클래스라고 인식시킴
  • @Bean : 오브젝트를 생성하는 메소드

DaoFactory.class

@Configuration // 애플리케이션 컨텍스트 또는 빈 팩토리가 사용할 설정정보라는 표시 
public class DaoFactory {
    @Bean // 오브젝트 생성을 담담하는 IoC용 메소드라는 표시
    public UserDao userDao() {
        return new UserDao(connectionMaker());
    }

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

애플리케이션 컨텍스트 만들기

  • ApplicationContext 타입의 오브젝트
  • AnnotationConfigApplicationContext : @Configuration이 붙은 자바 코드를 사용
  • 생성자 파라미터 : DaoFactory 클래스
  • getBean() : UserDao의 오브젝트를 가져옴

UserDaoTest.class

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

getBean("Bean Name", Return Type)

  • ApplicationContext가 관리하는 오브젝트를 요청하는 메소드
  • "userDao" : ApplicationContext에 등록된 빈의 이름 (메소드의 이름)
  • 이름을 사용하는 이유 : UserDao 생성 방식이나 구성을 다양하게 할 수 있음
  • ex) getBean("specialUserDao", UserDao.class)
  • 리턴 타입이 Object이므로 두 번째 파라미터에 리턴 타입을 주면 깔끔해진다.

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

오브젝트 팩토리 vs 스프링 애플리케이션 컨텍스트

오브젝트 팩토리 애플리케이션 컨텍스트
- IoC컨테이너 = 스프링컨테이너 = 빈 팩토리
UserDao등 Dao오브젝트를 생성하고 관계를 맺어줌 애플리케이션 내 IoC를 적용하여 관리할
모든 오브젝트에 대한 생성과 관계설정을 담당
오브젝트를 생성하고 관계를 맺는 직접적인 코드가 존재 해당 코드는 없고, 정보를 별도의 설정정보를 통해 얻음.
때로는 외부 오브젝트 팩토리에 그 작업을 위임하기도 함

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

  1. 애플리케이션 컨텍스트 : DaoFactory 클래스를 설정정보로 등록
  2. 애플리케이션 컨텍스트 : @Bean이 붙은 메소드의 이름을 가져와 빈 목록을 만들어 둠
  3. 클라이언트 : getBean() 메소드 호출
  4. 애플리케이션 컨텍스트 : 빈 목록에 해당 요청이 있는지 확인
  5. 애플리케이션 컨텍스트 : 있으면 빈 생성 메소드 호출하여 오브젝트 생성 후 돌려줌

애플리케이션 컨테스트 사용 시 장점

  1. 클라이언트는 구체적인 팩토리 클래스를 알 필요가 없다.
    • 오브젝트 팩토리가 아무리 많아져도 이를 알아야하거나 직접 사용할 필요가 없다. (확장에 유연)
  2. 애플리케이션 컨텍스트는 종합 IoC 서비스를 제공한다.
    • 오브젝트의 생성과 다른 오브젝트와의 관계 설정
    • 오브젝트의 생성 방식, 시점, 전략의 설정
    • 자동 생성, 후처리, 정보의 조합, 설정 방식의 다변화, 인터셉터 등 다양한 기능 제공
  3. 애플리케이션 컨텍스트는 빈을 검색하는 다양한 방법을 제공한다.
    • 타입만으로 빈을 검색하거나 특별한 애노테이션 설정이 되어있는 빈을 찾을 수 있음

1.5.3 스프링 IoC의 용어 정리

  1. 빈(Bean)
    • 스프링이 IoC방식으로 관리하는 오브젝트
    • 관리되는 오브젝트(managed object)라고도 함
    • 스프링의 모든 오브젝트가 빈은 아니며, 스프링이 직접 생성과 제어를 관리하는 오브젝트를 의미한다.
  2. 빈 팩토리(Bean Factory)
    • 스프링 IoC를 담당하는 핵심 컨테이너
    • 빈의 등록, 생성, 조회, 리턴 등 빈을 관리
    • 주로 빈 팩토리를 확장한 애플리케이션 컨텍스트(Application Context)를 이용
  3. 애플리케이션 컨텍스트(ApplicationContext)
    • 빈 팩토리를 확장한 IoC 컨테이너
    • 기본 기능은 빈 팩토리와 동일
    • 스프링이 제공하는 부가 서비스를 추가로 제공
  4. 설정정보/설정 메타정보(Configuration Metadata)
    • IoC를 적용하기 위해 사용하는 메타정보
    • 구성정보 / 형상정보
    • 청사진(bluprints)라고도 한다.
  5. 컨테이너(Container) 또는 IoC 컨테이너
    • IoC 방식으로 빈을 관리한다는 의미에서 애플리케이션 컨텍스트나 빈 팩토리를 의미한다.
    • 그래서 컨테이너가 무엇?
  6. 스프링 프레임워크
    • IoC 컨테이너, 애플리케이션 컨텍스트를 포함한 스프링이 제공하는 모든 기능을 통틀어 의미


' Spring > 토비의 스프링 3.1' 카테고리의 다른 글

1.7 의존관계 주입(DI)  (0) 2019.01.10
1.6 싱글톤 레지스트리와 오브젝트 스코프  (0) 2019.01.09
1.4 제어의 역전(IoC)  (0) 2019.01.07
1.3 DAO의 확장  (0) 2019.01.07
1.2 DAO의 분리  (0) 2019.01.03