2023.12.05 - [백엔드(Back-End)/Spring Boot] - [sts4-Spring Boot] 10. 게시글 삭제하기
각 기능을 구현했는데, 이번 글에선 각 기능이 잘 작동하는지, 정상적인 접근인지
메시지 창을 띄울 것이다~!
메인/자바 > 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에 정의한 메서드에 맞게 매개변수를 넣는다.
'백엔드(Back-End) > Spring Boot' 카테고리의 다른 글
[Spring Boot] 13. Searching 검색 기능(1) (0) | 2023.12.06 |
---|---|
[sts4-Spring Boot] 12. Paging 페이지 블록 및 페이지 이동하기 (0) | 2023.12.06 |
[sts4-Spring Boot] 10. 게시글 삭제하기 (0) | 2023.12.05 |
[sts4-Spring Boot] 09. 게시글 읽기/수정하기 (0) | 2023.12.05 |
[스프링부트] IoC, Di, 컨테이너 (0) | 2023.12.05 |