1. 오브젝트와 의존관계 - 스프링의 IoC

이유석·2022년 3월 28일
0

Book - Toby's Spring

목록 보기
5/20
post-thumbnail

1.5 스프링의 IoC

스프링은 애플리케이션 개발의 다양한 영역과 기술에 관여하고, 해당 부분에 대한 많은 기능을 제공한다.

스프링의 핵심 : 빈 팩토리 또는 애플리케이션 컨텍스트
위 두가지는 이전 장에서 만든 DaoFactory가 하는 일을 일반화한 것이라고 설명할 수 있다.

factory (팩토리)
객체의 생성 방법을 결정하고 그렇게 만들어진 오브젝트를 돌려주는 역할을 하는 오브젝트

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

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

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

  • Spring Bean (스프링 빈) : 스프링 컨테이너가 생성과 관계설정, 사용 등을 제어해주는 제어의 역전이 적용된 오브젝트

  • Bean Factory (빈 팩토리) : 스프링에서 빈의 생성과 관계설정 같은 제어를 담당하는 IoC 오브젝트

  • Application Context (애플리케이션 컨텍스트) : IoC 방식을 따라 만들어진 일종의 빈 팩토리.
    애플리케이션 컨텍스트는 별도의 정보를 참고해서 빈의 생성, 관계설정 등의 제어 작업을 총괄한다.
    (설정 정보를 직접 갖고 있지 않는다.)

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

  • 스프링 프레임워크 : IoC 컨테이너, 애플리케이션 컨텍스트를 포함해서 스프링이 제공하는 모든 기능을 통틀어 말할 때 주로 사용한다.

이전장에서 설계도에 해당하는 부분이 애플리케이션 컨텍스트 + 설정 정보 이다.

스프링에서는 빈 팩토리 보다는 빈 팩토리를 확장한 애플리케이션 컨텍스트를 주로 사용한다.

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

Dao Factory Class를 스프링의 빈 팩토리가 사용할 수 있는 설정 정보로 만들어보자.

  1. @Configuration 애노테이션 추가

    @Configuration : 빈 팩토리를 위한 오브젝트 설정을 담당하는 클래스임을 나타낸다.

  2. 오브젝트를 만들어주는 메소드에 @Bean 애노테이션 추가
  3. ConnectionMaker 타입의 오브젝트를 만들어주는 connectionMaker() 메소드에 @Bean 추가

    @Bean : 개발자가 직접 제어(수정) 불가능한 외부 라이브러리 등을 Bean으로 만들 때 사용
    name 속성으로 Bean의 이름을 설정 가능하다.
    이름 지정 안할 시, 클래스 이름이 Bean의 이름이 된다.

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

        return userDao;
    }

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

이제 DaoFactory를 설정정보로 사용하는 애플리케이션 컨텍스트를 만들어보자.

  • @Configuration이 붙은 자바 파일을 설정정보로 사용하려면 AnnotationConfigApplicationContext를 이용하면 된다.

이렇게 준비된 애플리케이션 컨텍스트의 getBean( )이라는 메소드를 사용하여 생성되어있는 UserDao의 오브젝트를 가져올 수 있다.

public class main {
    public static void main(String[] args) throws SQLException, ClassNotFoundException {

        ApplicationContext context = new AnnotationConfigApplicationContext(DaoFactory.class);

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

getBean( ) 메소드는 애플리케이션 컨텍스트가 관리하는 오브젝트를 요청하는 메소드이다.

  • getBean("빈의 이름", 해당 빈의 리턴 타입)

스프링을 사용하기 위해 프로젝트에 필요한 라이브러리를 추가해야 한다.
라이브러리 목록

  • com.springsource.net.sf.cglib-2.2.0.jar
  • com.springsource.org.apache.commons.logging-1.1.1.jar
  • org.springframework.asm-3.0.7.RELEASE.jar
  • org.springframework.beans-3.0.7.RELEASE.jar
  • org.springframework.context-3.0.7.RELEASE.jar
  • org.springframework.core-3.0.7.RELEASE.jar
  • org.springframework.expression-3.0.7.RELEASE.jar

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

애플리케이션 컨텍스트는 ApplicationContext 인터페이스를 구현한다.
ApplicationContext 인터페이스는 빈 팩토리가 구현하는 BeanFactory 인터페이스를 상속한다.

즉, 애플리케이션 컨텍스트는 일종의 빈 팩토리인 셈이다.

오브젝트 팩토리 VS 애플리케이션 컨텍스트

  • 오브젝트 팩토리인 DaoFactory는 각 객체를 생성하고 연관관계를 맺어준다.
  • 애플리케이션 컨텍스트는 오브젝트 생성 정보와 연관관계 정보를 별도의 설정 정보(@Configuration)를 통해 얻는다.

애플리케이션 컨텍스트는 @Configuration이 붙은 설정 정보를 등록해둔다.
또한 @Bean이 붙은 메소드의 이름을 가져와 Bean 목록을 만들어 둔다.

클라이언트가 getBean( )메소드를 호출하면, 자신의 Bean 목록에서 요청한 이름을 찾아서 해당 메소드를 호출하여 오브젝트를 생성 후 클라이언트에게 돌려준다.

내부적으로는 애플리케이션 컨텍스트가 DaoFactory의 userDao( ) 메소드를 호출해서 가져온 오브젝트를 클라이언트가 getBean( )으로 요청할 때 전달해준다.

애플리케이션 컨텍스트를 사용하였을때 장점

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

    • 일관된 방식으로 원하는 오브젝트를 가져올 수 있다.
    • XML처럼 단순한 방법을 사용해 IoC 설정 정보를 만들 수 있다.
  • 애플리케이션 컨텍스트는 종합 IoC 서비스를 제공해준다.

    • 애플리케이션 컨텍스트의 역할은 단지 오브젝트 생성과 가른 오브젝트와의 관계 설정만이 전부가 아니다.
    • 오브젝트를 효과적으로 활용할 수 있는 다양한 기능을 제공한다.
    • 또한, 빈이 사용할 수 있는 기반기술 서비스나 외부 시스템과의 연동 등을 컨테이너 차원에서 제공해주기도 한다.
  • 애플리케이션 컨텍스트는 빈을 검색하는 다양한 방법을 제공한다.

    • 빈의 이름 뿐만 아니라, 타입 또는 애노테이션 등 과 같은 방법으로 검색이 가능하다.

소스코드 : github

profile
https://github.com/yuseogi0218

0개의 댓글