Search
Duplicate
🍃

1.5 스프링의 IoC

태그

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

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

스프링에서는 스프링이 제어권을 가지고 직접 만들고 관계를 부여하는 오브젝트를 빈(bean)이라고 부른다. 자바빈 또는 엔터프라이즈 자바빈(EJB)에서 말하는 빈과 비슷한 오브젝트 단위의 애플리케이션 컴포넌트를 말한다. 동시에 스프링 빈은 스프링 컨테이너가 생성과 관계설정, 사용 등을 제어해주는 제어의 역전이 적용된 오브젝트를 가리키는 말이다.
스프링에서는 빈의 생성과 관계설정 같은 제어를 담당하는 IoC 오브젝트를 빈 팩토리(bean factory)라고 부른다. 보통 빈 팩토리보다는 이를 좀 더 확장한 애플리케이션 컨텍스트(application context)를 주로 사용한다. (빈 팩토리, Application context, IoC 컨테이너, 스프링 컨테이너 모두 같은 말임)
애플리케이션 컨텍스트는 IoC 방식을 따라 만들어진 일종의 빈 팩토리라고 생각하면 된다. 빈 팩토리라고 말할 때는 빈을 생성하고 관계를 설정하는 IoC의 기본 기능에 초점을 맞춘 것이고, 애플리케이션 컨텍스트라고 말할 때는 애플리케이션 전반에 걸쳐 모든 구성요소의 제어 작업을 담당하는 IoC 엔진의 의미가 좀 더 부각된다.
애플리케이션 컨텍스트는 별도의 정보를 참고해서 빈(오브젝트)의 생성, 관계설정 등의 제어 작업을 총괄한다. 기존 DaoFactory 코드에는 설정정보(어떤 클래스의 오브젝트를 생성, 어디에서 사용하도록 연결 등,,,)를 자바 코드로 만들어져 있다. 하지만 애플리케이션 컨텍스트는 직접 이런 설정정보를 담고 있지 않다. 대신 별도로 설정정보를 담고 있는 무엇인가를 가져와 이를 활용하는 범용적인 IoC 엔진 같은 것이라고 볼 수 있다.
앞서 만든 오브젝트 팩토리인 DaoFactory는 그 자체가 설정정보까지 담고 있는 IoC 엔진이었다. 이전 설명에서 애플리케이션의 로직을 담고 있는 컴포넌트와 설계도 역할을 하는 팩토리를 구분했었는데, 바로 이 설계도라는 것이 애플리케이션 컨텍스트와 그 설정정보를 말한다고 보면 된다.
설계도는 그 자체로는 애플리케이션 로직을 담당하지는 않지만 IoC 방식을 이용해 애플리케이션 컴포넌트를 생성하고, 사용할 관계를 맺어주는 등의 책임을 담당하는 것이다. 건물이 설계도면을 따라 만들어지듯이, 애플리케이션도 애플리케이션 컨텍스트와 그 설정정보를 따라서 만들어지고 구성된다고 볼 수 있다.

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

DaoFactory를 스프링의 빈 팩토리가 사용할 수 있도록 설정정보로 바꾸는 과정을 진행해 보자. 아래의 두가지 어노테이션을 통해 스프링 프레임워크의 빈 팩토리 또는 애플리케이션 컨텍스트가 IoC 방식의 기능을 제공할 때 사용할 설정정보를 만들 수 있다.
@Configuration
⇒ 스프링이 빈 팩토리를 위한 오브젝트 설정을 담당하는 클래스라고 인식하도록 하는 어노테이션
@Bean
⇒ 오브젝트를 만들어주는 메서드에 붙이는 어노테이션
스프링 빈 팩토리가 사용할 설정정보를 담은 DaoFactory 클래스
... @Configuration // 애플리케이션 컨텍스트 또는 빈 팩토리가 사용할 설정정보라는 Annotation public class DaoFactory{ @Bean // 오브젝트 생성을 담당하는 IoC용 메서드라는 표시 public UserDao userDao(){ return new UserDao(connectionMaker()); } @Bean public ConnectionMaker connectionMaker(){ return new DconnectionMaker(); } }
Java
복사
설정정보를 만들었으니 이번엔 그 설정정보를 활용하는 애플리케이션 컨텍스트를 만드는 과정을 진행한다. 애플리케이션 컨텍스트는 ApplicationContext 타입의 오브젝트이다. ApplicationContext를 구현한 클래스는 여러 가지가 존재한다. DaoFactory처럼 @Configuration이 붙은 자바 코드를 설정정보로 사용하려면 AnnotationConfigApplicationContext 키워드를 사용할 수 있다. 이렇게 준비된 ApplicationContext의 getBean() 메서드를 통해 UserDao의 오브젝트를 가져올 수 있다.
애플리케이션 컨텍스트를 적용한 UserDaoTest
public class UserDaoTest{ public static void main(String[] args) throws ClassNotFounException, SQLException{ ApplicationContext context = new AnnotationConfigApplicationContext(DaoFactory.class); UserDao dao = context.getBean("userDao", UserDao.class); ... }
Java
복사
getBean("빈의 이름", 리턴 타입)
ApplicationContext가 관리하는 오브젝트를 요청하는 메서드
1번째 파라미터는 빈의 이름이다.
UserDao라는 이름의 빈을 가져온다는 것은 DaoFacotry의 userDao( ) 메서드를 호출해서 그 결과를 가져오는 것과 동일하다.
2번째 파라미터는 리턴 타입이다.
getBean()은 기본적으로 Object 타입으로 리턴하게 되어있어서 애번 리턴되는 오브젝트에 다시 캐스팅을 해줘야 하는 부담이 있다. 자바 5 이상의 제네릭 메서드 방식을 사용해 2번째 파라미터에 리턴 타입을 주면 그런 불편함을 없앨 수 있다.

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

DaoFacotry가 UserDao를 비롯한 DAO 오브젝트를 생성하고 DB 생성 오브젝트와 관계를 맺어주는 제한적인 역할을 하는 데 반해, 애플리케이션 컨텍스트는 애플리케이션에서 IoC를 적용해서 관리할 모든 오브젝트에 대한 생성과 관계설정을 담당한다.
대신 ApplicationContext에는 DaoFactory와 달리 직접 오브젝트를 생성하고 관계를 맺어주는 코드가 없고, 그런 생성정보와 연관관계 정보를 별도의 설정정보를 통해 얻는다. 때로는 외부의 오브젝트 팩토리에 그 작업을 위임하고 그 결과를 가져다 사용하기도 한다.
내부적으로는 애플리케이션 컨텍스트가 DaoFactory의 userDao( ) 메서드를 호출해서 오브젝트를 가져온 것을 클라이언트가 getBean( )으로 요철할 때 전달해준다.
1.
애플리케이션 컨텍스트는 DaoFactory 클래스를 설정정보로 등록해두고 @Bean이 붙은 메서드의 이름을 가져와 빈 목록을 만들어둔다.
2.
클라이언트가 애플리케이션 컨텍스트의 getBean( ) 메서드를 호출하면 자신의 빈 목록에서 요청한 이름을 찾는다.
3.
요청한 이름이 존재한다면 빈 생성 메서드를 호출해서 오브젝트를 생성하고 클라이언트에게 반환한다.

ApplicationContext의 장점

1.
클라이언트는 구체적인 팩토리 클래스를 알 필요가 없다.
애플리케이션 컨텍스트를 사용하면 오브젝트 팩토리가 아무리 많아져도 이를 알아야 하거나 직접사용할 필요가 없이 일관된 방식으로 원하는 오브젝트를 가져올 수 있다. 또 DaoFactory처럼 자바 코드를 작성하는 대신 XML처럼 단순한 방법을 사용해 애플리케이션 컨텍스트가 사용할 IoC 설정정보를 만들 수 있다.
2.
애플리케이션 컨텍스트는 종합 IoC 서비스를 제공해준다.
애플리케이션 컨텍스트는 오브젝트 생성과 다른 오브젝트와의 관계설정 뿐만이 아니라 오브젝트가 만들어지는 방식, 시점과 전략을 다르게 가져갈 수도 있고, 이에 부가적으로 자동생성, 오브젝트에 대한 후처리, 정보의 조합, 설정 방식의 다변화, 인터셉팅 등 오브젝트를 효과적으로 활용할 수 있는 다양한 기능을 제공한다.
3.
애플리케이션 컨텍스트는 빈을 검색하는 다양한 방법을 제공한다.
애플리케이션 컨텍스트의 getBean( ) 메서드는 빈의 이름을 이용해 빈을 찾아준다. 이외에도 타입만으로 빈을 검색하거나 특별한 어노테이션이 설정이 되어 있는 빈을 찾을 수도 있다.

스프링 IoC 용어정리

빈(bean)
스프링이 IoC 방식으로 관리하는 오브젝트
스프링이 직접 그 생성과 제어를 담당하는 오브젝트만을 빈이라고 부름
빈 팩토리(bean factory)
스프링의 IoC를 담당하는 핵심 컨테이너
빈을 등록하고, 생성하고, 조회하고 반환하고, 그 외에 부가적인 빈을 관리하는 기능을 담당
보통은 이 빈 팩토리를 바로 상요하지 않고 이를 확장한 애플리케이션 컨텍스트를 이용
애플리케이션 컨텍스트(application context)
빈 팩토리를 확장한 IoC 컨테이너
빈을 등록하고 관리하는 기본적인 기능은 빈 팩토리와 동일
빈 팩토리의 기본 기능 + 스프링이 제공하는 각종 부가 서비스를 추가로 제공
ApplicationContext는 BeanFactory를 상속한다.
설정정보/설정 메타정보(configuration metadata)
ApplicationContext 또는 빈 팩토리가 IoC를 적용하기 위해 사용하는 메타정보
IoC 컨테이너 컨테이너에 의해 관리되는 애플리케이션을 생성하고 구성할 때 사용
컨테이너/IoC 컨테이너
IoC 방식으로 빈을 관리한다는 의미에서 ApplicationContext나 빈 팩토리를 컨테이너 또는 IoC 컨테이너라고도 함
빈 팩토리의 관점 → IoC 컨테이너 애플리케이션 컨텍스트 관점 → 컨테이너, 스프링 컨테이너