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 |