Stay Hungry Stay Foolish

PROJECT/[스프링 부트] 게시판

[스프링 부트] 7. 게시판 만들기 수정 처리

dev스카이 2023. 10. 26. 15:05

01. 수정 버튼 생성

앞 장에서 했던 삭제 처리와 비슷하게 버튼을 클릭하여 수정할 수 있도록 만든다.

 

01-1. boardview.html에서 버튼을 추가

view 파일에 수정 버튼을 추가하고, thymeleaf를 통해서 선택한 게시물이 수정 페이지로 넘어가게 한다.

 

button일 때

<button th:onclick="|location.href='@{/board/modify/{id}(id=${article.id})}'|">수정하기</button>

a 태그일 때

<a th:href="@{/board/modify/{id}(id=${board.id})}">수정하기</a>

 

01-2. 수정 페이지 생성(boardmodify.html)

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>게시물 작성 폼</title>
</head>

<style>
    .layout {
        width : 500px;
        margin : 0 auto;
        margin-top : 40px;
    }
    .layout input {
        width : 100%;
        box-sizing : border-box;
    }
    .layout textarea {
        width : 100%;
        margin-top : 10px;
        min-height : 300px;
    }
</style>

<body>
    <div class="layout">
      <form action="/board/writedo" method="post">
        <input name="title" type="text">
        <textarea name="content"></textarea>
        <button type="submit">작성</button>
      </form>
    </div>
</body></html>

board > src > main > resource > templates 에 수정페이지를 만든다. (boardwrite와 같아서 코드를 복사/붙여넣기 함)

 

01-3. BoardController에서 url Mapping

• path variable

  • url을 이용해 파라미터 처리를 할 수 있다. Rest API 호출 시 주로 사용하게 된다.
  • @GetMapping path의 {변수} 괄호 안에 괄호 그레이스를 열어 URL에 사용될 변수 명을 입력한다.
    • GetMapping뿐만 아니라 다른 Method도 가능(PostMapping, DeleteMapping, PutMapping 등)
  • PathVariable 어노테이션을 이용해서 {템플릿 변수}와 동일한 이름을 갖는 파라미터를 추가하면 된다.

 

로직 : url이 들어왔을 때, {id} 부분이 @PathVariable에 인식이 돼서 Integer형태의 id로 들어온다.

 

실행하기

html 파일에서 생성했던 수정하기 버튼이 생겼고, 버튼을 클릭하면 /board/modify 페이지로 이동한 것을 볼 수 있다.

또한, 상세 페이지의 url은 ?id=3으로 되어 있지만, 수정 페이지의 url을 보면 3으로 되어 있다. 이는 @PathVariable를 사용해서 url이 깔끔하게 처리된 것이다.

 

02. 상세 페이지의 글이 수정 페이지에 그대로 넘어오도록 처리

수정 페이지에는 기존에 적혀있는 글에서 수정할 수 있어야 한다. 수정 버튼을 클릭하면 상세 페이지에 있던 글이 수정 페이지에도 넘어오게 한다. ( modify 파일에 기존 값이 넘어와야 한다.)

 

02-1. BoardController 수정(Model 추가)

 Model - JSP에 컨트롤러에서 생성된 데이터를 담아서 전달하는 역할을 하는 존재이다. Model 객체는 Controller 에서 생성된 데이터를 담아 View 로 전달할 때 사용하는 객체이다.

  • model.addAttribute(String name, Object value) : value 객체를 name 이름으로 추가함. 뷰 코드에서는 name으로 지정한 이름을 통해서 value를 사용함.

 

아래는 앞에서 작성했던 boardView 컨트롤러인데 boardModify 컨트롤러와 코드가 같다. 이는 상세 페이지의 내용이 수정 페이지에서도 같아야 하기 때문에 동일하게 작성해야 한다.

 

02-2. boardmodify.html 수정(thymeleaf 추가)

<!DOCTYPE html>
<html lang="en" xmlns:th="http://thymeleaf.org">
                        .
                        .
                        .
<body>
  <div class="layout">
    <form action="/board/writedo" method="post">
      <input name="title" type="text" th:value="${article.title}">
      <textarea name="content" th:text="${article.content}"></textarea>
      <button type="submit">수정</button>
    </form>
  </div>
</body></html>

• th:text 속성

  • Thymeleaf의 th:text 속성은 요소 의 텍스트 내용을 설정하는 데 사용된다.
  • 또한 이는 표준 HTML 텍스트 속성을 대체한다.
  • 따라서 제목, 단락, 레이블 등과 같은 텍스트 콘텐츠를 지원하는 모든 HTML 요소 내에 이를 넣을 수 있다.
  • 또한 이 속성을 사용하여 웹 페이지의 제목과 같은 동적 텍스트 콘텐츠를 표시할 수 있다.

 

• th:value 속성

  • 반면에 th:value 속성은 일반적으로 사용자의 입력이 필요한 요소의 값을 설정하는 데 사용된다 . 입력 필드, 확인란, 라디오 버튼, 드롭다운과 같은 요소가 이 범주에 속한다.
  • value 속성이 있는 모든 요소에서 표준 HTML value 속성 대신 이 속성을 사용할 수 있다 . 따라서 해당 특성을 지원하지 않는 요소(예: 단락)에 추가해도 아무런 효과가 없다.

• 추가로 버튼 이름도 '수정'으로 바꿔주었다.

 

참고 링크 ➜ https://www.baeldung.com/java-thymeleaf-text-vs-value

 

 

실행하기

실행 결과, '수정하기' 버튼을 클릭했더니 상세 페이지(/board/view?id=3)의 제목과 내용이 수정 페이지(/board/modify/3)에서도 동일하게 나오는 것을 볼 수 있다.

 

03. 수정 버튼을 클릭하면 글이 변경되도록 처리

 

03-1. boardmodify.html에서 <form> 태그 수정

	<form th:action="@{/board/update/{id}(id=${article.id})}" method="post">

타임리프를 걸고, 내용을 수정하면 수정 페이지로 이동하게끔 한다.

 

03-2. BoardController에서 url Mapping

지금까지 앞에서는 GetMapping을 썼는데 여기서는 왜 PostMapping을 사용할까?

 

@PostMapping은 HTTP Post Method에 해당하는 단축 표현으로 서버에 리소스를 등록(저장)할 때 사용한다.

  • POST 방식은 리소스를 생성 및 수정하기 위해 데이터를 보낼 때 주로 사용된다. 
  • POST 방식은 GET 방식과 다르게 Http Body에 리소스가 담겨 전송되기 때문에 데이터의 제한도 없고, 비교적 데이터 유출로부터 안전하다. 

@GetMapping 은 HTTP Get Method에 해당하는 단축 표현으로 서버의 리소스를 조회할 때 사용한다.

  • GET 방식은 클라이언트에서 서버로 어떠한 리소스로 부터 정보를 요청하기 위해 사용되는 메서드이다.
  • 같은 리소스로부터 정보를 요청하면 그 값은 동일한 결과를 받아오기 때문에 조회하는 데 자주 사용된다.
  • 대용량 데이터의 재조회를 막기 위해 첫 요청에 캐시를 해두고 재조회시 서버 요청 없이 캐시 된 데이터를 사용한다.
  • GET 방식은 쿼리스트링으로 전송되기 때문에 POST 방식과 달리 데이터의 길이가 제한되며, 보안에도 취약하다는 단점이 있다.

 

 

실행하기

3번 글의 제목과 내용을 변경하고 버튼을 누르니, 리스트 페이지로 넘어가고 제목이 변경됐다. 변경된 게시물을 선택하면 아래와 같이, 새로 작성한 내용들을 기존에 있던 내용에 덮어씌우고, 수정된 내용이 적용된 것을 볼 수 있다. 

 

수정된 게시물

 


※ IntelliJ 단축키

Shift를 두 번 연속해서 누르면 파일 이름, 설정, 필드 이름 등 다양하게 검색해서 원하는 걸 찾을 수 있다.