context.xml 파일들로 다양한 설정(서블릿 같은 기능을 하는 문구)들을 관리하게 되는데


한 context 파일을 사용하게 되면 설정이 너무 길어지므로


분류를 두어 나누는 것을 추천한다.


이 xml 파일들을 여러개 만들어 관리를 하지만


이 파일들을 읽어오라고 따로 명시를 해주어야 한다.


이에 대한 설정은 web.xml 이라는 파일에서 진행한다.





다음 예시는 root context를 webapp 바깥의 resources로 옮기고


WEB-INF 폴더 아래의 spring 폴더를 config로 이름을 바꾸고


servlet-context파일을 config로 옮긴 뒤 이름을 action-servlet으로 바꾼다.


위의 수정 내역을 web.xml 파일에 등록


먼저 context-param의 내용을 바꾼다.


    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
            classpath:root-context.xml
        </param-value>
    </context-param>



다음으로는 Servlet 정보, servlet context 정보가 담겨있는


<servlet>태그, <servlet-mapping> 태그를 수정



    <servlet-name>action</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/config/action-servlet.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
       
    <servlet-mapping>
        <servlet-name>action</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>




이와 같이 servlet-class를 통해서 Dispatcher Servlet을 사용한다고 명시하고


param name과 value를 통해 경로를 입력한다


load-on-startup는 로딩 순서이므로 그냥 적으면 되고


servlet-mapping을 통해서 맵핑 주소를 설정한다.


실행 테스트를 할 때 localhost:포트/키워드를 주소창에 입력했을때


자동으로 맨 뒤에 슬래시가 붙는데 localhost:포트/키워드/


슬래시의 맵핑 주소가 설정 된 곳으로 연결되게 된다.





또 하나의 예제로 member를 통해 맵핑 설정을 이해해보자.


    <servlet>
        <servlet-name>member</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/config/member-servlet.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>


    <servlet-mapping>
        <servlet-name>member</servlet-name>
        <url-pattern>*.me</url-pattern>
    </servlet-mapping>



*.me를 통해서 url 이 .me로 끝나는 연결은


/WEB-INF/config/member-servlet.xml 경로의 설정을 읽어서 연결을 한다.





보너스로 이와 같은 방법으로 Dispatcher Servlet을 이용하여 Encoding 타입을 바꾸는 방법은 다음과 같다.


    <filter>
        <filter-name>encodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>encodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>





Servlet에서는 필터 클래스를 생성하여 들어오는 모든 요청(/*)의 인코딩 타입을 UTF-8로 설정했지만


Spring에선 위와같이 명시하면 끝난다.










+ 추가 - context 파일에 들어가는 내용


Spring Framework는 객체를 생성 시 자동으로 new 객체()를 해주도록 설정 할 수 있다.


이 설정은 context.xml 파일들에서 설정하고


이러한 객체(예전에 VO 폴더에 만든 객체들)들을 bean 이라고 한다.


해당하는 서블릿으로 연결되면 bean들을 하나하나 생성 할 필요 없이 바로바로 사용 할 수 있게 설정하는 xml이다.








+ 추가 - context.xml 파일이 어떻게 맵핑 주소를 명시한 java 파일을 찾는가


context.xml의 내용을 보면


<context:component-scan base-package="패키지 명" />


context라는 태그가 존재하고 base-package라는 속성이 등록되어 있다.


base-package에 등록된 경로를 따라서 하위에 존재하는 java 파일들을 전부 스캔하여


@RequestMapping("맵핑 주소") 라는 어노테이션을 사용한 메소드들을 찾는다.


톰캣이 이를 가지고 있다가 맵핑 주소에 요청이 들어오면 해당하는 메소드에 연결해주는 방식이다.


bean 객체를 자동으로 잡아주는 방법도 있고 수동으로 등록을 해야 할 때가 있다.


자동으로 잡아주는 방식은 @Controller, @Service, @Repository와 같은 어노테이션으로 자동으로 잡히게 된다.


자세한 설명은 Autowired를 사용할때 게시합니다.





+ Recent posts