728x90

DaoFactory를 통해 간단하게 IoC가 무엇인지 알게 되었고

이제 이 팩토리를 스프링의 도움을 받아 IoC를 적용해본다.

 

스프링이 제어권을 가지고 직접 만들고 관계를 부여하는 오브젝트

오브젝트 단위의 애플리케이션 컴포넌트

IoC가 적용된 오브젝트

빈 팩토리

빈의 생성, 관계설정 등의 제어를 담당하는 IoC 오브젝트

이를 더 확장한 애플리케이션 컨텍스트를 주로 사용

애플리케이션 컨텍스트

애플리케이션 설정정보를 바탕으로 빈의 생성과 관계설정을 총괄하는 IoC 엔진 같은 역할

애플리케이션 컨텍스트 적용하기 : 설정정보 생성하기

팩토리는 애플리케이션의 설계도 같은 것이라고 했는데

이말은 팩토리를 애플리케이션 컨텍스트의 설정정보로 사용할 수 있다는 것이다.

 

@Configuration 어노테이션을 사용하여 DaoFactory를

애플리케이션 컨텍스트에 사용 할 설정정보라는 것을 알려준다.

 

오브젝트를 생성하는 메서드는 오브젝트를 반환하니 당연히 빈으로 등록해줘야하고

@Bean 어노테이션을 사용하여 빈으로 등록할 것이라 알려준다.

@Configuration
public class DaoFactory {
	@Bean
	public UserDao userDao() {
		UserDao dao = new UserDao(connectionMaker());
		return dao;
	}

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

즉, 오브젝트를 관리하는 팩토리를 애플리케이션 컨텍스트의 설정정보로 설정하고

오브젝트를 생성하거나 반환하는 메서드라면 빈으로 등록하기만 하면 된다는 것이다.

 

애플리케이션 컨텍스트냉장고라고 생각하면

@Bean 어노테이션이 적용되어 있는 것들은 냉장고에 보관하고 있는 식재료

@Configuration 어노테이션이 적용되어 있는 클래스는

냉장고 안에 보관한 식재료들의 목록을 정리한 문서라고 볼 수 있다.

애플리케이션 컨텍스트 적용하기

ApplicationContext를 구현한 클래스는 여러 종류가 있고

@Configuration 어노테이션을 적용한 설정정보를 사용하여 ApplicationContext를 만들기 위해서는

AnnotationConfigApplicationContext라는 구현 클래스를 사용하면 된다.

AnnotationConfigApplicationContext context = 
new AnnotationConfigApplicationContext(DaoFactory.class);

이렇게 구현 클래스를 사용하여 애플리케이션 컨텍스트를 생성하면

위에서 말한대로 애플리케이션 컨텍스트라는 냉장고에 식재료들이 담겨져 있고

이를 getBean 메서드를 사용하여 저장된 오브젝트(식재료)를 가져올 수 있다.

UserDao dao = context.getBean("userDao", UserDao.class);

getBean 메서드는 애플리케이션 컨텍스트가 관리하는 오브젝트를 요청하는 메서드로

첫 번째 인자로는 등록된 빈의 이름을 받는데 굳이 이름을 지정하는 이유는

해당 오브젝트를 다른 구성으로 생성하는 다른 메서드를 추가할 수 있기 때문이다.

 

두 번째 인자처럼 제너릭 메서드 방식을 사용하면

기존의 Object 타입으로 오브젝트를 가져와 형변환 하여 사용해야 했던 것을 생략할 수 있다.

 

위의 코드는 아래의 코드와 비슷하다고 볼 수 있다.

UserDao dao = new UserDao();

애플리케이션 컨텍스트가 모든 오브젝트를 관리하고

컨텍스트를 통해 오브젝트를 가져와서 사용할 뿐이다.

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

애플리케이션 컨텍스트 인터페이스는 빈 팩토리 인터페이스를 상속 받았기 때문에 빈 팩토리라고 볼 수도 있고,

애플리케이션 컨텍스트를 IoC 컨테이너 혹은 스프링 컨테이너라고도 한다.

 

애플리케이션 컨텍스트는 자동으로 IoC를 적용하고 자신이 관리하는 모든 오브젝트에 대해

오브젝트의 생성과 관계 설정을 처리해준다.

 

하지만 애플리케이션 컨텍스트 스스로 오브젝트를 생성할 수는 없고

위에서 작성한 코드처럼 @Configuration 어노테이션이 붙은 설정정보 클래스의

오브젝트를 생성하여 반환하는 메서드를 사용하여 getBean 메서드를 사용한

클라이언트에게 전달해주기만 할 뿐이다.

 

getBean("userDao") → 애플리케이션 컨텍스트의 빈 목록에서 해당하는 빈 조회

→ 해당하는 빈의 메서드를 실행 → 실행된 메서드가 오브젝트를 생성하고 오브젝트를 반환

→ 애플리케이션 컨텍스트가 클라이언트에 오브젝트 전달

애플리케이션 컨텍스트의 장점

기존의 팩토리 방식은 오브젝트를 추가할 때마다 어떤 팩토리 클래스를 사용할지 알아야하고

필요할 때마다 팩토리 오브젝트를 생성해야하는 번거로움이 있다.

 

애플리케이션 컨텍스트를 사용하면 일관된 방식으로 원하는 오브젝트를 가져올 수 있고,

단순한 방식을 사용해 설정정보를 만들 수 있다.

 

오브젝트 생성, 관계 설정, 오브젝트 생성 방식, 상황에 따른 시점과 전략 수정, 자동생성,

후처리, 정보의 조합, 설정 방식의 다변화, 인터셉팅 등을 포함한 애플리케이션 컨텍스트가

제공해주는 많은 기능뿐만 아니라 빈 팩토리를 상속 받았기 때문에

빈이 사용할 수 있는 기능들도 사용할 수 있다.

 

인텔리제이가 자바 개발을 위한 IDE라면 애플리케이션 컨텍스트는 오브젝트를 위한 IDE다.

 

또한, 빈을 쉽고 다양하게 조회할 수 있는데

getBean 메서드는 빈의 이름을 사용해 빈을 찾을 수 있고,

타입이나 특별한 어노테이션이 적용되어 있는 빈도 조회 가능하다.

용어 정리

스프링이 직접 IoC 방식으로 관리하는 오브젝트

 

빈 팩토리

스프링의 IoC를 담당하는 핵심 컨테이너

빈 등록, 생성, 조회, 부가적인 관리 등을 담당

빈 팩토리를 직접적으로 사용하지는 않고 애플리케이션 컨텍스트를 통해 사용

getBean 메서드 같은 경우가 빈 팩토리에 정의되어 있다.

 

애플리케이션 컨텍스트

빈 팩토리를 확장한 IoC 컨테이너

빈 팩토리 + 스프링의 추가 기능

 

설정정보/설정 메타정보

애플리케이션 컨텍스트/빈 팩토리가 IoC를 적용하기 위해 사용하는 메타정보

 

컨테이너/IoC 컨테이너

IoC 방식으로 빈을 관리하는 역할을 수행한다.

역할이 애플리케이션 컨텍스트/빈 팩토리와 같기 때문에

보통 스프링 컨테이너 하면 애플리케이션 컨텍스트와 같다고 본다.

 

스프링 = 스프링 컨테이너 = 애플리케이션 컨텍스트

'Back-End > Spring' 카테고리의 다른 글

DI(Dependency Injection)  (0) 2023.06.07
싱글톤 레지스트리 / 오브젝트 스코프  (0) 2023.06.07
IoC(Inversion of Control, 제어의 역전)  (0) 2023.06.05
초난감 DAO와 객체지향  (0) 2023.06.05
초난감 DAO 리팩토링하기  (0) 2023.06.05

+ Recent posts