티스토리 뷰

Sping Framework

스프링의 IoC

kkoon9 2022. 7. 10. 23:05

스프링의 핵심을 담당하는 건, 빈 팩토리 또는 애플리케이션 컨텍스트라고 불리는 것이다.

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

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

빈(bean)

  • 스프링에서 스프링이 제어권을 가지고 직접 만들고 관계를 부여하는 오브젝트를 뜻한다.
  • 스프링 컨테이너가 생성과 관계설정, 사용 등을 제어해주는 제어의 역전(IoC)이 적용된 오브젝트를 뜻한다.

빈 팩토리(bean factory)

  • 빈의 생성과 관계설정 같은 제어를 담당하는 IoC 오브젝트
  • 빈 팩토리보다는 더 확장한 애플리케이션 컨텍스트를 주로 사용한다.

애플리케이션 컨텍스트(application context)

  • 별도의 정보를 참고해서 빈의 생성, 관계설정 등의 제어 작업을 총괄한다.
  • 별도로 설정정보를 담고 있는 무엇인가를 가져와 이를 활용하는 범용적인 IoC 엔진이라 볼 수 있다.

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

예제 코드를 통해 살펴보자.

스프링이 빈 팩토리를 위한 오브젝트 설정을 담당하는 클래스라고 인식할 수 있도록 @Configuration 어노테이션을 사용한다.

Configuration 어노테이션 설명은 다음 포스팅을 참고하자.

 

stereotype annotation들을 어떻게 찾아서 bean으로 등록할까?

stereotype annotation들을 어떻게 찾을까? 스프링 부트가 시작되는 클래스에 붙어있는 SpringBootApplication 어노테이션을 조사해보았습니다. 여러 어노테이션이 있으나 @EnableAutoConfiguration와 @ComponentS..

kkoon9.tistory.com

그리고 오브젝트를 만들어 주는 메서드에서는 @Bean 어노테이션을 사용한다.

이 두 가지 어노테이션만으로 스프링 프레임워크의 빈 팩토리 혹은 애플리케이션 컨텍스트가 IoC 방식의 기능을 제공할 때 사용할 완벽한 설정정보가 될 수 있다.

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

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

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

애플리케이션 컨텍스트는 ApplicationContext 타입의 오브젝트다.

애플리케이션 컨텍스트를 만들 때 생성자 파라미터로 DaoFactory 클래스를 넣어준다.

준비된 ApplicationContext의 getBean() 메서드를 이용해 UserDao의 오브젝트를 가져올 수 있다.

public class UserDaoTest {
    public static void main(String[] args) throws ClassNotFoundException {
        ApplicationContext context =
            new AnnotationConfigApplicationContext(DaoFactory.class);
        UserDao dao = context.getBean("userDao", UserDao.class);
        // ...
    }
}

getBean()

  • ApplicationContext가 관리하는 오브젝트를 요청하는 메서드
  • 파라미터인 “userDao”는 ApplicationContext에 등록된 빈의 이름이다.
  • DaoFactory에서 @Bean 어노테이션dmf userDao라는 이름의 메서드에 붙였으므로 빈의 이름이 userDao가 된다.
🤔
UserDao를 가져오는 메서드는 하나뿐인데 왜 굳이 이름을 사용하는 걸까?

 

그것은 UserDao를 생성하는 방식이나 구성을 다르게 가져가는 메서드를 추가할 수 있기 때문이다.

자바 5 이상의 제네릭 메서드 방식을 사용하여 getBean()의 두 번째 파라미터에 리턴 타입을 주면, 지저분한 캐스팅 코드를 사용하지 않아도 된다.

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

스프링에서는 애플리케이션 컨텍스트를 IoC 컨테이너라 하기도 하고, 간단히 스프링 컨테이너라고 부르기도 한다.

애플리케이션 컨텍스트는 ApplicationContext 인터페이스를 구현한다.

그리고 ApplicationContext는 빈 팩토리가 구현하는 BeanFactory 인터페이스를 상속하므로 일종의 빈 팩토리인 셈이다.

다음은 애플리케이션 컨텍스트의 동작방식이다.

  1. 애플리케이션 컨텍스트는 DaoFactory 클래스를 설정정보로 등록해두고 @Bean이 붙은 메서드의 이름을 가져와 빈 목록을 만들어둔다.
  2. 클라이언트가 애플리케이션 컨텍스트의 getBean() 메서드를 호출하면 자신의 빈 목록에서 요청한 이름이 있는지 찾는다.
    1. 있다면 빈을 생성하는 메서드를 호출해서 오브젝트를 생성시킨 후 클라이언트에 돌려준다.

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

[1]. 클라이언트는 구체적인 클래스를 알 필요가 없다.

애플리케이션이 더 커지면 DaoFactory처럼 IoC를 적용한 오브젝트도 계속 추가될 것이다.

클라이언트가 필요한 오브젝트를 가져오려면 어떤 팩토리 클래스를 사용해야 할지 알아야 한다.

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

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

또, DaoFactory처럼 자바 코드를 작성하는 대신 XML처럼 단순한 방법을 사용해 애플리케이션 컨텍스트가 사용할 IoC 설정정보를 만들 수도 있다.

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

애플리케이션 컨텍스트의 역할은 단지 오브젝트 생성과 다른 오브젝트와의 관계설정이 전부가 아니다.

  • 오브젝트가 만들어지는 방식
  • 시점과 전략을 다르게 가져가기
  • 자동생성
  • 오브젝트에 대한 후처리
  • 정보의 조합
  • 설정 방식의 다변화
  • 인터셉터
  • 컨테이너 차원의 빈이 사용할 수 있는 기반기술 서비스
  • 컨테이너 차원의 외부 시스템과의 연동

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

애플리케이션 컨텍스트의 getBean()은 빈의 이름을 이용해 빈을 찾아준다.

타입만으로 빈을 검색하거나 특별한 어노테이션 설정이 되어 있는 빈을 찾을 수도 있다.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
글 보관함