스프링의 핵심 '제어의 역전(IoC)'-2

wakeup Lee·2023년 3월 4일
0

스프링

목록 보기
2/4
post-thumbnail

앞선 1편의 내용에서는 순수한 Java코드 만으로 IoC를 활용했지만, 2편에서는 Spring을 사용한다.

스프링의 꽃이라 불리는 '제어의 역전(IoC)' 1편
https://velog.io/@lkis71/스프링의-핵심-제어의-역전IoC-1

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

먼저 DaoFactory를 스프링 빈 팩토리가 사용할 수 있는 설정정보를 만들기 위해 ☝️첫 번째로 @Configuration 애노테이션을 추가하여 오브젝트 설정을 담당하는 클래스로 인식할 수 있게 한다. ✌️두 번째는 오브젝트를 만들어주는 메소드에 @Bean이라는 애노테이션을 추가한다.

🌟이 두가지 만으로도 IoC 방식의 기능을 제공할 때 사용할 완벽한 설정정보가 된 것이다.

아래의 예제는 1편에서 구현한 IoC를 스프링을 활용하여 다시 구현하였다.

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

	@Bean //오브젝트 생성을 담당하는 IoC용 메소드라는 표시
    public UserDao userDao() {
        return new UserDao(connectionMaker());
    }
    
    @Bean
    public ConnectionMaker connectionMaker() {
    	return new DConnectionMaker();
    }
}
public class MainTest {
    
    public static void main(String[] args) throws SQLException, ClassNotFoundException{
    
    	//IoC 방식을 사용하기 위한 설정정보
        ApplicationContext context = new AnnotationConfigApplicationContext(DaoFactory.class);

		//첫 번째 파라미터: bean 이름, 두 번째 파라미터: 리턴타입
        UserDao userDao = context.getBean("userDao", UserDao.class);
        
        User user = new User();
        user.setId("testId");
        user.setName("홍길동");
        user.setPassword("1234");

        userDao.insert(user);
        ...
    }
}
public class UserDao {

    private ConnectionMaker connectionMaker;

    public UserDao() {
        this.connectionMaker = new DConnectionMaker();
    }
    
    public void insert() {
        Connection conn = connectionMaker.makeConnection();
        ...
    }
    
    public User select() {
        Connection conn = connectionMaker.makeConnection();
        ...
    }
}

AnnotationConfigApplicationContext은 @Configuration이 붙은 자바 코드를 설정정보로 사용하기 위한 메소드로 파라미터는 DaoFactory 클래스를 넣어준다.

이렇게 준비된 ApplicationContext의 getBean()이라는 메소드를 이용해 UserDao의 오브젝트를 가져올 수 있다. getBean() 메소드의 첫 번째 파라미터는 @Bean이 붙은 메소드의 이름으로, 이 메소드가 빈의 이름이 되는 것이다. 두 번째 파라미터는 getBean() 메소드는 기본적으로 Object 타입으로 리턴하게 되어 있어서 메소드 호출시 캐스팅을 해줘야 하는 부담이 있었는데, 자바 5 이상부터 리턴타입으로 파라미터를 지정할 수 있게 되었다.

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

  • IoC 방식을 따라 만들어진 일종의 빈 팩토리라고 생각하면 된다.
  • 빈의 생성 및 관계설정 등의 제어 작업을 총괄하며, 별도 설정정보를 담고 있는 무엇인가를 가져와 이를 활용하는 범용적인 IoC 엔진 같은 개념이라 볼 수 있다.
  • 런타임 시점에 두 오브젝트의 관계를 맺도록 도와주는 제 3의 존재이다.

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

  • @Configuration이 붙은 DaoFactory는 이 애플리케이션 컨텍스트가 활용하는 IoC설정정보다.
  • 내부적으로 애플리케이션 컨텍스트가 DaoFactory의 UserDao() 메소드를 호출해서 오브젝트를 가져온 것을 클라이언트가 getBean()으로 요청할 때 전달해 준다.
  • 애플리케이션 컨텍스트는 DaoFactory 클래스를 설정정보로 등록해 두고, @Bean이 붙은 메소드의 이름을 가져와 빈 목록을 만든다.
  • 클라이언트가 getBean() 메소드를 호출하면 애플리케이션 컨텍스트의 빈 목록에서 요청한 이름이 있는지 찾고, 있다면 빈을 생성하는 메소드를 호출해서 오브젝트를 생성시킨 후 클라이언트에 돌려준다.

3. 용어 정리

  • bean : 스프링이 IoC 방식으로 관리하는 오브젝트
  • ApplicationContext : 빈이 등록하고 관리, 스프링이 제공하는 애플리케이션 지원 기능을 모두 포함
  • 설정정보 : IoC를 적용하기 위해 사용하는 메타 정보

[참고자료]
토비의 스프링 3.1 (Vol.1 스프링 이해와 원리)

profile
백엔드 개발자

0개의 댓글