2020-12-14 TIL
spring webMVC 핵심 엔진
- Front controller
- Dispatcher Servlet
- IoC container
- Application Context
IoC(Inverwon of Control, 역제어)
- IoC -> Inversion of Control (역제어)
- 일반적인 명령어 실행은 위 —> 아래 순차적으로 실행
- IoC는 역순차적으로 실행함
- 외부에서 사용할 객체를 제공하고 사용하는 쪽에서 객체를 준비.
- 객체의 생성부터 소멸까지의 생명주기 관리 및 책임을 개발자가 아닌 스프링 컨테이너에서 하는 것.
- 컨테이너란? 객체의 생명주기 관리. 생성된 객체들에게 추가적인 기능을 제공하도록 하는 것으로 개발자가 작성한 코드의 처리 과정을 위임받은 독립적인 존재이다.
- 빈팩토리 = 스프링에서 생성하는 자바 객체
- 컨테이너란? 객체의 생명주기 관리. 생성된 객체들에게 추가적인 기능을 제공하도록 하는 것으로 개발자가 작성한 코드의 처리 과정을 위임받은 독립적인 존재이다.
- 객체 관리를 효율적으로 하고 실행 흐름을 효율적으로 관리하기 위해서 등장한 방법이다.
DI(Dependency injection, 의존적 주입)
- 역제어의 대표적인 예
- 이미 생성된 객체를 다른 클래스에 주입하는 것이 의존적 주입이다.
- 스프링 빈이 개발자 대신 객체를 생성(IoC)
- ref를 통해 이미 생성한 객체를 다른 클래스에 주입하여 객체 자체를 매개 변수로 사용하는 것(DI)
Spring IoC에서 사용하는 기술
- Spring WebMVC
- Front Controller
- IoC Container
- 이 두 개를 받치고 있는 기술
- Reflection API
- Annotation
- 이 두 개를 받치고 있는 기술
Reflection API
-
https://woowacourse.github.io/javable/2020-07-16/reflection-api
-
구체적인 클래스 타입을 알지 못해도 그 클래스의 정보(메서드, 타입, 변수 등등)에 접근할 수 있게 해주는 자바 API
Annotation
- 프로그램에 추가적인 정보를 제공해주는 메타데이터
Spring IOC 컨테이너 사용
- https://chunjyu.tistory.com/23
-
IoC(Inversion Of Control) 컨테이너
-
bean container 라고도 부른다.
-
인스턴스의 생성과 관리를 담당한다.
-
각 객체가 의존하는 객체(dependency)를 주입한다.
-
“의존 객체 주입(dependency injection; DI)”이라 부른다.
-
그래서 “DI 컨테이너”라고도 부른다.
-
-
-
-
Spring IoC 컨테이너
-
spring.io 사이트에서 제공하는 프레임워크이다.
-
프로젝트에 Spring IoC 컨테이너 포함하기
-
mvnrepository.com 또는 search.maven.org에서spring-context 로 라이브러리를 검색한다.
-
build.gradle 에 의존 라이브러리 정보를 추가한다.
-
’$ gradle eclipse’를 실행하여 라이브러리 파일을 다운로드 받고
-
이클립스 설정 파일을 갱신한다.
- 이클립스에서 프로젝트 정보를 갱신한다.
-
-
ApplicationContext 인터페이스
-
스프링 IoC 컨테이너의 사용 규칙을 정의한 인터페이스이다.
-
모든 스프링 IoC 컨테이너는 이 규칙에 따라 정의되어 있다.
- ApplicationContext 구현체(implements, 인터페이스를 구현한 클래스 또는 그 클래스의 인스턴스)의 종류
- 1) XML 파일에서 설정 정보를 읽어들이는 IoC 컨테이너
- ClassPathXmlApplicationContext : 설정 파일을 자바 CLASSPATH 경로에서 찾는다.
- FileSystemXmlApplicationContext : 설정 파일을 OS 경로에서 찾는다.
- 2) 자바 클래스 파일의 애노테이션에서 설정 정보를 읽어 들이는 IoC 컨테이너
- AnnotationConfigApplicationContext : 설정 정보를 자바 클래스에서 찾는다.
-
1) 자바 CLASSPATH 에서 설정 파일을 찾는 IoC 컨테이너
=> 자바 CLASSPATH?
예를 들면 /Users/eomjinyoung/git/bitcamp-study/java-basic/bin/main
즉, JVM이 자바 클래스 파일(.class)을 로딩하기 위해 찾는 경로이다.
보통 JVM을 실행할 때 -classpath 옵션이나 -cp 옵션으로 경로를 지정한다.
물론 JVM이 클래스 파일을 찾을 JVM의 기본 경로($JAVA_HOME/lib)를 가장 먼저 뒤진다.
=> 설정 파일 경로를 지정할 때 자바 패키지 경로를 지정한다.
파일 경로이기 때문에 패키지와 패키지 사이에는 . 대신에 /를 사용해야 한다.
// 스프링 IoC 컨테이너 사용
package com.eomcs.spring.ioc.ex01.a;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Exam01 {
public static void main(String[] args) {
ApplicationContext iocContainer = new ClassPathXmlApplicationContext(//
"com/eomcs/spring/ioc/ex01/a/application-context.xml");
System.out.println("실행 완료!");
}
}
package com.eomcs.spring.ioc.ex01.c;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class Exam01 {
public static void main(String[] args) {
// 3) 자바 클래스 파일의 애노테이션으로부터 설정 정보를 추출한다.
// => 자바 클래스로 설정 정보를 다루는 것을 'Java Config' 라 부른다.
// => 생성자 파라미터로 Java Config 클래스의 타입 정보를 넘긴다.
ApplicationContext iocContainer = new AnnotationConfigApplicationContext(//
AppConfig.class);
System.out.println("실행 완료!");
}
}
package com.eomcs.spring.ioc.ex01.d;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.eomcs.spring.ioc.SpringUtils;
public class Exam01 {
public static void main(String[] args) {
ApplicationContext iocContainer = new ClassPathXmlApplicationContext(//
"com/eomcs/spring/ioc/ex01/d/application-context.xml");
// 현재 IoC 컨테이너에 들어 있는 객체를 출력해 보자.
SpringUtils.printBeanList(iocContainer);
System.out.println("실행 완료!");
}
}
// IoC 컨테이너에 보관된 객체를 확인하기
package com.eomcs.spring.ioc.ex01.d;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import com.eomcs.spring.ioc.SpringUtils;
public class Exam02 {
public static void main(String[] args) {
ApplicationContext iocContainer = new AnnotationConfigApplicationContext(//
AppConfig.class);
// 현재 IoC 컨테이너에 들어 있는 객체를 출력해 보자.
SpringUtils.printBeanList(iocContainer);
/* 결과값
--------------------------------
빈 개수: 5
org.springframework.context.annotation.internalConfigurationAnnotationProcessor = org.springframework.context.annotation.ConfigurationClassPostProcessor
org.springframework.context.annotation.internalAutowiredAnnotationProcessor = org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor
org.springframework.context.event.internalEventListenerProcessor = org.springframework.context.event.EventListenerMethodProcessor
org.springframework.context.event.internalEventListenerFactory = org.springframework.context.event.DefaultEventListenerFactory
appConfig = com.eomcs.spring.ioc.ex01.d.AppConfig
--------------------------------
실행 완료! */
// AnnotationConfigApplicationContext는
// 애노테이션 처리에 필요한 도구를 기본 포함하고 있다.
// 또한 Java Config 클래스(AppConfig)의 객체도 포함한다.
System.out.println("실행 완료!");
}
}
xml config와 java config
인덱스 번호로 아규먼트 순서를 제어한다.