ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Spring(초기 구동 원리?)
    카테고리 없음 2020. 7. 16. 09:18

    Spring(초기 구동 원리?)

     

    src/main/java : 비즈니스 로직(controller, service, dao)

     

    src/main/doc : 문서 파일

     

    src/main/common : 컴파일되어지는 공유되어지는 파일

     

    src/main/resources : 컴파일되지 않는 공유되어지는 설정파일

     

    src/test/java : test 파일

     

    src/test/resources : test 파일

     

    src/main/webapp : 웹 다이나믹 프로젝트에서의 WebContent역할.

     


    1. web.xml 설정

    <servlet>
    
    		<servlet-name>doDispatcher</servlet-name>
            
    		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
            
    		<init-param>
            
    <!-- 			defult 위치의 파일명이 아닌 내가 원하는 위치의 원하는 파일명으로 만들겠다 -->
    
    			<param-name>contextConfigLocation</param-name>
                
    			<param-value>/WEB-INF/spring/config/servlet-*.xml</param-value>
                
    		</init-param>
            
    	</servlet>
        
    	<servlet-mapping>
        
    		<servlet-name>doDispatcher</servlet-name>
            
    		<url-pattern>*.do</url-pattern>
            
    	</servlet-mapping>

    -> .do라고 끝나는 요청이 발생하면 여기서 걸러서 안내해줌

     

     

    <init-param>
    
    <!-- 			defult 위치의 파일명이 아닌 내가 원하는 위치의 원하는 파일명으로 만들겠다 -->
    
    	<param-name>contextConfigLocation</param-name>
                
    	<param-value>/WEB-INF/spring/config/servlet-*.xml</param-value>
                
    </init-param>

    이 구문이 없으면 .do로 요청되는 것들은 "servlet-name"-servlet.xml이라는 이름과 default로 매핑된다.

     

    하지만 바로 위의 코드를 써주면 param-value에 해당하는 위치의 xml과 매핑된다.

     

    최초 요청을 받는 DispatcherServlet은 "프론트 컨트롤러"라고 부른다.

     

     

    * 프론트 컨트롤러(DispatcherServlet)은 각각 한개의 WebApplicationContext를 생성하고 가진다.

     

       또한 이 WebApplicationContext는 다른 프론트 컨트롤러간에 공유가 불가능하다.

     

     

    2. servlet-config.xml

    <?xml version="1.0" encoding="UTF-8"?>
    
    <beans xmlns="http://www.springframework.org/schema/beans"
    	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    	xmlns:context="http://www.springframework.org/schema/context"
    	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
    		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd">
    
    	<!-- 
    		어노테이션 기반 자동 bean 선언 및 bean 인스턴스 활용
            
    		context:coponent-scan : base-package 속성에 선언된 해당 패키지 내 모든 클래스들을 대상으로 bean 등록
            
    								bean 등록 조건 : 클래스 상단에 어노테이션(@Controller, @Service, @Repository, @Component)
                                    
    											   선언시 자동으로 bean 등록후 활용
                                                   
    											  @Controller - 컨트롤러 클래스(커멘드 컨트롤러 : 클라이언트의 요청 처리)
                                                  
    											  @Service - Service 레이어 내 클래스
                                                  
    											  @Repository - Dao 레이어 내 클래스
                                                  
    											  @Component - 기타 클래스
    	 -->
    	
    	<context:component-scan base-package="kr.or.ddit">
        
    		<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"></context:include-filter>
            
    	</context:component-scan>
        
    </beans>
    

     

    context:component-scan base-package = ""    :  여기 선언된 패키지의 모든걸 인스턴스화 해라

     

        <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller">

        </context:include-filter>  아니? 다 하지말고 Controller라는 어노테이션이 붙은 컨트롤러만 인스턴스화해라!!

     

     

     

    어..? 그러면 @Service , @Repository, @Component 들은 언제 인스턴스화해요..??

     

    ==> 루트 컨텍스트와 서블릿 컨텍스트가 인스턴스화 되는 시점은 다르다!!!!

     

       servletContext는 요청이 들어오는 순간에 인스턴스화가 진행되고, rootContext는 서버가 실행되는

     

       시점에 인스턴스화가 진행된다.

     

     

    자. 그러면 루트 컨텍스트는 언제 설정했냐? 그것도 web.xml에 있다.

     

    <context-param>
    
    		<param-name>contextConfigLocation</param-name>
            
    		<param-value>classpath:kr/or/ddit/spring/config/application-*.xml</param-value>
            
    </context-param>
    	
    <!-- 서버가 돌자마자 이벤트가 전파되는데 ContextLoaderListener가 듣고 -->
    
    <listener>
        
    		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
            
    </listener>
    	

     여기서 저 코드로 루트 컨텍스트를 생성해줌과 동시에 위치까지 정해준다.

     

      kr/or/ddit/spring/config/ 패키지 밑의 application으로 시작하는 xml 파일들이 루트 컨텍스트이다.

     

    위의 4개의 xml 파일이 내가 만들어준 루트 컨텍스트 이다!!!

     

    저기 안에 선언된 것들은 서버가 실행될때 자동으로 인스턴스화 되기 때문에 프레임워크의 사용법만 맞춰주면

    888888888

    사용할 수 있다.

     

    여기까지 알면 다양한 종류의 어노테이션을 이용하여 값을 주고 받는 방법을 쓰지 않는 기본 구동 원리는

     

    알 수 있다.

     

    댓글

Designed by Tistory.