뚜룽

[Spring] 인프런 스프링 입문 정리 (3) / MVC 모델 본문

Spring

[Spring] 인프런 스프링 입문 정리 (3) / MVC 모델

ddooroong 2023. 10. 9. 01:19

목차

  1. MVC 모델
  2. MVC 모델 구현하기

 

 

1. MVC 모델

 

MVC 모델은 Model, View, Controller로 이루어진 소프트웨어 디자인 패턴이다. 

  • MVC 모델이란?
... MVC에서 모델은 애플리케이션의 정보(데이터)를 나타내며, 뷰는 텍스트, 체크박스 항목 등과 같은 사용자 인터페이스 요소를 나타내고, 컨트롤러는 데이터와 비즈니스 로직 사이의 상호 동작을 관리한다.

(출처: 위키피디아 '모델-뷰-컨트롤러')
MVC 소프트웨어 디자인 패턴의 세 가지 부분은 다음과 같이 설명할 수 있습니다.
1. 모델: 데이터와 비즈니스 로직을 관리합니다.
2. 뷰: 레이아웃과 화면을 처리합니다.
3. 컨트롤러: 모델과 뷰로 명령을 전달합니다.

(출처: Mozilla 'MVC')

 

2. MVC 모델 구현하기 

 

MVC 모델은 관심사를 분리하는 것이 가장 중점인 디자인 패턴이다. 이에 맞게 구현의 순서를 정리하면 다음과 같다.

  1. 클라이언트의 요청을 처리할 Controller를 @GetMapping으로 지정한다.
  2. Spring은 @GetMapping 어노테이션이 붙은 메소드에 정보를 처리할 Model을 부여한다.
  3. Model에는 key:value 형식으로 정보(데이터)를 저장한다.
  4. Controller가 요청을 처리하고 클라이언트에게 보여줄 html 페이지를 String 타입으로 반환한다.
  5. Spring의 ViewResolver가 main/resources/templates 에 있는 동일한 이름의 html 문서를 랜더링하여 클라이언트에게 응답한다. 

이 순서대로 코드를 작성해보자. 우선 Controller에 또 다른 메소드 하나를 추가해준다. 작업 중인 프로젝트 구조는 이런 모습이다. HelloController 클래스에 helloMvc라는 메소드를 추가하였다. 

현재 프로젝트 구조

  • HelloController.java
package hello.hellospring.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;

@Controller
public class HelloController {

    @GetMapping("hello")
    public String helloMvc(Model model) {
        model.addAttribute("data", "hello!");
        return "hello";
    }

// 추가!
    @GetMapping("hello-mvc")
    public String helloMvc(@RequestParam("name") String name, Model model) {
        model.addAttribute("name", name);
        return "hello-template";
    }
}

그리고 반환값과 동일한 이름의 html 파일을 하나 만들어준다. 

  • hello-template.html
<html xmlns:th="http://www.thymeleaf.org">
<body>
<p th:text="'hello ' + ${name}">hello! empty</p>
</body></html>

이번에는 /hello-mvc 라는 요청이 들어올 때 helloMvc 메소드가 호출되도록 코드를 작성했다. 이때 helloMvc 메소드는 String 타입의 매개변수 하나를 가진다. Spring에서 매개변수를 지정할 때는 @RequestParam("이름") 을 붙여서 만든다. 만약 매개변수가 필수가 아닐 경우에는 @RequestParam(value="name", required=false) 이런 식으로 작성해준다. 

  • 사용 예시

아래 이미지에서 url에 hello-mvc와 매개변수 하나를 전달하였다. 그러면 html문서의 ${name} 부분이 고양이로 치환되어 hello 고양이 라고 출력된다.

정리하면, 클라이언트로부터 /hello-mvc?name=고양이 라고 문자열을 하나 받아서, 그 값을 String name에 저장한다. 그리고 모델의 "name"이라는 key값에 방금 저장한 '고양이'를 저장하면 모델이 뷰로 반환되어 html 문서에서 이 데이터를 사용할 수 있게 된다.  처리가 끝나면 Controller는 hello-template.html이라는 뷰를 하나 호출하여 화면에 랜더링한다.

이렇게 데이터를 저장하고, 전체 로직을 처리하고, 화면을 알맞게 표시하는 과정을 3개의 담당자로 나누어 실행하는 것이 MVC 모델이다.