앞선 1편의 내용에서는 순수한 Java코드 만으로 IoC를 활용했지만, 2편에서는 Spring을 사용한다.
스프링의 꽃이라 불리는 '제어의 역전(IoC)' 1편
https://velog.io/@lkis71/스프링의-핵심-제어의-역전IoC-1
먼저 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의 존재이다.
[참고자료]
토비의 스프링 3.1 (Vol.1 스프링 이해와 원리)