백엔드/스프링 부트 3_자바 백엔드

2. MVC 패턴 이해와 실습

smallsilver_west 2024. 11. 30. 20:06

2.1 뷰 템플릿과 MVC 패턴

 

뷰 템플릿

화면을 담당하는 기술

웹 페이지(View)를 하나의 틀(Template)로 만들고 변수를 삽입해 다양한 페이지 제작 가능

스프링 부트 프로젝트 제작 시, Mustache 도구를 추가해 뷰 템플릿 제작 가능

 

MVC 패턴

뷰, 컨트롤러, 모델이 함께 작동할 때, 역할을 나눈 것을 의미

 

| 뷰: 화면을 담당하며 웹 페이지를 화면에 보여주는 역할

 

| 컨트롤러: 클라이언트의 요청에 따라 서버에서 처리하는 역할

 

| 모델: 데이터를 관리하는 역할

 

2.2 MVC 패턴을 활용해 뷰 템플릿 페이지 만들기

<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Document</title>
</head>
<body>
    <h1>Hello, SSE!</h1>
</body>
</html>

 

뷰 페이지 (VIEW): 변수 삽입

resources > templates에 mustache 파일 작성: 뷰 템플릿 페이지 작성

 

컨트롤러 (CONTROLLER): 뷰 페이지 반환

src > main > java > com.example.demo 내부에 controller 패키지 생성

 

1) controller 내부에 자바 클래스 파일 생성

2) 코드에 @Controller 선언하여 Controller 클래스 패키지 자동으로 임포트

3) 메서드 선언: 반환값으로 반환하려는 파일명 작성하되, 확장자는 제외

4) 메서드 앞에 @GetMapping( ) 추가, 괄호 안에 URL 주소 작성

 

컨트롤러에 모델 추가 (MODEL): 모델에 변수 등록

뷰 템플릿과 모델 함께 활용해 변수 이용 가능

 

Mustache

{{변수명}}을 사용해 뷰 템플릿 페이지에 변수 삽입

이때, @GetMapping이 선언된 메서드에 Model 타입 매개변수 model 추가 가능

public class FirstController {
    @GetMapping("/Hi")
    public String hello(Model model){
        model.addAttribute("username", "SSE");
        return "greetings";
    }
}

 

applications.properties

spring.mustache.prefix=classpath:/templates/
spring.mustache.suffix=.mustache
server.servlet.encoding.force = true

 

build.grade > dependencies

implementation 'org.springframework.boot:spring-boot-starter-mustache'

 

* 두 코드를 필수적으로 추가하지 않는 경우 404 에러 발생

 

2.3 MVC의 역할과 실행 흐름

 

실행 흐름

서버는 모델, 뷰, 컨트롤러가 유기적으로 역살을 분담해 클라이언트의 요청을 처리

 

/Hi 페이지 실행 흐름

클라이언트가 localhost:8080/hi 요청->서버 내부에서 컨트롤러가 요청을 받아 처리

 

1) @Controller 로 컨트롤러 클래스가 컨트롤러임을 선언

2) @GetMapping 으로 URL "/hi" 요청 받아 접수

3) 요청 받으면 @GetMapping 선언된 메서드 hello 수행

 

이때, Model 객체를 매개변수로 받고 메서드 내부에서 모델에서 사용할 변수 등록 (model.addAttribute("변수명","값"))

이후 메서드에서 뷰 템플릿 페이지 반환 하고 웹 브라우저로 전송

 

컨트롤러 URL 매핑

@Controller
public class FirstController {
    @GetMapping("/hi")
    public String hello(Model model) {
        model.addAttribute("username", "손");
        return "greetings";
    }

    @GetMapping("/bye")
    public String bye(Model model){
        model.addAttribute("name","손");
        return "bye";
    }
}

 

/bye 페이지 실행 흐름

localhost:8080/bye 요청 시 '{nickname}, see you later' 출력

단, 이때 FirstController는 그대로 사용

package com.example.firstproject.controller;

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

@Controller
public class FirstController {

    @GetMapping("/hi")
    public String niceToMeetYou(Model model){
        model.addAttribute("username", "dlng23");
        return "greetings";
    }

    @GetMapping("/bye") // 어노테이션 추가
    public String seeYouNext(Model model){ 
        model.addAttribute("username", "dlng23"); // model
        return "goodbye"; // view template
    }
}

 

goodbye.mustache

<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Document</title>
</head>
<body>
    <h1>{{username}}, see you later!</h1>
</body>
</html>

 

2.4 뷰 템플릿 페이지에 레이아웃 적용하기

 

레이아웃

화면에 요소를 배치하는 일

 

헤더-푸터 레이아웃

- 헤더: 내비게이션으로 사이트 안내

- 콘텐츠: 사용자가 볼 핵심 내용

- 푸터: 사이트 정보

 

헤더-푸터 적용하기

부트스트랩을 이용해 구성

<html lang = "en">
<head>
    <!-- Required meta tags -->
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">

    <!-- Bootstrap CSS -->
    <link href = "https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC" crossorigin="anonymous">

    <title>Hello, world!</title>
</head>
<body>
<!-- navigation -->

<!-- content -->
<h1>Hello, {{username}}</h1>

<!-- site info-->
<script src = "https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/js/bootstrap.bundle.min.js" integrity="sha384-MrcW6ZMFYlzcLA8Nl+NtUVF0sA7MsXsP1UyJoMp4YLEuNSfAP+JcXn/tWtIaxVXM" crossorigin="anonymous"></script>


</body>
</html>

 

페이지 템플릿화

페이지의 콘텐츠 영역을 제외하고 헤더와 푸터를 각각 {{>header}}, {{>footer}}로 변수화하여 처리

단, 사용하기 위해서는 헤더와 푸터 영역을 각각 발췌해 템플릿 파일로 templates 디렉토리에 저장

 

불러오기

템플릿화한 파일을 불러오기 위해서는 다음과 같은 경로 사용

{{>layouts/header}}

{{>layouts/footer}}

'백엔드 > 스프링 부트 3_자바 백엔드' 카테고리의 다른 글

9. CRUD와 SQL 쿼리 종합  (0) 2025.01.04
5. 게시글 읽기  (1) 2024.12.21
4. 롬복과 리팩터링  (0) 2024.12.21
3. 게시판 만들고 새 글 작성하기  (0) 2024.12.21
1. 스프링 부트 시작하기  (0) 2024.11.30