출처
: 토비의 스프링 3.1
의존성주입(DI)를 하는 이유?
: 관심사의 분리
: 비지니스 로직은 서비스만, 의존관계는 어플리케이션 컨텍스트가 담당하게 한다.
: 응집도는 올라가고 결합도는 낮아진다.
빈 오브젝트
1. 빈오브젝트의 생성
: 메타정보 리소스(XML, Annotation 등) -> 메타정보(BeanDefinition) -> IoC컨테이너 -> DI된 빈 오브젝트 관리
2. BeanDefinition
: 빈 메타정보 인터페이스
: 클래스, 프로퍼티, 빈 아이디 정보를 사용한다.
3. BeanDefinitionReader
: 빈 메타정보 리소스 인터페이스
4.RootBeanDefinition
: BeanDefinition을 구현한 클래스
ApplicatonContext
: 어플리케이션 인터페이스
1. IoC컨테이너의 종류
a. StaticApplicationContext
: ApplicationContext를 상속한 컨텍스트
: 메타정보를 소스코드를 통해서 받아온다.
: 기본적인 메타정보들이 default로 설정되어있다.
b. GenericApplicationContext
: 가장 일반적인 어플리케이션 컨텍스트의 구현 클래스
: 실전에서 사용될 수 있는 모든 기능을 갖추고 있다.
: XML 외부 리소스의 빈 설정메타 정보를 리더를 통해 읽어들여 사용한다.
: XmlBeanDefinitionReader 는 XML 리소스의 메타정보를 읽어들이는 BeanDefinitnionReader 구현체이다.
c. WebApplicationContext
: 웹에서 주로 사용하는 컨텍스트이다.
: 구현체는 XmlWebApplicationContext가 있다.
웹 어플리케이션에서의 스프링 환경 구동
: 자바 프로그램은 JVM을 통해서 main을 실행 시킨다,
: 그러면 웹은?
: web.xml에 DispatcherServlet을 등록해주면 해당 서블릿이 실행되고 어플리케이션 컨텍스트의 리소스 로딩 및 빈객체를 실행시켜준다. (간단하고만)
1. 웹서버
: 웹 서버는 정적이미지를 HTTP프로토콜을 사용하여 전달한다.
2. 톰캣
: 톰캣은 서버다.
: WAR는 로직과 웹설정파일을 가지고 있는 압축파일 형태이다.
: 톰캣이 실행되면 WAR를 실행한다.
3. 웹어플리케이션
: 정적 데이터가 아닌 동적 데이터를 생성한다.
: 컨테이너는 서블릿을 생성한다.
: 하나의 서블릿(프론트 컨트롤러 패턴)이 요청을 받고 스레드로 작업 분할 후 결과를 반환한다.
: 호출되는 서블릿은 URL을 통해서 분리된다.
: DispatcherServlet을 구현한 클래스인 경우 서블릿 등록이 가능하다.
어플리케이션 컨텍스트 계층구조
: 컨텍스트에도 계층구조가 존재한다.
: 자식 컨텍스트는 부모의 컨텍스트를 참조할 수 있다.
: 하지만 자식은 손자의 컨텍스트를 참조할 수 없고, 형제의 컨텍스트를 참조할 수 있다.
: 아래에서 위로만 가능하다.
: 컨텍스트 계층구조는 컨텍스트 생성시 생성자로 넘기면 된다.
어플리케이션 컨텍스트 구조
1. 루트 웹 어플리케이션 컨텍스트 - 서블릿 어플리케이션 컨텍스트(2개)
: 웹 어플리케이션에 등록된 컨테이너를 루트 웹 애플리케이션 컨텍스트라고 부른다.
: 이 컨텍스트는 서블릿 레벨에 등록되는 컨테이너들의 부모 컨테이너가 된다.
: 루트 컨텍스트를 서블릿 컨텍스트가 공유하게 된다.
: 서블릿의 경우 하나만 등록해도 요청 처리가 가능하기 때문에 두개 이상의 서블릿을 등록 하는 경우는 새로운 기술을 추가할 때이다.
2. 루트 웹 어플리케이션 컨텍스트 - 서블릿 어플리케이션 컨텍스트(1개)
: 보통의 경우 사용하는 컨테이너 구성
: 루트 웹 어플리케이션을 두는 이유는 서비스 계층이나 데이터 계층은 스프링 기술을 사용하고, 프레젠테이션 계층은 다른 기술을 사용하고 싶을 때 사용한다.
3. 서블릿 컨텍스트 != 서블릿 어플리케이션 컨텍스트
: 서블릿 컨텍스트는 서블릿 관련 환경설정 정보를 담고 있다.
4. 어플리케이션 컨텍스트 설정
: web.xml
<context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring/applicationContext*.xml</param-value> </context-param> // 웹 어플리케이션이 시작되고 종료될 때 실행되는 리스너 (ServletContextListener 인터페이스) // DB연결 로깅 서비스 만드는데 사용한다. // 루트 어플리케이션 컨텍스트를 등록해준다.
<listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> // 스프링프레임워크 서블릿 등록 <servlet> <servlet-name>dispatcher</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet> <servlet-name>sitemesh-freemarker</servlet-name> <servlet-class>com.aceproject.commons.servlet.FreemarkerDecoratorServlet</servlet-class> <load-on-startup>1</load-on-startup>
</servlet> <servlet-mapping> <servlet-name>sitemesh-freemarker</servlet-name> <url-pattern>*.ftl</url-pattern>
</servlet-mapping> |