MVC Study (1)

Spring의 MVC 구조

  • Model : VO , DAO , Manager , Controller
    • 분리하는 목적 : 다른 프로젝트에서 재사용하기 위해서이다.
    • 자바로 제작된 클래스는 대부분 Model이다.
  • View : css , js , jsp , html -분리하는 목적 : 재사용하기 위해서이다.

  • 서블릿 : DispatcherServlet
    • Model+View를 합쳐주는 역할을 담당한다.

Spring에서 달라지는 MVC 과정

Note
                         request 사용자 요청 ▷ DispatcherServlet ▷ Model클래스 찾기      ↔ DAO    request                  : @RequestMappin("*.do")
  • DispatcherServelet 단계에서 JSP Model2방식과 다른 점이 있다.
    • Model클래스의 RequestMapping을 찾아주는 클래스가 하나 더 있는데, 이것이 바로 HandlerMapping 이다.
      • 라이브러리이기 때문에 직접 구현할 필요가 없다.
    • JSP를 찾아서 request 전송하는 클래스인 ViewResolver가 있다.
      • JSP의 경로명만 XML에서 전송해서 알려주면 된다.
      • JSP Model2방식에서는 직접 return했던 과정이다.
  • Model클래스에는 @Controller를 올려주지 않으면 스프링에서 Model클래스를 찾지 못한다.

  • 메인 컨트롤러 : JSP의 모델클래스 = 요청을 제어한다.
    • MVC 구조에서 Model클래스 역할을 담당
    • 요청을 처리하고 결과값을 전송한다. (Busiuness Logic / JSP는 View로직이라고 한다.)
    • 스트럭츠에서는 메인액션이라고 칭한다.
  • 디스패처 : 프론트 컨트롤러 = 요청을 받는다

값을 받아서 출력하는 방법 (1) 단일변수

  • 여러 방식 중 권장하는 방식을 사용해야 한다.

MainController.java

  • 스프링 2.5버전 이후부터는 보안을 중요시하기 때문에 request 사용을 권장하지 않는다.
    • request안에서 접속자의 ip를 확인 가능하기 때문에 보안에 약하다.
  • 스프링 5.0버전 이상 부터는 클래스
    • 클래스 파일을 볼 수 없으므로 소스를 공개하지 않을 수 있다.
  • 데이터 처리를 하고 전송 JSP
    • return "폴더명/jsp명" : forward
      • .jsp를 생략한다.
  • return "redirect:main.do" : sendRedirect

  • 스프링 디폴트 폴더 : src/main/java , webapp

  • request를 사용하지 않으려면 매개변수로 값을 받고, Model 인터페이스를 이용해서 전송한다.
  • 매개 변수는 DispatcherServlet이 설정해준다.
    • 순서 상관 없다.
  • Model의 addAttribute 메소드
public class Model
{
  HttpServletRequest request;
  public void addAttribute(String key,Object obj)
  {
    request.setAttribute(key,obj)
  }
}

input.jsp

Note
  • <input type=submit>
  • <button>
  • <input type=image>
  • ajax는 submit버튼 사용안하고 data 필드를 통해서 전송함

application-context.jsp

  • 패키지 단위 등록
  • viewResolver 처리

값을 받아서 출력하는 방법 (2) VO단위

EmpVO

  • 변수 선언
  • 은닉화, 캡슐화

MainController

  • 매개변수가 vo와 model이 됨
  • @GetMapping : get방식으로 전송한다는 것을 표기하는 @RequestMapping이다.
  • @PostMapping : post방식으로 전송한다는 것을 표기하는 @RequestMapping이다.
  • @RequestMapping을 사용하지 않는 이유는?
    • 전체를 검색하면 loop를 돌리는 횟수가 증가하여 비효율적이기 때문이다.
    • 속도를 더 높이기 위해 post/get방식을 분리한 것이다. (최적화/퍼포먼스 측면)
  • return값은 prefix 이후의 정보를 넣으면 된다.
  • @RequestMapping("main/")을 클래스 위에 적어주면 @GetMapping("emp.do")만 적어도 main/emp.do를 가리킨다.
    • 반복적으로 들어가는 경로를 위에 뺴서 미리 선언할 수 있다.

dispatcher-servlet.xml