[Spring] MVC Model 2

Posted by 신희준 on October 15, 2017

2017 - 10 - 15 (일)

  • MVC MODEL 2
  • Front-controller 패턴
  • Controller 테스트
  • JSON 테스트

  • 코드로 배우는 스프링 웹프로젝트[구멍가게 코딩단 지음] 참조


    1 .. MVC MODEL 2



    Model 2 패턴


    Model : 데이터 혹은 데이터를 처리하는 영역

    View : 결과 화면을 만들어내는데 사용하는 부분

    Controller : 웹의 요청을 처리한다. View와 Model 사이에서 통신하는 역할을 한다.

    위와같이 분할하면서 Front-end 와 Back-end 를 분리하여 작업이 가능하며 유지보수에도 용이하게 되었다.

    Front Controller 패턴


    모델 2 방식으로 분업이 가능케 되었지만 각 컨트롤러 사이의 중복코드가 생기며 Front Controller 방식을 도입하게됨.(Spring MVC)

    Post Sample Image

    위 사진에서 Front-controller 가 dispatcher-servlet이라고 생각하면 된다. Spring 3.0 MVC 의 요청 처리 절차는 아래와 같다.

    1.. 클라이언트가 브라우저에서 회원가입을 위해 서버에 HTTP Request 메시지를 보낸다.

    2.. 들어오는 HTTP Request는 Front-controller에서 받아 적절한 회원가입 요청을 처리하는 컨트롤러의 메서드에 매핑(Handler-mapping)한다.

    3.. Handler Mapping의 도움으로, Front-controller는 들어온 요청을 적절한 Controller(회원등록 Controller) 로 보낸다.

    4.. 이 Controller는 회원관리 관련한 DB연동을 담당하는 USERDAO(DB와 연동하여 회원정보를 Insert함)를 이용해서 데이터를 요청한다.

    5.. USERDAO객체는 Mybatis 를 이용하는 Mapper를 통해서 원하는 작업을 수행한다.

    4.. Controller 는 들어온 요청을 처리하고 그 결과로 Model과 View 를 ModelAndView 라는 객체의 인스턴스 형태로 Front Controller 에 다시 전달한다.

    5.. Front Controller 는 ViewResolver 오브젝트를 이용하여 이 view 를 분석한다(회원가입 완료 화면).

    6.. 선택된 view 는 변환되어 다시 클라이언트에게 보여진다.

    Spring Controller Test


    컨트롤러에 대한 예제

    package org.zerock.domain;
    
    public class ProductVO {
    	private String name;
    	private double price;
    	public ProductVO(String name, double price) {
    		super();
    		this.name = name;
    		this.price = price;
    	}
    	public String getName() {
    		return name;
    	}
    	public double getPrice() {
    		return price;
    	}
    //VO 클래스 생성. 객체로 값이 전달됨.
    
    @Controller //@Controller 애너테이션은 SampleController3 을 Controller 클래스로 지정해준다.
    public class SampleController3 {
       private static final Logger logger = LoggerFactory.getLogger(SampleController3.class);
       @RequestMapping("/doD") // doD() 메서드는 doD URI에 매칭되는 메소드이다.
       public String doD(Model model) {
          ProductVO product = new ProductVO("Sample Product", 10000);
          logger.info("doD");
          model.addAttribute(product);      // 이때 productVO 처럼 앞글자가 소문자로 처리된 형태가 저장된다.
          return "productDetail";
       }
    }
    
    <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
    <%@ page session="false" %>
    <html>
    	<body>
    
    		<P> ${productVO.name }</P>
    		<p>${productVO.price }</p>
    	</body>
    </html>
    


    위의 예제는 SampleController3 을 컨트롤러로 지정해주고 해당 컨트롤러로 오는 요청 중 doD 에 매핑되는 doD() 메서드가 실행되는 예제이다.
    product 객체를 하나 생성하고 model객체에 product객체를 주입한다. 해당 컨트롤러는 productDetail 을 리턴하여 productDetail.jsp 페이지를 응답한다.

    JSON 데이터 생성하기


    JSON 을 활용하기 위해서 pom.xml 에 해당 라이브러리를 추가해야한다. mvnrepostorty에서 jackson-databind를 검색하여 추가한다.

    @Controller
    public class SampleController5 {
    	@RequestMapping("/doJSON")
    	public @ResponseBody ProductVO doJSON() {
    		//JSON 데이터를 사용하기위해 @ResponseBody 애너테이션을 추가해야한다.메소드 리턴을 객체로 한다.
    		ProductVO vo = new ProductVO("샘플상품",30000);
    		return vo;
    	}
    }