티스토리 뷰
반응형
- 스프링의 핵심을 담당하는 건, 바로 빈 팩토리 또는 애플리케이션 컨텍스트라고 불리는 것이다.
- 이 두 가지는 우리가 만든 DaoFactory가 하는 일을 좀 더 일반화한 것이라고 생각하면 된다.
오브젝트 팩토리를 이용한 스프링 IoC
애플리케이션 컨텍스트와 설정정보
- 여기서는 우리가 만든 DaoFacotry를 스프링에서 사용 가능하도록 만들어 볼 것이다.
- 스프링에서는 스프링이 제어권을 가지고 직접 만들고 관계를 부여하는 오브젝트를 빈이라고 부른다.
- 스프링 빈은 스프링 컨테이너가 생성과 관계설정, 사용 등을 제어해주는 제어의 역전이 적용된 오브젝트를 가리키는 말이다.
- 스프링에서 빈의 생성과 관게설정 같은 제어를 담당하는 IoC 오브젝트를 빈 팩토리 혹은 애플리케이션 컨텍스트라고 부른다.
- 빈 팩토리와 애플리케이션 컨텍스트
- 빈 팩토리 : 빈을 생성하고 관계를 설정하는 IoC의 기본 기능에 초점을 맞춘 것이다.
- 애플리케이션 컨텍스트 : 애플리케이션 전반에 걸쳐 모든 구성요소의 제어 작업을 담당하는 IoC 엔진이라는 의미이다.
- 빈 팩토리의 확장 버전을 애플리케이션 컨텍스트라고 보면 된다.
DaoFactory를 사용하는 애플리케이션 컨텍스트
DaoFactory를 스프링의 빈 팩토리가 사용할 수 있는 본격적인 설정정보로 만들어보자.
- 먼저 스프링이 빈 팩토리를 위한 오브젝트 설정을 담당하는 클래스라고 인식하기 위해 @Configuration을 추가한다.
- 그 후 오브젝트를 만들어 주는 메소드에는 @Bean을 붙여준다.
- userDao() 메소드는 UserDao 타입 오브젝트를 생성하고 초기화해서 돌려주는 것이니 당연히 @Bean이 붙여진다.
- 또한, ConnectionMaker 타입의 오브젝트를 생성해주는 connectionMaker() 메소드에도 @Bean을 붙여준다.
- 이 두 가지 애노테이션 만으로 스프링 프레임워크의 빈 팩토리 또는 애플리케이션 컨텍스트가 IoC 방식의 기능을 제공할 때 사용할 설정정보가 완성 된다.
//1, 2, 3
@Configuration
public class DaoFactory {
@Bean
public UserDao userDao() {
//return new UserDao(new DConnectionMaker());
return new UserDao(connectionMaker());
}
...
@Bean
public ConnectionMaker connectionMaker() {
return new DConnectionMaker();
}
}
- 이제 DaoFactory를 설정정보로 사용하는 애플리케이션 컨텍스트를 만들어보자
- 애플리케이션 컨텍스트는 ApplicationContext 타입의 오브젝트로서, ApplicationContext를 구현한 클래스는 여러가지가 존재하는데, 그 중 @Configuration이 붙은 설정정보로 사용하려면 AnnotationConfigApplicationContext를 이용하면 된다.
- 애플리케이션 컨텍스트를 만들 때 파라미터로 DaoFactory 클래스를 넣어주고, ApplicationContext의 getBean()을 통해 UserDao 오브젝트를 가져올 수 있다.
//4, 5, 6
public class UserDaoTest {
public static void main(String [] args) throws ClassNotFoundException, SQLException {
ApplicationContext context = new AnnotationConfigApplicationContext(DaoFactory.class);
UserDao userDao = context.getBean("userDao", UserDao.class);
}
}
- getBean() 메소드는 ApplicationContext가 관리하는 오브젝트를 요청하는 메소드이다.
- getBean()의 파라미터 중 "userDao"는 ApplicationContext에 등록된 빈의 이름이고, "userDao"는 DaoFactory 설정 정보에서 userDao() 메소드가 존재해야 하고, 해당 메소드에는 @Bean이라는 어노테이션이 붙여있어야 한다.
- 여기서 userDao라는 이름의 빈을 가져온다는 것은 DaoFactory의 userDao()메소드를 호출하고 그 결과를 가져온다는 것이다.
-
getBean()은 기본적으로 Object 타입으로 리턴하게 되어 있어 매번 캐스팅을 해줘야하는 부담이 있다.
- 자바 5 이상부터 제네릭 메소드 방식을 사용해서 getBean()의 두번째 파라미터에 리턴 타입을 주면, 지저분한 캐스팅 작업이 나타나지 않는다.
-
스프링의 기능을 사용했으니, 필요한 라이브러리를 추가해줘야 한다.
애플리케이션 컨텍스트의 동작박싱
-
기존 오브젝트 팩토리(DaoFactory)에 대응되는 것이 바로 스프링의 애플리케이션 컨텍스트이다.
-
스프링에서는 이 애플리케이션 컨텍스트를 IoC 컨테이너 혹은 스프링 컨테이너, 빈 팩토리라고 부른다.
-
DaoFactory는 UserDao를 비롯한 DAO 오브젝트를 생성하고 DB 생성 오브젝트와 관계를 맺어주는 제한적인 역할을 하는 것에 반해, 애플리케이션 컨텍스트에서는 모든 오브젝트에 대한 생성과 관계설정을 담당한다.
- 애플리케이션 컨텍스트에는 DaoFactory와 달리 직접 오브젝트를 생성하고 관계를 맺어주는 코드가 없고, 이런 생성정보와 연관관계 정보를 별도의 설정정보를 통해 얻는다.
- @Configuration이 붙은 DaoFactory는 이 애플리케이션 컨텍스트가 활용하는 IoC설정정보이다.
- 애플리케이션 컨텍스트가 DaoFactory의 userDao() 메소드를 호출해서 오브젝트를 가져온 것을 클라이언트가 getBean()을 요청할 때 전달해주는 것이다.
-
애플리케이션 컨텍스트가 동작하는 방식을 살펴보자
DaoFactory를 그대로 사용하는 대신, 애플리케이션 컨텍스트를 사용하는 이유
- DaoFactory와 같은 오브젝트 팩토리에서 사용했던 IoC 원리를 그대로 적용하는 데도 불구하고 애플리케이션 컨텍스트를 사용하는 이유는 다음과 같다.
- 클라이언트는 구체적인 팩토리 클래스를 알 필요가 없다.
- 여러 오브젝트가 추가되고 클라이언트가 필요한 오브젝트를 가져오려면 어떤 팩토리 클래스를 사용해야할 지 알아야하고, 필요할때 마다 펙토리 오브젝트를 생성해야 하는 번거로움이 있다.
- 애플리케이션 컨텍스트를 사용하면 오브젝트 팩토리가 아무리 많아져도 이를 알아야하거나 직접 사용할 필요가 없다.
- 애플리케이션 컨텍스트는 종합 IoC 서비스를 제공해준다.
- 애플리케이션 컨텍스트의 역할은 단지 오브젝트 생성과 다른 오브젝트와의 관계설정만이 전부가 아니다.
- 오브젝트가 만들어지는 방식, 자동생성, 오브젝트에 대한 후처리, 정보의 조합, 설정 방식의 다변화, 인터셉팅 등 오브젝트를 활용할 수 있는 다양한 기능을 제공한다.
- 애플리케이션 컨텍스트는 빈을 검색하는 다양한 방법을 제공한다.
- 애플리케이션 컨텍스트의 getBean() 메소드는 빈의 이름을 이용해 빈을 찾아준다.
- 타입 만으로 빈을 검색하거나 특별한 애노테이션 설정이 되어 있는 빈을 찾을 수도 있다.
스프링 IoC의 용어 정리
Bean
- 빈 또는 빈 오브젝트는 스프링이 IoC 방식으로 관리하는 오브젝트라는 뜻이다.
- 스프링이 직접 그 생성과 제어를 담당하는 오브젝트만 빈으로 선정된다.
Bean Factory
- 스프링의 IoC를 담당하는 핵심 컨테이너를 가리킨다.
- 빈을 등록, 생성, 조회, 반환 및 그 외 빈을 관리하는 기능을 담당한다.
- 보통은 이 빈 팩토리를 바로 사용하지 않고, 이를 확장한 애플리케이션 컨텍스트를 이용한다.
애플리케이션 컨테스트
- 빈 팩토리를 확장한 IoC 컨테이너이다.
- 빈을 등록하고 관리하는 기본적인 기능은 빈 팩토리와 동일하고, 스프링이 제공하는 각종 부가 서비스를 추가로 제공한 것이다.
- 빈 팩토리와 애플리케이션 컨텍스트의 차이
- 빈 팩토리라 부를 땐 주로 빈의 생성과 제어의 관점에서 이야기 하는 것
- 애플리케이션 컨텍스트라고 할 때는 빈 팩토리 기능을 추가로 스프링이 제공하는 애플리케이션 지원 기능을 모두 포함해서 이야기 하는 것
- 스프링에서 ApplicationContext라고 적을 시 애플리케이션 컨텍스트가 구현해야하는 기본 인터페이스를 가리키는 것이기도 하다
- AppilcationContext는 BeanFactory를 상속한다.
설정정보/ 설정 메타정보
- 스프링의 설정정보(Configuration)란 애플리케이션 컨텍스트 또는 빈 팩토리가 IoC를 적용하기 위해 사용하는 메타정보를 말한다.
- 스프링의 설정정보는 컨테이너에 어떤 기능을 세팅하거나 조정하는 경우에도 사용하지만, 그 보다는 IoC 컨테이너에 의해 관리되는 애플리케이션 오브젝트를 생성하고 구성할 때 사용된다.
컨테이너 또는 IoC 컨테이너
- IoC 방식으로 빈을 관리한다는 의미에서 애플리케이션 컨텍스트나 빈 팩토리를 컨테이너 또는 IoC 컨테이너라고도 한다.
- IoC 방식 : 오브젝트의 생성, 관계설정, 사용의 다른 이에게(빈 팩토리) 넘겨주는 방식
- IoC 컨테이너는 주로 빈 팩토리의 관점에서 이야기 하는 것이고, 컨테이너는 주로 애플리케이션 컨텍스트 관점에서 이야기 한 것으로 보면 된다.
스프링 프레임워크
- 스프링 프레임워크는 IoC 컨테이너, 애플리케이션 컨텍스트를 포함해서 스프링이 제공하는 모든 기능을 통틀어 말할 때 사용한다.
반응형
'Spring > Spring 기초' 카테고리의 다른 글
[토비 스프링] 의존관계 주입(DI) (0) | 2020.03.18 |
---|---|
[토비 스프링] 싱글톤 레지스트리와 오브젝트 스코프 (0) | 2020.03.17 |
[토비 스프링] 제어의 역전 (0) | 2020.03.10 |
[토비 스프링] 사용자 DAO (0) | 2020.03.09 |
[스프링 기초] Bean 등록 및 의존관계 설정 (0) | 2020.02.13 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 이펙티브 자바
- 팩토리 메소드 패턴
- ifPresent
- 자바8
- Effective Java
- java
- try with resources
- jdk버전
- 연관관계
- 생성자
- JPA
- 빈 순환 참조
- 정적팩터리메서드
- 스프링부트
- flatMap
- try catch finally
- 김영한
- springboot
- mustache
- @Lazy
- 복사 팩토리
- effectivejava
- 이펙티브자바
- 인프런
- Spring
- package-private
- 점층적 생성 패턴
- java8
- junit
- 빌더 패턴
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 29 | 30 | 31 |
글 보관함