본문 바로가기
백엔드(Back-End)/Spring Boot

[sts4-Spring Boot] 11. Alert Message 메시지 전달

by 기딩 2023. 12. 5.
728x90

2023.12.05 - [백엔드(Back-End)/Spring Boot] - [sts4-Spring Boot] 10. 게시글 삭제하기

 

[sts4-Spring Boot] 10. 게시글 삭제하기

2023.12.05 - [백엔드(Back-End)/Spring Boot] - [sts4-Spring Boot] 09. 게시글 읽기/수정하기 [sts4-Spring Boot] 09. 게시글 읽기/수정하기 2023.12.04 - [백엔드(Back-End)/Spring Boot] - [sts4-Spring Boot] 08. List - 게시글 목록 보

silvow94.tistory.com

각 기능을 구현했는데, 이번 글에선 각 기능이 잘 작동하는지, 정상적인 접근인지 

메시지 창을 띄울 것이다~!

 

메인/자바 > com.board 패키지에 constant 패키지를 만들고 Enum 클래스를 만들자.

package com.board.constant;

public enum Method {
	GET, POST, PUT, PATCH, DELETE
	// put은 비동기화식으로 뿌려줄 때 새용
}

데이터 베이스에 저장할 때 사용 : GET, POST

댓글 처리 시 활용될 : PUT, PATCH, DELETE

 

유틸리티(utility)
여러 곳에서 공통적으로 사용하는 기능을 제공하는 도구/클래스

메세지는 여러 곳에서 사용되므로 util 패키지와 클래스를 만들자.

 

메인/자바 > com.board > util 패키지 생성 > UiUtils 클래스 생성

지워진 건 추후에 만들 패키지

 

 

@Controller를 이용하여 공통 컨트롤러를 생성하자.

메시지와 리다이렉트 관련 처리를 담당할 컨트롤러이다.

package com.board.util;

import java.util.Map;

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

import com.board.constant.Method;

@Controller
public class UiUtils {
	
	// 혹시 안 쓰일 수도 있으니 false
	public String showMessageWithRedirect(@RequestParam(value = "message", required = false) String message,
		@RequestParam(value = "redirectUri", required = false) String redirectUri,
		@RequestParam(value = "method", required = false) Method method,
		@RequestParam(value = "params", required = false) Map<String, Object> params,
		Model model) {
		
		model.addAttribute("message", message);
		model.addAttribute("redirectUri", redirectUri);
		model.addAttribute("method", method);
		model.addAttribute("params", params);
		
		return "utils/message-redirect";
	}
	
}

HTTP 요청에서 받을 파라미터 중 value의 이름을 타입(String, Method, Map...)으로 받고

Model 객체를 통해 메시지, 리다이렉트 URI, 메서드, 파라미터들을 모델에 추가한다.

정보가 담긴 모델을 이용하여 message-redirect 뷰를 반환

 

message

- 사용자에게 전달한 메세지

 

redirectUri 시나리오 계획

- 1. 게시글 작성

- 2. 게시글 등록이 완료되었습니다.

- 3. 게시글 리스트 페이지로 리다이렉트

 

method

- Method Enum 클래스에 선언한 HTTP 요청 메서드

 

params

- 화면(뷰)로 전달할 파라미터

- 키는 String 타입, 값은 Object 타입

- 요청에서 넘어온 여러 파라미터를 한 번에 받아 Map 형태로 처리 가능

- 파라미터의 개수는 페이지마다 변동되므로 Map 형태

 

model

- 화면(뷰)로 파라미터 전달하는 데 사용

 


html 을 처리해야 하니까

메인/리소스 > 디렉토리의 templates 패키지에 utils 폴더를 생성해서

message-redirect.html 생성하자.

/templates/board 폴더가 아니다!

 

<!DOCTYPE html>
<html lang="ko" xmlns:th="http://www.thymeleaf.org" xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout">
<head th:replace="board/fragments/header :: main-head"></head>

<body>
    <form th:if="${not #maps.isEmpty( params )}" name="dataForm" th:action="${redirectUri}" th:method="${method}" style="display: none;">
        <input th:each="key, status : ${params.keySet()}" type="hidden" th:name="${key}" th:value="${params.get(key)}" />
    </form>

    <script th:src="@{/scripts/common.js}"></script>

    <th:block layout:fragment="script">
        <script th:inline="javascript">
        /* <![CDATA[ */
            window.onload = function() {
                var message = /*[[ ${message} ]]*/ null;
                if (isEmpty(message) == false) {
                    alert(message);
                }

                var params = /*[[ ${params} ]]*/ null;
                if (isEmpty(params) == false) {
                    document.dataForm.submit();
                } else {
                    var redirectUri = /*[[ ${redirectUri} ]]*/ null;
                    location.href = redirectUri;
                }
            }
        /* ]]> */
        </script>
    </th:block>
</body>
</html>

 

<form>

- 컨트롤러에서 전달받은 4개의 파라미터 중 params가 비어있지 않으면, Map에 담긴 데이터 수만큼 hidden 타입의 <input> 태그를 추가 생성

- action 속성에는 리다이렉트 할 URI 지정하고, method 속성에는 HTTP 요청 메서드를 지정

 

자바스크립트

- 컨트롤러에서 전달받은 message 있으면 -> 사용자에게 alert 메시지

- 파라미터가 있으면 form을 컨트롤러로 submit

- 없으면, redirectUri 지정된 URI 호출


UiUtils 클래스를 상속하자

package com.board.controller;

@Controller
public class BoardController extends UiUtils {

 

try, catch문에 대해 각각 메세지를 사용자에게 전달하자.

@PostMapping(value ="/board/register.do")
public String registerBoard(final BoardDTO params, Model model) {
    try {
        boolean isRegistered = boardService.registerBoard(params);
        if (isRegistered == false) {
            return showMessageWithRedirect("게시글 등록에 실패하였습니다.", "/board/list.do", Method.GET, null, model);
        }
    } catch (DataAccessException e) {
//			e.printStackTrace();
        return showMessageWithRedirect("데이터베이스 처리 과정에 문제가 발생하였습니다.", "/board/list.do", Method.GET, null, model);
    } catch (Exception e) {
        return showMessageWithRedirect("시스템에 문제가 발생하였습니다.", "/board/list.do", Method.GET, null, model);
    }
    return showMessageWithRedirect("게시글 등록이 완료되었습니다.", "/board/list.do", Method.GET, null, model);
}

 

 

	@PostMapping(value = "/board/delete.do")
	public String deleteBoard(@RequestParam(value = "idx", required = false) Long idx, Model model) {
		if (idx == null) {
			return showMessageWithRedirect("올바르지 않은 접근입니다.", "/board/list.do", Method.GET, null, model);
		}
		
		try {
			boolean isDeleted = boardService.deleteBoard(idx);
			if (isDeleted == false) {
				return showMessageWithRedirect("게시글 삭제에 실패하였습니다.", "/board/list.do", Method.GET, null, model);
			}
		} catch (DataAccessException e) {
			return showMessageWithRedirect("데이터베이스 처리 과정에 문제가 발생하였습니다.", "/board/list.do", Method.GET, null, model);
		} catch (Exception e) {
			return showMessageWithRedirect("시스템에 문제가 발생하였습니다.", "/board/list.do", Method.GET, null, model);
		}
		return showMessageWithRedirect("게시글 삭제가 완료되었습니다.", "/board/list.do", Method.GET, null, model);
	}

그럼 각 상황에 대해 메시지와 리다이렉트 경로 등 UiUtils에 정의한 메서드에 맞게 매개변수를 넣는다.

 


 

728x90