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 컨테이너, 애플리케이션 컨텍스트를 포함해 스프링이 제공하는 모든 기능을 통틀어 말할 때 주로 사용
'BackEnd > Spring & Springboot Study' 카테고리의 다른 글
[토비의 스프링] 1.7 의존관계 주입(DI) (0) | 2022.12.04 |
---|---|
[토비의 스프링] 1.6 싱글톤 레지스트리와 오브젝트 스코프 (0) | 2022.12.03 |
[토비의 스프링] 1.4 제어의 역전(IoC) (0) | 2022.12.01 |
[토비의 스프링] 1.3 DAO의 확장 (0) | 2022.11.29 |
[토비의 스프링] 1.2 DAO의 분리 (0) | 2022.11.28 |