728x90
스프링의 IoC
오브젝트 팩토리를 이용한 스프링 IoC
애플리케이션 컨텍스트와 설정정보
- 빈
- 스프링이 제어권을 가지고 직접 만들고 관계를 주여하는 오브젝트
- 오브젝트 단위의 애플리케이션 컴포넌트
- 스프링 컨테이너가 생성과 관계설정, 사용 등을 제어해주는 제어의 역전이 적용된 오브젝트
- 빈의 생성과 관계설정 같은 제어를 담당하는 IoC 오브젝트를 빈 팩토리라고 부른다.
- 보통 빈 팩토리보다는 이를 좀 더 확장한 애플리케이션 컨텍스트를 주로 사용
DaoFactory를 사용하는 애플리케이션 컨텍스트
- @Configuration 어노테이션 추가
- 스프링이 빈 팩토리를 위한 오브젝트 설정을 담당하는 클래스라고 인식.
- 오브젝트를 만들어주는 메소드에 @Bean 어노테이션 추가.
- UserDao()메소드는 UserDao 타입 오브젝트를 생성하고 초기화하며 돌려주는 것이므로 @Bean이 붙어야한다.
- ConnectionMaker타입의 오브젝트를 생성해주는 connectionMaker()메소드에도 @Bean을 붙여준다.
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class DaoFactory {
@Bean
public UserDao userDao() {
return new UserDao(new LikelionConnectionMaker());
}
@Bean
/*분리해서 중복을 제거한 ConnectionMaker타입 오브젝트 생성 코드*/
public ConnectionMaker connectionMaker(){
return new LikelionConnectionMaker();
}
}
DaoFactory를 설정정보로 사용하는 애플리케이션 컨텍스트
- 애플리케이션 컨텍스트는 ApplicationContext타입의 오브젝트다.
- DaoFactory처럼 @Configuration이 붙은 자바 코드를 설정정보로 사용하려면 AnnotationConfigigApplicationContext를 이용한다.
- 애플리케이션 컨텍스트를 만들 때 생성자 파라미터로 DaoFactory클래스를 넣어준다.
- 준비된 ApplicationContext의 getBean()이라는 메소드를 사용하여 UserDao의 오브젝트를 가져올 수 있다.
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import java.sql.SQLException;
import static org.junit.jupiter.api.Assertions.*;
class UserDaoTest {
public static void main(String[] args) throws SQLException, ClassNotFoundException {
ApplicationContext context = new AnnotationConfigApplicationContext(DaoFactory.class);
UserDao userDao = context.getBean("userDao", UserDao.class);
}
}
- getBean()의 파라미터인 "userDao"는 ApplicationContext에 등록된 빈의 이름이다.
- userDao라는 이름의 빈을 가져온다는 것은 DaoFactory의 userDao() 메소드를 호출해서 그 결과를 가져온다고 생각하면 된다.
- 메소드 이름을 tistoryDao()라고 했다면 getBean("tistoryDao", UserDao.class)로 가져올 수 있다.
- UserDao를 가져오는 메소드는 하나뿐인데 이름을 사용하는 이유는
- UserDao를 생성하는 방식이나 구성을 다르게 가져가는 메소드를 추가할 수 있기 때문에, 그때는 specialUserDao()라는 메소드를 만들고 getBean("specialUserDao", UserDao.class)로 가져오면 된다.
반응형
'Server > Spring&Spring Boot' 카테고리의 다른 글
[스스로 이해해보는 스프링] 책임의 분리 (0) | 2022.10.29 |
---|---|
[토비의 스프링] 스프링의 IoC - 애플리케이션 컨텍스트의 동작 방식 (0) | 2022.10.29 |
[토비의 스프링] 제어의 역전 - 오브젝트 팩토리 활용, 제어권의 이전을 통한 제어관계 역전 (0) | 2022.10.29 |
[토비의 스프링] 제어의 역전 - 오브젝트 팩토리 (0) | 2022.10.28 |
[토비의 스프링] 오브젝트와 의존관계 - 인터페이스, 책임의 분리 (0) | 2022.10.24 |