# Spring을 만나다: MVC 패턴
## 목차
1. 학습목표
2. MVC 패턴이란?
3. MVC 패턴 코드 예
## 학습목표
+ MVC 패턴의 이해
## MVC 패턴이란?
스프링을 사용한 웹 서비스는 MVC 패턴으로 만들어진다. 따라서 이에 대한 이해가 필요하다.
MVC(Model-View-Controller) 패턴은 역할 분담 패턴이다. 모델(`Model`)은 데이터 담당, 뷰(`View`)는 화면 담당, 컨트롤러(`Controller`)는 모델과 뷰 사이의 중재자 역할을 한다. 마치 음식점에 웨이터, 요리사, 매니저가 역할 분담을 하는 것과 같다.
![Imgur](https://i.imgur.com/V7CGG0Y.png)
### MVC 패턴의 장점
MVC 패턴을 통해 각의 모듈은 역할이 명확해진다.이로 인해 코드의 유지 보수가 쉬워지고, 개발자-퍼블리셔(또는 디자이너)간 협업이 원할해진다.
## MVC 패턴 코드 예
그렇다면 실제 코드를 통해 MVC 패턴을 이해해 보자. 아래의 프로젝트를 보면 HomeController.java와 home.jsp가 있다.
![Imgur](https://i.imgur.com/DSTaO0l.png)
먼저 `View`가 되는 home.jsp 부터 확인하자.
home.jsp
```
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ page pageEncoding="utf-8" session="false"%>
<html>
<head>
<title>Home</title>
</head>
<body>
<h1>Hello world!</h1>
<!-- serverTime 변수는 컨트롤러가 발행한 데이터 -->
<p>The time on the server is ${serverTime}.</p>
</body>
</html>
```
위 코드에 `serverTime` 변수는 컨트롤러로부터 전달된 데이터다. 이 데이터가 어떻게 전달되었는지 `컨트롤러` 코드를 확인해보자. (모든 코드를 당장 다 알필요는 없다)
HomeController.java
```
@Controller
public class HomeController {
private static final Logger logger = LoggerFactory.getLogger(HomeController.class);
@RequestMapping(value = "/", method = RequestMethod.GET)
public String home(Locale locale, Model model) {
logger.info("Welcome home! The client locale is {}.", locale);
Date date = new Date();
DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, locale);
String formattedDate = dateFormat.format(date);
// 모델을 통한 데이터 등록.
model.addAttribute("serverTime", formattedDate );
// 뷰 페이지를 home.jsp로 설정
return "home";
}
}
```
위 코드 중 주석처리 부분을 눈여겨보자. 먼저는 모델을 통해 `serverTIme` 데이터를 등록한다. 그리고 리턴 값을 통해 `home.jsp`를 반환한다. 여기서 반환값을 기준으로 View페이지를 설정하게 된다. 대략적인 느낌이 온다면 OK!
## 문제
뷰페이지인 test.jsp의 코드가 아래와 같다.
```
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ page pageEncoding="utf-8" session="false"%>
<html>
<head>
<title>Test</title>
</head>
<body>
<h1>Test</h1>
<p>이 페이지는 "${ controller }"의 "${ method }" 메소드 호출로 출력되었습니다.</p>
</body>
</html>
```
위 페이지의 출력결과가 아래와 같도록, 컨트롤러(HomeController.java)의 코드를 작성하시오.
![Imgur](https://i.imgur.com/xzYHwKZ.png)
## 요약
1. MVC 패턴은 데이터처리자, 화면처리자, 중재자를 두어 프로그램을 개발하는 방식이다.
2. MVC 패턴의 장점은 크게 두 가지로 아래와 같다.
+ 개발자-퍼블리셔간 협업을 원활하게 함.
+ 코드 유지보수성 증가.
3. 컨트롤러의 반환 값을 통해 뷰 페이지를 설정한다.
```
@RequestMapping(value = "/", method = RequestMethod.GET)
public String home(Locale locale, Model model) {
...
// 뷰 페이지를 home.jsp로 설정
return "home";
}
```
4. 모델을 통해 데이터를 등록한다.
```
// 모델을 통한 데이터 등록.
model.addAttribute("serverTime", formattedDate );
```