Computer Science/Spring

#5 Spring MVC 구조

꿈꾸는어린이 2018. 5. 25. 21:14

Spring MVC

  • Model - View - Controller

  • Model : Business logic 실행, data 처리, database 연동

  • View : User Interface, presentation logic

    ​ (브라우저에 출력시킬 response 만듦, 주로 jsp)

  • Controller : Request 처리 흐름 제어, request/response data 전달


  • DispatcherServlet : client 요청(request) 받아 controller에 전달, controller 처리 결과를 view에 전달(Tomcat과 같은 서블릿엔진(서버)로 실행, front controller 역할)

  • HandlerMapping : 요청 URL을 처리할 Controller 결정

  • Controller : 요청을 처리한 후 결과를 dispatcherServlet에 전달

  • ModelAndView : controller가 처리한 결과, DTO 역할, view의 이름도 포함

  • ViewResolver : controller 처리 결과를 출력한 view 결정

  • view : 처리 결과 출력하기 위한 화면(response) 생성

  • DispatcherServlet, HanlderMapping, ViewResolver 는 Spring에서 제공되는 구현 클래스 이용

    -> web.xml이나 설정 파일에 등록

  • Model component(domain, DAO 클래스 포함), Controller(request 처리), view(xml, html, json등 형태)는 직접 구현


DispatherServlet

  • Client의 request 전달받는 servlet(front controller 역할)

  • Web application의 설정 파일(WEB-INF/web.xml) 에 설정

  <web-app ...>
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/mvc-config.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>*.do</url-pattern> // URL이 .do로 끝나는 모든 request 처리
</servlet-mapping>

  • Web application은 일반적으로 여러 계층(controller, service, dao등)으로 구성되는데 각 계층에 속하는 bean들을 서로 다른 설정 파일에 관리한다

  • DispatcherServlet 설정 파일에는 HandlerMapping, Controller, ViewResolver등 mvc관련 bean에 대한 설정만을 포함.


Controller

  • Request 객체 전달 받아 처리, 일반적으로 ModelAndView 객체 생성하여 반환

  • Controller 객체를 Spring bean으로 등록해야 함

  • @Controller annotation 사용 (<context:component-scan />이나 <mvc:annotation-driven /> 설정 파일에 작성)

  • @RequestMapping annotation으로 사용자가 정의한 method를 특정 request URL에 대한 handler method로 지정

  //index.jsp
<body>
  <h1>Spring Web MVC 예제 (LectureNotes 5 &amp; 6)</h1>
  <ul>
  <li><p>HelloWorld Example<br>
  <a href="<c:url value='/hello.do' />">/hello.do</a></p>
  </li>
  ...


//controller
package org.springframework.samples.controller;

import java.util.Calendar;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

@Controller //bean 자동 등록, 이 class의 객체를 controller로 사용하겠다
public class HelloController {

@RequestMapping("/hello.do") // requestURL Mapping, request처리할 method 지정
public ModelAndView hello() {
ModelAndView mav = new ModelAndView();
mav.setViewName("hello"); //★★ view 이름 : hello ★★
mav.addObject("greeting", getGreeting()); //★★ model객체 이름 : greeting ★★
return mav; //DispatcherServlet에 return
}

private String getGreeting() {
int hour = Calendar.getInstance().get(Calendar.HOUR_OF_DAY);
if (hour >= 6 && hour <= 11) {
return "Good morning!";
} else if (hour > 11 && hour <= 14) {
return "Did you have lunch?";
} else if (hour > 14 && hour <= 18) {
return "Good afternoon!";
} else if (hour > 18 && hour <= 24) {
return "Good evening!";
}
return "Hello!";
}

}


//view(hello.jsp)
<%@ page language="java" contentType="text/html; charset=EUC-KR"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>인사</title>
</head>
<body>
인사말: <strong>${greeting}</strong> //객체이름, ModelAndView 객체에 저장한 모델 객체 참조
</body>
</html>

  • @RequestMapping : 적용된 URL 경로는 각 request hanlder method의 기본 경로로 사용됨

  • @PathVariable : URL 경로 내의 변수 값을 parameter로 전달 받음

  @Controller
@RequestMapping("/members")
public class MemberController{
 @RequestMapping("/{memberId}/orders/{orderId}") //ex) /members/jain/orders/12
 public String memberOrderDetail(@PathVariable String memberId, @PathVariable{orderId} int orderNum, Model model){
   model.addAttribute("member", memberService.getMemberInfo(memberId));
   model.addAttribute("order", new OrderInfo(orderNum, memberId));
   return "members/memberOrderDetail";
}
}

  • HTTP 전송 방식

  
@Controller
@RequestMapping("/article/newArticle.do")
public class NewArticleController {
@Autowired
private ArticleService articleService;

@RequestMapping(method = RequestMethod.GET) //GET Request만 처리
public String form() {
return "article/newArticleForm"; //form view로 이동
}

@RequestMapping(method = RequestMethod.POST) //POST Request만 처리
public String submit(@ModelAttribute("command") NewArticleCommand command) {
articleService.writeArticle(command); //service객체 호출 : form 입력 처리
return "article/newArticleSubmitted"; // 처리 결과 출력하는 view로 이동
}
}
//Command 객체 : HTTP request parameter를 저장한 객체

  • HttpServletRequest 이용한 request parameter 접근

  
@Controller
public class EventController {

@RequestMapping("/detail")
public String list(HttpServletRequest request, Model model){
     //HttpServletRequest 타입의 파라미터 추가, getParameter() method 이용하여 값을 추출
     String id = request.getParameter("id");
     if(id == null)
    return "redirect:/event/list";
}

  • @RequestParam

  @Controller
public class SearchController {

 //http://{host}/{context}/search/internal.do?query=spring&p=3
@RequestMapping("/search/internal.do")
public ModelAndView searchInternal(@RequestParam("query") String query,
@RequestParam(value = "p", defaultValue = "1") int pageNumber) {
System.out.println("query=" + query + ",pageNumber=" + pageNumber);
return new ModelAndView("search/internal");
}
//query parameter 존재하지 않으면 오류, p parameter가 존재하지 않으면 기본값 1

@RequestMapping("/search/external.do")
public ModelAndView searchExternal(@RequestParam(value="query", required=false) String query,
@RequestParam(value = "p", defaultValue = "1") int pageNumber) {
System.out.println("query=" + query + ",pageNumber=" + pageNumber);
return new ModelAndView("search/external");
}
//required=false 로 설정하면 request parameter 존재하지 않으면 null 할당
}



ViewResolver

  • 물리적 view 객체 생성

  • DispatcherServlet이 사용하는 spring 설정 파일에 bean으로 등록

  
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
       <!-- Example: a logical view name of 'showMessage' is mapped to '/WEB-INF/jsp/showMessage.jsp' -->
       <property name="prefix" value="/WEB-INF/view/"/>
       <property name="suffix" value=".jsp"/>
</bean>

  • prefix : view 이름 앞

  • suffix : view 이름 뒤

  • ex ) /WEB-INF/view/hello.jsp


'Computer Science > Spring' 카테고리의 다른 글

#7 Model Data  (0) 2018.05.26
#6 Command 객체 이용한 Form 전송 처리  (2) 2018.05.25
#4 Bean 객체의 life-cycle 관리  (0) 2018.05.14
#3 Spring DI : auto-wiring, annotation 기반  (0) 2018.05.14
#2 Spring DI - xml 기반  (0) 2018.05.14