스프링 ch3-5 ~ ch3-8

서현우·2022년 7월 5일
0

스프링의정석

목록 보기
71/85

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을 저장, 관리(생성, 소멸, 연결).
  1. BeanFactory - Bean을 생성, 연결 등의 기본 기능을 정의한 것.
  2. ApplicationContext - BeanFactory를 확장해서 여러기능을 추가한 것. Spring container와 비슷.

3. ApplicationContext의 종류

  • AC의 종류
  1. non-Web
    XML - GenericXmlApplicationContext
    Java Config - AnnotationConfigApplicationContext
  2. 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
profile
안녕하세요!!

0개의 댓글