BackEnd/Spring & Springboot Study

[토비의 스프링] 1.5 스프링의 Ioc

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

스프링의 핵심을 담당하는 빈 팩토리 또는 애플리케이션 컨텍스트에 대해 알아보자.

더보기

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

빈(bean)이란?

  • 스프링에서 스프링이 제어권을 가지고 직접 관계를 부여하는 오브젝트
  • 자바빈 또는 엔터프라이즈 자바빈(EJB)에서 말하는 빈과 비슷한 오브젝트 단위의 애플리케이션 컴포넌트
  • 스프링 컨테이너가 생성과 관계설정, 사용 등을 제어해주는 제어의 역전이 적용된 오브젝트

빈 팩토리(bean factory)란?

  • 빈의 생성과 관계설정 같은 제어를 담당하는 IoC 오브젝트
  • 보통 빈 팩토리를 확장한 애플리케이션 컨텍스트(IoC 방식에 따라 만들어진 빈 팩토리)를 사용한다.
  • 빈을 생성하고 관계를 설정하는 IoC의 기본 기능에 초점

애플리케이션 컨텍스트(Application context)란?

  • 빈 팩토리와 동일하나 애플리케이션 전반에 걸쳐 모든 구성요소의 제어 작업을 담당하는 IoC엔진이란 의미가 부각됌
  • 별도의 정보를 참고해 빈(object)의 생성, 관계설정 등의 제어 작업을 총괄
  • 별도의 설정정보를 담고 있는 무엇인가를 가져와 이를 활용하는 범용적인 IoC 엔진

 

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

 

@Configuration

  • 스프링이 빈 팩토리를 오브젝트 설정을 담당하는 클래스라고 인식하게 하는 어노테이션
  • 수동으로 스프링 컨테이너에 빈을 등록하기 위해 사용됌

@Bean

  • 오브젝트 생성을 담당하는 IoC용 메소드
  • 메소드 이름으로 빈 이름이 결정되므로 중복된 빈 이름이 존재하지 않도록 주의
  • 개발자가 직접 제어가 불가능한 라이브러리를 활용시 사용
  • 유지보수성을 높이기 위해 애플리케이션 전범위적으로 사용되는 클래스를 등록시 사용
  • 다형성을 활용하여 여러 구현체를 등록해주어야 할때 사용

Example Code

스프링 빈 팩토리가 사용할 설정정보를 담은 DaoFactory 클래스

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

 

Example Code

애플리케이션 컨텍스트를 적용한 UserDaoTest

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);
	}
}

 

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

오브젝트 팩토리를 이용했던 방식과 애플리케이션 컨텍스트를 사용한 방식을 비교하면서 동작방식을 알아보자.

더보기

ApplicationContext는 빈 팩토리가 구현하는 BeanFactory 인터페이스를 상속했으므로 일종의 빈 팩토리로 볼 수 있다.

 

DaoFactory

  • UserDao를 비롯한 DAO 오브젝트를 생성하고 DB 생성 오브젝트와 관계를 맺어주는 제한적인 역할

애플리케이션 컨텍스트(Application Context)

  • 애플리케이션에서 IoC를 적용해서 관리할 모든 오브젝트에 대한 생성과 관계설정을 담당
  • 오브젝트 생성 및 관계연결 코드 대신 그런 생성정보와 연관관계 정보를 별도의 설정 정보를 통해 얻음

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

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

  • 클라이언트는 구체적인 팩토리 클래스를 알 필요가 없다.
    • IoC 적용 오브젝트 추가시 적절한 팩토리 클래스를 사용 및 생성해야함
    • 일관된 방식으로 원하는 오브젝트를 가져올 수 있음
    • XML등의 방법으로 애플리케이션 컨텍스트가 사용할 IoC 설정정보를 만들 수 있음
  • 애플리케이션 컨텍스트는 종합 IoC 서비스를 제공해준다.
    • 오브젝트가 만들어지는 방식, 시점과 전략을 다르게 가져갈 수 있다.
    • 자동생성, 오브젝트에 대한 후처리, 정보의 조합, 설정 방식의 다변화, 인터셉팅등 기능 제공
    • 빈이 사용할 수 있는 기반기술 서비스나 외부 시스템과의 연동 등을 컨테이너 차원에서 제공
  • 애플리케이션 컨텍스트는 빈을 검색하는 다양한 방법을 제공한다.
    • getBean() 메소드는 빈의 이름을 통해  빈을 찾아줌
    • 타입만으로 빈을 검색하거나 특별한 애노테이션 설징이 되어 있는 빈을 찾을 수도 있다.

 

3.  스프링 IoC의 용어 정리

 

  • 빈(Bean)
    • 스프링이 IoC방식으로 관리하는 오브젝트
    • 스프링이 직접 그 생성과 제어를 담당하는 오브젝트
  • 빈 팩토리(bean factory)
    • 스프링의 IoC를 담당하는 핵심 컨테이너
    • 빈의 등록, 생성, 조회, 반환 및 관리 기능
    • 보통 이를 확장시킨 애플리케이션 컨텍스트를 이용
    • BeanFactory라 붙여쓰면 빈 팩토리가 구현하고 있는 가장 기본적인 인터페이스의 이름
    • 이 인터페이스에 getBean()과 같은 메소드가 정의되어 있음
  • 애플리케이션 컨텍스트(application context)
    • 빈 팩토리를 확장한 IoC 컨테이너
    • 빈의 생성과 제어를 담당하는 빈 팩토리를 상속한다.
    • 추가로 스프링이 제공하는 애플리케이션 지원 기능을 포함
    • ApplicationContext라고 적으면 애플리케이션 컨텍스트가 구현해야 하는 기본 인터페이스를 가리킴
  • 설정정보 / 설정 메타정보(configuration metadata)
    • 애플리케이션 컨텍스트 또는 빈 팩토리가 IoC를 적용하기 위해 사용하는 메타정보
    • 컨테이너에 어떤 기능을 세팅하거나 조정하는 경우 사용
    • IoC 컨테이너에 의해 관리되는 애플리케이션 오브젝트를 생성하고 구성할 때 사용
    • 애플리케이션 형상정보 또는 애플리케이션의 전체 그림이 그려진 청사진(blueprints)이라고도 한다.
  • 컨테이너(container) 또는 IoC 컨테이너
    • IoC 방식으로 빈을 관리한다는 의미에서 애플리케이션 컨텍스트나 빈 팩토리를 컨테이너 또는 IoC 컨테이너라 함
    • IoC 컨테이너는 주로 빈 팩토리 관점
    • 그냥 컨테이너 또는 스프링 컨테이너라 할 때는 애플리케이션 컨텍스트를 가리킴
    • 애플리케이션 컨텍스트 오브젝트는 하나의 애플리케이션에서 여러개 만들어 사용, 통틀어 스프링 컨테이너라 부름
  • 스프링 프레임워크
    • IoC 컨테이너, 애플리케이션 컨텍스트를 포함해 스프링이 제공하는 모든 기능을 통틀어 말할 때 주로 사용