코딩하는 오징어

Spring 4 하나 이상의 Dispatcher Servlet 설정하기 본문

Framework/Spring

Spring 4 하나 이상의 Dispatcher Servlet 설정하기

코딩하는 오징어 2018. 3. 7. 20:44
반응형

Web.xml

<!-- application config -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>

<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

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

<servlet-mapping>
<servlet-name>rest</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>


<!-- 웹 페이지를 위한 dispatcher config -->
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/dispatcher-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>


* dispatcher 서블릿은 웹 페이지를 위한 것이고 rest 서블릿은 REST 서비스를 위한 것이다.

DispatcherServlet은 그 자체가 서블릿이기 때문에 한 개 이상의 DispatcherServlet을 설정하는 것이 가능하다. 

웹 페이지를 위한 DispatcherServlet과 REST 기반의 웹서비스 연동을 위한 DispatcherServlet을 나누어 설정 할 수 있다. 

두 DispatcherServlet은 각각 별도의 ServletContext를 생성하게 된다. 예를 들어 위 설정은 "dispatcher" DispatcherServlet은 dispatcher-servlet.xml 설정 파일을 사용하고, "rest" DispatcherServlet은 rest-servlet.xml 설정 파일을 사용하도록 설정하고 있는데, 이때 dispatcher-servlet.xml에서는 rest-servlet.xml에 설정된 빈 객체를 사용할 수 없게 된다.

 일반적인 웹 어플리케이션에서 컨트롤러는 클라이언트의 요청을 비즈니스 로직을 구현한 서비스레이어를 이용하여 처리하는 것이 보통이다. 또한, 서비스 레이너는 영속성 레이어를 사용해서 데이터 접근을 처리하곤 한다. 따라서 dispatcher 관련 컨트롤러와 rest 관련 컨트롤러는 동일한 서비스 레이어에 대한 의존 관계를 가질것이다. 위와 같이 서로 다른 DispatcherServlet이 공통 빈을 필요로 하는 경우, ContextLoaderListner를 사용하여 공통으로 사용될 빈이 관리되고 있는 상위 WebApplicationContext를 설정할 수 있게 된다. 위와 같이 ContextLoaderListener를 ServletListener로 등록하고 contextConfigLocation컨텍스트 파라미터를 이용하여 공통으로 사용될 빈 정보를 담고 있는 설정 파일 목록을 지정하면 된다.


HelloController.java

package com.codingsquid.springMVCTest.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class HelloController {

@RequestMapping(value = "/hello.do")
public String mvcTest(ModelMap model) {
model.addAttribute("greeting", "hello codingsquid");
return "index";
}
}

요청 결과

해당 웹 페이지가 매핑 되는 것을 확인할 수 있다.


RestTest.java

package com.codingsquid.springMVCTest.dto;

import lombok.Data;

@Data
public class RestTest {

private String name;
private int age;
private String currentTime;

}

RestAPITestController.java

package com.codingsquid.springMVCTest.restcontroller;

import com.codingsquid.springMVCTest.dto.RestTest;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import java.time.LocalDateTime;

@RestController
public class RestAPITestController {

@RequestMapping(value = "/test", method = RequestMethod.GET)
public RestTest testRestAPI() {
RestTest test = new RestTest();
test.setName("codingsquid");
test.setAge(25);
test.setCurrentTime(LocalDateTime.now().toString());
return test;
}

}

요청 결과

rest 요청 결과를 확인 할 수 있다.

반응형
Comments