컨트롤러에서 특정 페이지로 리다이렉트하는 시점에서 사용자에게 메세지를 보여주는 기능 구현
- 메세지 처리용 DTO 생성
package com.study.common.dto;
import lombok.AllArgsConstructor;
import lombok.Getter;
import org.springframework.web.bind.annotation.RequestMethod;
import java.util.Map;
@Getter
@AllArgsConstructor
public class MessageDto {
private String message; // 사용자에게 전달할 메시지
private String redirectUri; // 리다이렉트 URI
private RequestMethod method; // HTTP 요청 메서드
private Map<String, Object> data; // 화면(View)으로 전달할 데이터(파라미터)
}
@AllArgsConstructor :
PostService 의 @RequiredArgsConstrouctor 와 마찬가지로 롬복 라이브러리에서 제공해주는 기능, 해당 어노테이션이 선언된 클래에서는 전체 멤버 변수를 필요로 하는 생성자가 생성된다.
@Message:
사용자에게 전달할 메세지
@redirectUri:
리다이렉트할 URI
method:
http요청 메소드, Request Method는 spring web 라이브러리에 포함된 enum(상수 처리용) 클래스 이다.
data:
html화면으로 전달할 파라미터, 페이지별로 전달할 파라미터의 개수는 랜덤하기 때문에 여러 데이터를 키- 값 형태로 담을 수 있는 map을 이용한다.
PostController 에 추가
// 사용자에게 메시지를 전달하고, 페이지를 리다이렉트 한다.
private String showMessageAndRedirect(final MessageDto params, Model model) {
model.addAttribute("params", params);
return "common/messageRedirect";
}
화면 추가 templates - common -messageRedirect.html
<!DOCTYPE html>
<html lang="ko" xmlns:th="http://www.thymeleaf.org">
<head th:replace="fragments/header :: main-head"></head>
<body>
<form th:if="${not #maps.isEmpty( params.data )}" id="redirectForm" th:action="${params.redirectUri}" th:method="${params.method}" style="display: none;">
<input th:each="key, status : ${params.data.keySet()}" type="hidden" th:name="${key}" th:value="${params.data.get(key)}" />
</form>
<script th:inline="javascript">
/* <![CDATA[ */
window.onload = () => {
const message = [[ ${params.message} ]];
if (message) {
alert(message);
}
const form = document.getElementById('redirectForm');
if (form) {
form.submit();
return false;
}
const redirectUri = [[ ${params.redirectUri} ]];
location.href = redirectUri;
}
/* ]]> */
</script>
</body>
</html>
form : MessageDto 에 map 타입으로 선언된 data를 순환해서 각 데이터의 키 - 값 을 hidden 타입의 input으로 추가한다.
th:if 조건을 통해 data가 비어있지 않은 경우에만 폼 엘리먼트를 그린다.
onload ()n 함수 : 컨트롤러에서 전달받은 message가 있는 경우 사용자에게 alert 메세지를 보여준다.
if(form)조건을 통해 html내에 폼 태그가 있는지 우선적으로 체크한다. 앞에서 map타입의 객체인 data가 비어있지 않은 경우에만 from 태그를 html에 그린다.
MessageDto 타입의 객체인 params의 data가 비어있지 않다면 redirectForm 컨트롤러로 submit하고 data가 비어있으면 redirectUri에 해당하는 주소로 이동한다. 즉 data의 유무에 따라 폼 데이터를 submit 할지 단순히 주소만 이동할지 결정된다.