본문 바로가기

스터디/토비의 스프링 3.1

[토비의 스피링] 1.5 스프링의 IoC

1.5 스프링의 IoC

스프링에서는 스프링이 제어권을 가지고 직접 만들고 관계를 부여하는 오브젝트를 가지고 있으며 이를 BEAN 이라고 부른다.

용어 정리

==빈== 또는 ==빈 오브젝트== 는 스프링이 IoC 방식으로 관리하는 오브젝트 라는 뜻이다.

스프링에서 사용하는 애플리케이션에서 만들어지는 모든 오브젝트가 다 빈은 아니며 그 중에서 스프링이 직접 그 생성과 제어를 담당하는 오브젝트만을 빈이라고 부른다.

==빈 팩토리== 는 스프링의 IoC 를 담당하는 핵심 컨테이너를 가리킨다. 빈을 등록하고 생성하고 조회하고 돌려주고 그 외에 부가적인 빈을 관리하는 기능을 담당한다. 보통은 이를 확장한 애플리케이션 컨텍스트 를 이용한다.

BeanFactory 라고 붙여쓰면 빈 팩토리가 구현하고 있는 가장 기본적인 인터페이스의 이름이 되며 이 인터페이스에 getBean() 과 같은 메소드가 정의되어 있다.

==애플리케이션 컨텍스트== 는 빈 팩토리 를 확장한 IoC 컨테이너다. ApplicationContext라고 적으면 애플리케이션 컨텍스트가 구현해야 하는 기본 인터페이스를 가리키며 ApplicationContext는 BeanFactory를 상속한다.

==설정정보/ 설정 메타정보== 는 애플리케이션 컨텍스트 또는 빈 팩토리가 IoC를 적용하기 위해 사용하는 메타정보를 말한다. IoC 컨테이너에 의해 관리되는 애플리케이션 오브젝트를 생성하고 구성할 때 사용된다.

==컨테이너 또는 IoC컨테이너== 는 IoC 방식으로 빈을 관리한다는 의미에서 애플리케이션 컨텍스트, 빈 팩토리를 의미한다.


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

DaoFactory를 설정정보로 만들어 스프링의 빈 팩토리가 사용할 수 있도록 해보자

package com.cafe24.dao;

@Configuration
public class DaoFactory {

    /* UserDao 클래스와 ConnectionMaker 인터페이스의 독립된 관계 형성을 위한 팩토리 클래스*/
    @Bean
    public UserDao userDao() {
        return new UserDao(connectionMaker());
    }
    @Bean
    public BoardDao BoardDao() {
        return new BoardDao(connectionMaker());
    }
    @Bean
    public GuestbookDao GuestbookDao() {
        return new GuestbookDao(connectionMaker());
    }
    @Bean
    public ConnectionMaker connectionMaker() {
        return new DConnectionMaker();
    }
}

우리가 현재 하고 있는 xml에 bean을 설정하는 방식을 @Configuration이라는 어노테이션을 통해 표시하였으며 @Bean 어노테이션으로 오브젝트 생성을 담당하는 IoC용 메소드라고 표시를 하였다. 자바 코드의 클래스이지만 XML과 같은 설정정보로 보는 것이 좋다.

DaoFactory의 설정정보를 사용하는 ApplicationContext를 UserDaoTest에 구현해보자

package com.cafe24.test;

import com.cafe24.dao.DaoFactory;
import com.cafe24.dao.UserDao;

public class UserDaoTest {

    public static void main(String[] args) {

        ApplicationContext context = new AnnotationConfigApplicationContext(DaoFactory.class);
        UserDao dao = context.getBean("userDao", UserDao.class);

    }

}

DaoFactory는 xml과 같은 설정정보인 상태로 표시를 해주었다. 이에 따라서 context 오브젝트를 통하여 getBean 메소드를 실행시켜 “userDao” 로 ApplicationContext 에 빈의 이름으로 등록하며 userDao() 메소드를 가져올 수 있는 것이다.

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

애플리케이션 컨텍스트는 오브젝트 팩토리(예)DaoFactory)와는 차이가 있다.

==오브젝트 팩토리==는 DAO 오브젝트를 생성하고 DB생성 오브젝트와 관계를 맺어주는 제한적인 역할을 한다.

==애플리케이션 컨텍스트== 는 애플리케이션에서 IoC를 적용하여 관리할 모든 오브젝트에 대한 생성과 관계설정을 담당한다. 대신 오브젝트 팩토리와 달리 직접 오브젝트를 생성하고 관계를 맺어주는 코드가 없고 이러한 생성정보를 연관관계 정보를 별도의 설정정보를 통해 얻는다.

1558413817733

애플리케이션 컨텍스트 내부에 @Bean으로 설정된 메소드의 으름으로 빈 목록을 만들어둔다.

getBean()을 클라이언트가 요청하면 @Bean으로 표시된 것들을 빈 목록으로 만들어둔 곳에서 찾아 오브젝트를 생성시킨 후 클라이언트로 되돌려준다.

DaoFactory를 오브젝트 팩토리로 사용할 때와 애플리케이션 컨텍스트를 사용하여 얻을 수 있는 장점은 다음과 같다.

  • 클라이언트는 구체적인 팩토리 클래스를 알 필요가 없다.

    일관된 방식으로 원하는 오브젝트를 가져올 수 있으며 XML처럼 단순한 방법을 사용해 설정정보를 만들 수 있다.

  • 애플리케이션 컨텍스트는 종합 IoC 서비스를 제공해준다.

  • 애플리케이션 컨텍스트는 빈을 검색하는 다양한 방법을 제공한다.