05장. MVC 모델 알아보기

박근수·2024년 3월 24일
0

스프링 북스터디

목록 보기
5/8

MVC 모델 알아보기

MVC 모델이란?

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

모델(Model:M)

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

  • 비즈니스 로직
    '시스템의 코어 부분' 혹은 '시스템의 목적을 처리하는 부분' 등으로 해석

비즈니스 로직을 회원가입과 비유하자면 사용자가 입력한 아이디의 중복 확인, 본인 인증, 비밀번호 규칙 확인 등이 필요할 것. 이 중에서 아이디 중복 확인의 비즈니스 로직을 생각해보면 사용자가 입력한 아이디 값을 메모리에 저장하고 회원 데이터베이스에서 같은아이디가 있는지 확인하고 중복 여부를 화면에 표시할 수 있게 전달하는 것 까지 비즈니스 로직이 됨.

뷰(View:V)

사용자가 입력과 결과 출력 등 시스템에서 표현 부분을 담당하여 애플리케이션에서는 주로 화면을 담당

컨트롤러(Controller:C)

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

MVC 모델의 개요와 이점

Model, Vied, Controller 세 종류로 분류함으로써 프로그램의 독립성이 높아지고 이점을 얻을 수 있음

이점

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

스프링 MVC 알아보기

스프링 MVC란?

웹 애플리케이션을 간단하게 만들 수 있는 기능을 제공하는 프레임워크
'프런트 컨틀롤러 패턴(Front Controller Pattern)'이란 디자인 패턴(Design Pattern)이라고하는 '이런 경우에는 이런 식으로 작성하면 좋다'라는 선인들의 지혜가 담긴 설계 패턴의 하나로, 모든 요청을 프론트 컨트롤러가 받아, 담당하는 컨트롤러에 적절하게 할당하는 설계

스프링 MVC의 주요 기능으로 화면 전환이나 사용자가 사용하는 브러우저와 서버 간의 입출력 데이터 전달을 단순화하는 등의 기능이 존재

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

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

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

스프링 MVC 사용해보기

스프링 MVC 프로그램 만들기

프로젝트 생성

의존 관계(Dependencies) 추가
  • Spring Boot DevTools
  • Thymeleaf
  • Spring Web

타임리프(Thymeleaf)란?

데이터와 미리 정의한 템플릿을 바인딩(묶어주는)해서 뷰에 표시할 때 도움을 주는 '템플릿 엔진'의 한 종류로, 스프링 부트에서 사용하기 용이함.

컨트롤러 생성

@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 경로를 여러 개 지정 가능
method- GET, POST 등의 HTTP 메서드 지정
- GET을 지정하는 경우에는 RequestMethod.GET 사용
- POST를 사용하는 경우네는 RequestMethod.POST 사용
- HTTP 메서드를 여러 개 지정 가능
- 클래스에 @RequestMapping을 부여하는 경우 지정 불가
value 속성 예
//value 속성에 처리 대상의 URL 경로를 매핑
@RequestMapping(value = "hello")

//value 속성만 지정하는 생략 가능
@RequestMapping("hello")

//URL 경로를 여러 개 지정 가능
@RequestMapping(value = {"hello", "helloSPring"})
method 속성의 예
//method에서 HTTP 메서드 'GET'을 지정
@ReuqestMapping(value = "hello", method = RequestMethod.GET)

//메서드를 여러 개 지정 가능
@ReuqestMapping(value = "hello", method = { RequestMethod.GET, RequestMethod.POST })
@GetMapping, @PostMapping

작성 내용이 줄어들고 가독성이 높아지며 속성으로는 @RequestMapping의 value와 같지만 method 속성은 없음.

@GetMapping, @PostMapping의 예
//value 속성만이라면 생략 가능
@GetMapping("hello")
@PostMapping("hello")

//URL을 여러 개 지정 가능
@GetMapping(value = { "hello", "helloSpring" })
@PostsMapping(value = { "hello", "helloSpring" })

URL 매핑

클라이언트가 URL(http://localhost:8080/hello/view)로 GET 메서드를 보내면 HelloViewController 클래스의 helloView 메서드가 호출

뷰 생성

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

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

처리 흐름

비즈니스 로직을 처리하는 부분은 없지만, 컨트롤러와 뷰만 만들어서 클라이언트가 요청한 URL에 대응해서 요청 핸들럼 메서드가 반환값을 뷰 이름을 돌려줌

profile
개발블로그

0개의 댓글