본문으로 바로가기

토비의스프링, IoC 컨테이너와 DI

category Backend/Spring 2017. 10. 6. 14:27
    반응형

    출처 

    : 토비의 스프링 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>






    반응형