MVC 모델: 프로그램의 처리 역할을 나누어 프로그램을 작성하는 방법. 역할은 모델(Model: M), 뷰(View: V), 컨트롤러(Controller: C)의 세 종류로 분류한다.
모델은 시스템에서 비즈니스 로직을 담당한다.
비즈니스 로직을 회원 가입할 때의 상황에 비유하면 사용자가 입력한 아이디의 중복 확인, 본인 인증, 비밀번홀 규칙 확인 등이 필요할 것이다. 이 중에서 아이디 중복 확인의 비즈니스 로직을 생각해 보면 우선 사용자가 입력한 아이디 값을 메모리에 저장하고 회원 데이터베이스에서 같은 아이디가 있는지 확인하고 중복 여부를 화면에 표시할 수 있게 전달하는 것까지가 비즈니스 로직이 된다.
어렵게 생각하지 말고 모델은 시스템에서 제공하는 비즈니스 로직의 처리 내용을 작성하는 곳이라고 생각하면 된다.
뷰는 한마디로 설명하면 '외형'이다. 사용자 입력과 결과 출력 등 시스템에서 표현 부분을 담당하며 웹 애플리케이션에서는 주로 화면을 담당한다.
컨트롤러는 서비스 처리를 담당하는 모델과 화면 표시를 담당하는 뷰를 제어(Control)하는 역할을 한다. 사용자가 입력한 내용을 뷰에서 받고, 받은 데이터를 기준으로 모델에 내용을 전달한다. 또 모델에서 받은 데이터를 뷰에 전달해서 화면에 표시하는 역할을 한다.
서비스 처리 모델(Model: M), 보기 뷰(View: V), 제어 컨트롤러(Controller: C)로 분류함으로써 프로그램의 독립성이 높아지고 다음과 같은 이점을 얻을 수 있다.
스프링 MVC: 웹 애플리케이션을 간단하게 만들 수 있는 기능을 제공하는 프레임워크
프런트 컨트롤러 패턴(Front Controller Pattern): 디자인 패턴 설계 패턴의 하나. 모든 요청을 프런트 컨트롤러가 받아, 그 후 담당하는 컨트롤러에 적절하게 할당하는 설계
객체 | 기능 개요 |
---|---|
DispatcherServlet | 모든 요청을 수신하는 프런트 컨트롤러 |
Model | 컨트롤러에서 뷰에 넘겨주는 표시용 데이터 등을 저장하는 객체(HttpServletRequest나 HttpSession과 같은 기능을 제공) |
컨트롤러 | 요청에 대응해서 처리할 내용이 있는 곳 |
서비스 처리 | 데이터베이스에 접속해서 데이터를 취득하거나 데이터를 가공하는 등 여러 가지 작업을 실행한다. 개발자가 설계하고 구현한다(스프링 MVC와 관계없음) |
뷰 | 화면 표시 처리를 한다(구체적으로는 JSP 등의 처리) |
그림을 보면 번거로운 처리는 스프링 MVC가 담당하기 때문에 실제로 우리가 작성하는 부분은 컨트롤러, 비즈니스 로직 처리, 뷰의 세 가지뿐인 것을 알 수 있다.
package com.example.springmvcviewsample.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping("hello")
public class HelloViewController {
@GetMapping("view")
public String helloView(){
// 반환값으로 뷰의 이름을 돌려줌
return "hello";
}
}
컨트롤러는 POJO 클래스로 작성한다. POJO란 Plain Old Java Object의 줄임말로, 보통의 자바 객체다. 즉 어떤 클래스를 상속하는 등의 특별한 처리를 하지 않는 클래스로 생각하면 된다.
클라이언트와 데이터 입출력을 제어하는 애플리케이션 레이어의 컨트롤러를 부여한다. 요청 핸들러 메서드의 반환값을 뷰 이름으로 하여 템플릿 엔진의 뷰가 응답 HTML을 생성한다.
컨트롤러의 요청 핸들러 메서드와 URL을 매핑하게 된다. @RequestMapping 어노테이션에는 여러 가지 속성을 지정할 수 있다.
속성 | 기능 개요 |
---|---|
value | 매핑할 URL 경로(path)를 지정 value는 처음의 /를 생략할 수 있다. URL경로만 지정하는 경우에는 속성에서 value를 생략할 수 있다. URL 경로를 여러 개 지정할 수 있다. |
method | GET과 POST 등의 HTTP 메서드를 지정한다. GET을 지정하는 경우에는 RequestMethod.GET을 사용한다. POST를 사용하는 경우에는 RequestMethod.POST를 사용한다. HTTP 메서드를 여러 개 지정할 수 있다. 클래스에 @RequestMapping을 부여하는 경우에는 지정할 수 없다. |
@RequestMapping의 GET 요청용 어노테이션이다. 이 어노테이션을 사용하는 것으로 작성 내용이 줄어들고 가독성이 높아진다. 속성으로는 @RequestMapping의 value 속성은 같지만, mehod 속성은 없다.
@RequestMapping의 POST 요청용 어노테이션이 @PostMapping이다. 이 어노테이션을 사용하면 작성 내용이 줄어들고 가독성이 높아진다. 속성으로는 @RequestMapping의 value 속성은 같지만, method 속성은 없다.
HelloViewController 클래스는 클래스에 @RequestMapping("hello") 어노테이션을 부여하고 요청 핸들러 메서드에 @GetMapping("view") 어노테이션을 부여했다. 이것으로 클라이언트가 URL로 GET 메서드를 보내면 HelloViewController 클래스의 helloView 메서드가 호출된다.
스프링 부트의 프로젝트에서는 템플릿 엔진을 사용하는 경우 '뷰'를 두는 곳이 지정되어 다음과 같은 규칙을 지켜야 한다.