5장 MVC 모델 알아보기

Peter·2023년 5월 3일
0
post-thumbnail

5-1-1 MVC 모델이란?

MVC 모델: 프로그램의 처리 역할을 나누어 프로그램을 작성하는 방법. 역할은 모델(Model: M), 뷰(View: V), 컨트롤러(Controller: C)의 세 종류로 분류한다.

모델(Model: M)

모델은 시스템에서 비즈니스 로직을 담당한다.

비즈니스 로직을 회원 가입할 때의 상황에 비유하면 사용자가 입력한 아이디의 중복 확인, 본인 인증, 비밀번홀 규칙 확인 등이 필요할 것이다. 이 중에서 아이디 중복 확인의 비즈니스 로직을 생각해 보면 우선 사용자가 입력한 아이디 값을 메모리에 저장하고 회원 데이터베이스에서 같은 아이디가 있는지 확인하고 중복 여부를 화면에 표시할 수 있게 전달하는 것까지가 비즈니스 로직이 된다.
어렵게 생각하지 말고 모델은 시스템에서 제공하는 비즈니스 로직의 처리 내용을 작성하는 곳이라고 생각하면 된다.

뷰(View: V)

뷰는 한마디로 설명하면 '외형'이다. 사용자 입력과 결과 출력 등 시스템에서 표현 부분을 담당하며 웹 애플리케이션에서는 주로 화면을 담당한다.

컨트롤러(Controller: C)

컨트롤러는 서비스 처리를 담당하는 모델과 화면 표시를 담당하는 뷰를 제어(Control)하는 역할을 한다. 사용자가 입력한 내용을 뷰에서 받고, 받은 데이터를 기준으로 모델에 내용을 전달한다. 또 모델에서 받은 데이터를 뷰에 전달해서 화면에 표시하는 역할을 한다.

5-1-2 MVC 모델의 개요와 이점

서비스 처리 모델(Model: M), 보기 뷰(View: V), 제어 컨트롤러(Controller: C)로 분류함으로써 프로그램의 독립성이 높아지고 다음과 같은 이점을 얻을 수 있다.

  • 역할 분담을 통해 효율적인 개발 가능
  • 개발하는 엔지니어의 분업화가 용이
  • 설계 변경에 유연하게 대응 가능

5-2-1 스프링 MVC란?

스프링 MVC: 웹 애플리케이션을 간단하게 만들 수 있는 기능을 제공하는 프레임워크

프런트 컨트롤러 패턴(Front Controller Pattern): 디자인 패턴 설계 패턴의 하나. 모든 요청을 프런트 컨트롤러가 받아, 그 후 담당하는 컨트롤러에 적절하게 할당하는 설계

객체기능 개요
DispatcherServlet모든 요청을 수신하는 프런트 컨트롤러
Model컨트롤러에서 뷰에 넘겨주는 표시용 데이터 등을 저장하는 객체(HttpServletRequest나 HttpSession과 같은 기능을 제공)
컨트롤러요청에 대응해서 처리할 내용이 있는 곳
서비스 처리데이터베이스에 접속해서 데이터를 취득하거나 데이터를 가공하는 등 여러 가지 작업을 실행한다. 개발자가 설계하고 구현한다(스프링 MVC와 관계없음)
화면 표시 처리를 한다(구체적으로는 JSP 등의 처리)

5-2-2 요청을 받고 응답을 보낼 때까지의 흐름

  1. 모든 요청을 수신하는 프런트 컨트롤러인 DispatcherServlet이 클라이언트로부터 요청을 수신한다.
  2. DispatcherServlet이 컨트롤러의 요청 핸들러 메서드를 호출한다.
  3. 컨트롤러는 비즈니스 로직 처리를 호출하고 처리 결과를 받는다.
  4. 컨트롤러가 처리 결과를 모델로 설정하고, 뷰 이름을 반환한다.
  5. 반환된 뷰 이름을 받아 DispatcherServlet이 뷰 이름에 대응하는 뷰에 대해 화면 표시 처리를 의뢰한다.
  6. 클라이언트가 응답을 받고 브라우저에 화면이 표시된다.

그림을 보면 번거로운 처리는 스프링 MVC가 담당하기 때문에 실제로 우리가 작성하는 부분은 컨트롤러, 비즈니스 로직 처리, 뷰의 세 가지뿐인 것을 알 수 있다.

5-3-1 스프링 MVC 프로그램 만들기

1. 프로젝트 생성

2. 컨트롤러 생성

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의 줄임말로, 보통의 자바 객체다. 즉 어떤 클래스를 상속하는 등의 특별한 처리를 하지 않는 클래스로 생각하면 된다.

@Controller

클라이언트와 데이터 입출력을 제어하는 애플리케이션 레이어의 컨트롤러를 부여한다. 요청 핸들러 메서드의 반환값을 뷰 이름으로 하여 템플릿 엔진의 뷰가 응답 HTML을 생성한다.

@RequestMapping

컨트롤러의 요청 핸들러 메서드와 URL을 매핑하게 된다. @RequestMapping 어노테이션에는 여러 가지 속성을 지정할 수 있다.

속성기능 개요
value매핑할 URL 경로(path)를 지정
value는 처음의 /를 생략할 수 있다.
URL경로만 지정하는 경우에는 속성에서 value를 생략할 수 있다.
URL 경로를 여러 개 지정할 수 있다.
methodGET과 POST 등의 HTTP 메서드를 지정한다.
GET을 지정하는 경우에는 RequestMethod.GET을 사용한다.
POST를 사용하는 경우에는 RequestMethod.POST를 사용한다.
HTTP 메서드를 여러 개 지정할 수 있다.
클래스에 @RequestMapping을 부여하는 경우에는 지정할 수 없다.

@GetMapping

@RequestMapping의 GET 요청용 어노테이션이다. 이 어노테이션을 사용하는 것으로 작성 내용이 줄어들고 가독성이 높아진다. 속성으로는 @RequestMapping의 value 속성은 같지만, mehod 속성은 없다.

@PostMapping

@RequestMapping의 POST 요청용 어노테이션이 @PostMapping이다. 이 어노테이션을 사용하면 작성 내용이 줄어들고 가독성이 높아진다. 속성으로는 @RequestMapping의 value 속성은 같지만, method 속성은 없다.

3. URL 매핑

HelloViewController 클래스는 클래스에 @RequestMapping("hello") 어노테이션을 부여하고 요청 핸들러 메서드에 @GetMapping("view") 어노테이션을 부여했다. 이것으로 클라이언트가 URL로 GET 메서드를 보내면 HelloViewController 클래스의 helloView 메서드가 호출된다.

4. 뷰 생성

스프링 부트의 프로젝트에서는 템플릿 엔진을 사용하는 경우 '뷰'를 두는 곳이 지정되어 다음과 같은 규칙을 지켜야 한다.

  • resources/templates 폴더 밑에 뷰를 생성한다.
  • 뷰가 많이 필요한 경우에는 기능별로 폴더를 만들어서 보관한다.
  • 폴더를 나눈 경우는 templates 폴더 이하의 폴더명을 요청 핸들러 메서드의 반환값에 지정해야 한다.
  • CSS나 자바스크립트 등은 resources/static 폴더에 배치한다.

5. 실행과 확인

profile
개발자 지망생. 일단 하고보자

0개의 댓글