spring boot - 스프링의 IoC

원종서·2021년 12월 26일
0

spring

목록 보기
2/12

1.5 스프링의 IoC

  • 앱 개발의 다양한 영역과 기술에 관여
  • 많은 기능 제공
  • 빈 팩토리, 애플리케이션 컨텍스트 (DaoFactroy 가 하는 일을 일반화한 것)

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

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

전에 했던 DaoFactory를 스프링에서 사용하도록 변경해보자.

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

빈 팩토리 빈의 생성과 관계설정 같은 제어를 담당하는 IoC오브젝트, 애플리케이션 컨텍스트 라고도 부른다

애플리케이션 컨텍스트는 IoC방식을 따라 만들어진 일종의 빈 팩토리이다.

애플리케이션 컨텍스트는 별도의 정보를 참고해서 빈의 생성, 관계설정 등의 제어 작업을 총괄한다.
기존 DaoFactory 코드에는 설정정보, 어떤 클래스의 오브젝트를 생성하고, 어디에서 사용하도록 연결해줄 것인가 등에 관한 정보가 평범한 자바코드로 만들어져 있다.

앱 컨텍스트는 직접 이런 정보를 담고있지 않다.

대신 애플리케이션 컨텍스트는 별도로 설정 정보를 담고 있는 무엇인가를 가져와 이를 활용하는 범용적인 IoC엔진 같은것.

위에서 말한 설계도 라는 것이 이런 앱 컨텍스트와 그 설정정보를 말한다고 보면 된다.
그 자체로는 앱 로직을 담당하지는 아지만 IoC 방식을 이용해 앱 컴포넌트를 생성하고 사용할 관계를 맺어주는 등의 책임을 담당하기 때문이다.

빈 펙토리 또는 애프리케이션 컨텍스트가 사용하는 설정정보를 만드는 방법은

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

DaoFactory를 스프링의 빈 팩토리가 사용할 수 있는 본격적인 설정정보로 만들어보자

  • @Configuration
    : 해당 클래스를 스프링이 빈 팩토리를 위한 오브젝트 설정을 담당하는 클래스라고 인식해준다.

  • @Bean
    : 그리고 오브젝트를 만들어주는 메소드에 애노테이션을 붙여준다.

package sptringbook.user.dao;

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

@Configuration // 애플리케이션 컨텍스트가 사용할 설정정보라는 표시
public class DaoFactory {

    @Bean // 오브젝트 생성을 담당하는 IoC용 메서드 표시
    public ConnectionMaker connectionMaker(){
        return  new DConnectionMaker();
    }

    @Bean
    public UserDao userDao(){
        return  new UserDao(connectionMaker());
    }
    public UserDao accountDao(){
        return  new UserDao(connectionMaker());
    }
    public UserDao messageDao(){
        return  new UserDao(connectionMaker());
    }
}

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

애플리케이션 컨텍스트는 ApplicationContext 타입의 오브젝트다.
ApplicationContext를 구현한 클래스가 여러가지 있는데 DaoFactory처럼 @Configuration 이 붙은 자바 코드를 설정정보로 사용하려면 AnnotationConfigApplicationContext 를 이용한다.

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

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

getBean() 메서드는 ApplicationContext가 관리하는 오브젝트를 요청하는 메서드이다.
getBean() 메서드의 파라미더 "userDao"는 ApplicationContext에 등록된 빈의 이름이다.
DaoFactory에서 @Bean이라는 어노테이션을 userDao라는 이름의 메소드에 붙였는데. 이 메소드 이름이 바로 빈의 이름이다.

첫번째 매개변수는 UserDao를 생성하는 방식이나 구성을 다르게 가져오는 메소드를 추가할 수 있기 위해서이고
두번째 매개변수는 기존 getBean()의 반환값 Object을 제네릭 메소드 방식을 이용한거다.

1.5.2 앱 컨텍스트 동작방식

오브젝트 팩토리에 대응되는 것이 스프링의 앱 컨텍스트다 (IoC컨테이너 라고도 부르고, 스프링 컨테이너라고도 부름, 또는 빈팩토리).

@Configuration 이 붙은 DaoFactory는 앱 컨텍스트가 활용하는 Ioc설정 정보이다.

내부족으론 앱 컨텍스트가 DaoFactory의 userDao() 메소드를 호출해서 오브젝트를 가져온 결과를 클라이언트가 getBean() 으로 요청할 떄 전달해준다.

앱 컨텍스트틑 DaoFactory 클래스를 설정정도에 등록하고 @Bean이 붙은 메소드의 이름을 가져와 빈 목록을 만들어준다.
클라이언트가 앱 컨특세트의 getBean() 메소드를 호출하면 자신의 빈 목록에서 요청한 이름을 찾고, 있다면 빈을 생성하는 메서드를 호출해 오브젝트를 생성해서 클라이언트에게 돌려준다.

앱 컨텍스트의 장점

  1. 클라이언트는 구체적인 팩토리 클래스를 알 필요 없다.
  2. 앱 컨텍스트는 종합 IoC 서비스를 제공해준다.
  3. 앱 컨텍스트는 빈을 검색하는 다양한 방법을 제공한다.
  • 타입만으로 빈을 검색하거나 애노테이션 설정이 되어 있는 빈을 찾을 수도 있다.

1.5.3 스프링 IoC 용어 정리

  • 빈 : 빈 또는 빈 오브젝트는 스프링이 IoC 방식으로 관리하는 오브젝트. (관리되는 오브젝트)
  • 빈 팩토리 : 스프링의 IoC를 담당하는 핵심 컨테이너 (빈 등록, 생성,조회 관리 기능 담당), 빈 팩토리를 바로 사용하지 않고 이를 확장한 앱 컨텍스트를 이용함
  • 애플리케이션 컨텍스트 : 빈 팩토리를 확장한 IoC 컨테이너, 빈 팩토리에서 추가로 각종 부가 서비스를 제공함.
  • 설정정보/설정 메타정보 : 스프링의 설정정보란 앱 컨텍스트, 빈 팩토리가 IoC 를 적용하기 위해 사용되는 메타정보. IoC 컨테이너에 의해 관리되는 앱 오브젝트를 생성하고 구성할 때 사용된다.
  • 컨테이너 또는 IoC컨테이너 : IoC 방식으로 빈을 관리한다는 의미에서 앱 컨텍스트나 빈 팩토리를 컨테이너 또는 IoC 컨테이너라고 한다.

0개의 댓글