ch3-5 ~ ch3-8
- Spring DI 활용하기 - 1 ~ 4
- bean - Spring container
- AppicationContext(AC) - Root AC, Servlet AC(부모-자식 관계)
- Root AC - root-context.xml, Servlet AC - servlet-context.xml
- 톰캣 실행 시 log로 Root AC, Servlet AC 확인 - 오류 발생시 단서
- IoC - 제어의 역전, DI - 의존성 주입 => 디자인패턴 중 전략패턴
- @Autowired, @Resource - bean을 자동 주입
- @Component, @Controller, @Service, @Repository, @ControllerAdvice - bean으로 자동 등록
- @Value - 기본형, String iv에 변수 값을 주입
- @PropertySource - @Value와 함께 사용해서, 시스템 환경변수, 시스템 프로퍼티 값을 주입
1. 빈(bean)이란?
- JavaBeans - 재사용 가능한 컴포넌트
- Servlet&JSP bean - MVC의 Model 등 JSP container가 관리
- EJB(Enterprise Java Beans) - EJB container가 관리
- Spring Bean - 단순, 독립적, Spring container가 관리
2. BeanFactory와 ApplicationContext
- Bean - Spring Container가 관리하는 객체
- Spring container - Bean 저장소. Bean을 저장, 관리(생성, 소멸, 연결).
- BeanFactory - Bean을 생성, 연결 등의 기본 기능을 정의한 것.
- ApplicationContext - BeanFactory를 확장해서 여러기능을 추가한 것. Spring container와 비슷.
3. ApplicationContext의 종류
- non-Web
XML - GenericXmlApplicationContext
Java Config - AnnotationConfigApplicationContext
- Web
XML - XmlWebApplicationContext
Java Config - AnnotationConfigWebApplicationContext
4. Root AC와 Servlet AC
web.xml의 ContextLoaderListener가 톰캣이 실행 될 때 root-context.xml를 이용해서 Root AC를 생성한다.
그리고 DispatcherServlet이 초기화 되면서, servlet-context.xml를 이용해서, Servlet AC를 또 만든다. 따라서 2개의 설정파일로 2개의 AC를 만들고, 2개의 AC 중 Root AC를 부모, Servlet AC를 자식으로 하고, 부모 자식 관계로 연결해준다.
bean을 찾을 때 자식을 먼저 검색하고, 그 다음 부모를 검색한다. 따라서 Root AC에는 공통으로 쓰이는 non-Web, DB관련 bean을 넣고, Servlet AC에는 개별적인 Web관련 bean을 넣는다.
톰캣을 실행시키고 log를 보면, Root AC가 먼저 초기화 되고, Servlet AC가 초기화 된다. 이 때 각 부분에 오류가 발생한다면, root-context.xml 또는 servlet-context.xml에서 오류가 발생했다 단서를 가지고, 오류를 해결할 수 있다.
6. IoC(Inversion of Control)와 DI(Dependency Injection)
- 제어의 역전 IoC - 제어의 흐름을 전통적인 방식과 다르게 뒤바꾸는 것. 변하는 코드와 변하지 않는 코드를 분리하고, 다른 사람이 만든 코드가 내가 만든 코드를 호출.
- 의존성 주입 DI - 사용할 객체를 외부에서 주입 받는 것
[전통적인 방식] - 사용자 코드가 Framework 코드를 호출
Car car = new Car();
car.turboDrive();
void turboDrive() {
engine = new TurboEngine();
engine.start();
...
}
[IoC] - Framework 코드가 사용자 코드를 호출
디자인패턴 - 전략패턴에 해당.
Car car = new Car();
car.drive(new SuperEngine());
void drive(Engine engine) {
engine.start();
...
}
@Autowired
- iv, setter, 참조형 매개변수를 가진 생성자, 메서드에 적용
- 생성자는 @Autowired 생략 가능.
- 실수를 방지하기 위해, 생성자로 한번에 주입받는 것이 좋다.
- Spring container에서 타입으로 빈을 검색해서, 참조변수에 자동 주입(DI).
검색된 빈이 n개면, 그 중에 참조변수와 이름이 일치하는 것을 주입.
- 주입 대상이 변수 일 때, 검색된 빈이 1개가 아니면 예외 발생.
- 주입 대상이 배열일 때, 검색된 빈이 n개라도 예외 발생 X.
- @Autowired(required=false)일 때, 주입한 빈을 못찾아도 예외발생 X.
@Resource
- Spring container에서 이름으로 빈을 검색해서 참조변수에 자동 주입(DI).
일치하는 이름의 빈이 없으면 예외 발생.
- annotations-api - Tomcat library를 추가
@Component
- component-scan으로 @Component가 붙은 클래스를 자동 검색해서 빈으로 등록.
- @Controller, @Service, @Repository, @ControllerAdvice의 메타 애너테이션
@Value와 @PropertySource
시스템 환경변수, 시스템 프로퍼티 값을 주입 받을 수 있다.
@Component
@PropertySource("setting.properties")
class SysInfo {
@Value("#{systemProperties['user.timezone']}")
String timezone;
@Value("#{systemEnvironment['APPDATA']}")
String currDir;
@Value("${autosaveDir}")
String autosaveDir;
@Value("${autosaveInterval}")
int autosaveInterval;
@Value("${autosave}")
boolean autosave;
}
[setting.properties]
autusaveDir=/autosave
autosave=true
autosaveInterval=30