본문 바로가기
🛠️ IT 실전 가이드 (SW 도구)

2026 스프링 부트 게시판 만들기 ⑤: 드디어 완결! 게시글 수정 및 삭제 기능 (CRUD 완성)

by 데브프리 2026. 6. 12.

안녕하세요, 여러분의 든든한 백엔드 길잡이 데브프리입니다.

 

길고 길었던 '스프링 부트 게시판 만들기' 시리즈가 드디어 오늘 대단원의 막을 내립니다. 지난 4탄에서는 목록에서 제목을 클릭하면 글의 내용을 볼 수 있는 '상세 보기 기능'까지 구현했죠.

👉 [이전 글 확인하기: 2026 스프링 부트 게시판 만들기 ④: 내용이 궁금해! 게시글 상세 보기 구현]
https://devlog-tech.tistory.com/entry/spring-boot-board-view-detail-thymeleaf

 

2026 스프링 부트 게시판 만들기 ④: 내용이 궁금해! 게시글 상세 보기 기능 구현

안녕하세요, 여러분의 든든한 백엔드 길잡이 데브프리입니다. 지난 3탄에서는 데이터베이스에 쌓여있는 글들을 꺼내어 웹 브라우저에 깔끔한 표(Table) 형태로 목록을 띄워주는 것까지 성공했습

devlog-tech.tistory.com

 

하지만 내가 쓴 글에 오타가 있거나 지우고 싶을 때 버튼이 없다면 너무 곤란하겠죠? 그래서 오늘은 가장 마지막 퍼즐인 수정(Update)과 삭제(Delete) 기능을 추가하여, 완벽한 CRUD(생성·조회·수정·삭제) 사이클을 완성해 보겠습니다.

 

어려운 환경 설정은 전혀 없습니다! 자, 가벼운 마음으로 마지막 코딩을 시작해 봅시다!

 

1. 삭제 기능 구현: 가장 쉬운 Delete!

삭제 기능은 구현하기 가장 간단합니다. 상세 보기 화면(boardview.html)에 '삭제' 버튼을 달아주고, 컨트롤러에서 그 버튼의 신호를 받아 DB에서 지워주기만 하면 됩니다.

① 상세 화면(HTML)에 삭제 버튼 추가하기

src > main > resources > templates > boardview.html 파일을 열고, 맨 아래에 있던 '목록으로 돌아가기' 버튼 옆에 삭제 버튼을 추가해 줍니다.

스프링 부트 타임리프 게시글 삭제 버튼
삭제할 때도 상세 보기와 마찬가지로 ?id=글번호 파라미터를 넘겨주어 어떤 글을 지울지 알려주어야 합니다.

HTML
 
<a href="/board/list" class="btn" style="background-color: #ddd;">목록으로 돌아가기</a>
<a th:href="@{/board/delete(id=${board.id})}" class="btn" style="background-color: #ff4d4d; color: white;">삭제하기</a>

② Controller에 삭제 기능 추가하기

이제 사용자가 삭제 버튼을 누르면 컨트롤러가 해당 ID의 글을 찾아 지우도록 명령을 내려야 합니다. BoardController.java 파일의 맨 밑에 아래 코드를 추가합니다.

Java
 
    // 5. 게시글을 삭제하는 역할
    @GetMapping("/board/delete")
    public String boardDelete(Long id) {
        
        // boardRepository의 deleteById 메서드를 사용하면 해당 ID의 데이터를 창고에서 완전히 지워줍니다!
        boardRepository.deleteById(id);
        
        return "redirect:/board/list"; // 삭제가 완료되면 다시 목록 화면으로 이동합니다.
    }

정말 간단하죠? 이것으로 삭제 기능은 완성입니다!

 

2. 수정 화면 만들기 (Modify)

수정 기능은 '글쓰기'와 거의 똑같습니다. 단지 빈칸이 아니라 기존에 적어두었던 제목과 내용이 채워져 있어야 한다는 점만 다릅니다.

① 상세 화면(HTML)에 수정 버튼 추가하기

조금 전 수정한 boardview.html의 버튼 영역에, 이번에는 '수정하기' 버튼을 마저 달아줍니다.

HTML
 
<a href="/board/list" class="btn" style="background-color: #ddd;">목록으로 돌아가기</a>
<a th:href="@{/board/modify(id=${board.id})}" class="btn" style="background-color: #00ED64;">수정하기</a> <a th:href="@{/board/delete(id=${board.id})}" class="btn" style="background-color: #ff4d4d; color: white;">삭제하기</a>

② Controller에 수정 화면 띄우기 기능 추가

수정 버튼을 누르면 기존 데이터를 바구니(Model)에 담아서 수정용 화면으로 보내주어야 합니다. BoardController.java에 아래 코드를 추가합니다.

Java
 
    // 6. 게시글 수정 화면을 보여주는 역할
    @GetMapping("/board/modify")
    public String boardModify(Long id, Model model) {
        
        // 기존 데이터를 가져와서 "board"라는 이름표로 담아줍니다 (상세보기와 원리가 같습니다)
        model.addAttribute("board", boardRepository.findById(id).get());
        
        return "boardmodify"; // boardmodify.html을 찾아가라!
    }

③ 수정용 화면(boardmodify.html) 생성하기

templates 폴더에 boardmodify.html 파일을 새로 만듭니다. 코드는 글쓰기 폼과 거의 똑같지만, th:value와 th:text를 이용해 기존 데이터를 채워 넣어 줍니다.

스프링 부트 타임리프 게시글 수정 폼
글을 수정할 때는 기존의 고유한 ID(글번호)를 반드시 함께 넘겨주어야 JPA가 새 글을 쓰지 않고 덮어쓰기를 진행합니다.

HTML
 
<!DOCTYPE html>
<html lang="ko" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>게시글 수정</title>
    <style>
        /* 글쓰기와 동일한 스타일 적용 */
        body { font-family: sans-serif; padding: 50px; }
        .layout { width: 500px; margin: 0 auto; }
        input, textarea { width: 100%; padding: 10px; margin-bottom: 15px; border: 1px solid #ccc; border-radius: 4px; }
        button { padding: 10px 20px; background-color: #00ED64; border: none; border-radius: 4px; font-weight: bold; cursor: pointer; color: black; }
    </style>
</head>
<body>
    <div class="layout">
        <h2>게시글 수정하기</h2>
        <form action="/board/update" method="post">
            <input type="hidden" name="id" th:value="${board.id}">
            
            <input type="text" name="title" th:value="${board.title}" required>
            
            <textarea name="content" rows="10" th:text="${board.content}" required></textarea>
            
            <button type="submit">수정완료</button>
        </form>
    </div>
</body>
</html>

 

3. 수정 완료 처리하기: JPA의 마법!

이제 폼에서 [수정완료] 버튼을 누르면 /board/update로 데이터가 넘어옵니다. 놀라운 사실은, JPA는 데이터베이스에 글을 저장할 때 사용하는 save() 메서드 하나로 '글쓰기'와 '수정하기'를 모두 처리한다는 것입니다!

 

데이터에 id 값이 없으면 새로운 글로 판단하여 Insert(생성)하고, 폼에서 숨겨진 값으로 id 값이 넘어오면 이미 존재하는 글로 판단하여 알아서 Update(덮어쓰기)를 해줍니다. 정말 마법 같지 않나요?

 

BoardController.java에 마지막 코드를 추가합니다.

스프링 부트 JPA 게시글 수정 save 메서드
JPA의 save 메서드는 ID 값의 유무에 따라 알아서 INSERT(생성)와 UPDATE(수정)를 구분하여 실행해 줍니다.

Java
 
    // 7. 수정한 데이터를 DB에 덮어씌우는 역할 (POST 방식)
    @PostMapping("/board/update")
    public String boardUpdate(Board board) {
        
        // HTML 폼에서 숨겨진 id 값이 넘어왔기 때문에, JPA가 새로운 글이 아니라 '기존 글 수정'으로 인식합니다.
        boardRepository.save(board);
        
        return "redirect:/board/list"; // 수정이 끝나면 다시 목록으로 이동!
    }

 

4. 최종 테스트! (CRUD 정복)

이제 모든 기능이 완성되었습니다! 서버를 켜고 게시판의 창조주가 되어 모든 기능을 마음껏 테스트해 봅시다.

  1. 메인 클래스를 실행합니다.
  2. http://localhost:8080/board/list에 접속합니다.
  3. 아무 글이나 클릭해서 상세 보기로 들어갑니다.
  4. [수정하기]를 눌러 제목에 "(수정됨)"이라고 적어보고 저장해 봅니다. 목록에 잘 반영되었나요?
  5. 다시 글을 클릭한 뒤, 과감하게 [삭제하기] 버튼을 눌러봅니다. 목록에서 그 글이 흔적도 없이 사라지는 것을 확인합니다!

스프링 부트 게시판 CRUD 최종 완성 화면
생성, 조회, 수정, 삭제(CRUD) 사이클이 오류 없이 완벽하게 동작하는 모습입니다.

 

🎊 시리즈를 마치며

여러분, 정말 고생 많으셨습니다! 1탄부터 5탄까지 이어진 대장정 끝에 드디어 우리 손으로 직접 '데이터가 살아 숨 쉬는 게시판'을 만들어냈습니다.

 

초반에 H2 콘솔 404 에러와 싸우며 답답했던 시간도 있었지만, 그 오류를 해결했던 경험이야말로 이 프로젝트를 진행하며 얻은 가장 큰 자산일 것입니다. 오늘 완성한 CRUD 기능은 인스타그램의 사진 올리기, 유튜브의 댓글 달기 등 세상 모든 웹/앱 서비스의 가장 뼈대가 되는 핵심 논리입니다.

 

이 기본기를 바탕으로 나중에는 예쁜 디자인(CSS)을 입히거나, 로그인을 해야만 글을 쓸 수 있는 보안 기능(Spring Security)을 추가해 보시는 것을 강력히 추천합니다.

 

지금까지 저의 '스프링 부트 게시판 만들기' 시리즈를 따라와 주셔서 진심으로 감사합니다. 언제나 에러 없는 평온한 코딩 생활 되시길 바라며, 저는 다음에도 실전에 꼭 필요한 유익한 튜토리얼로 돌아오겠습니다.

 

지금까지 데브프리였습니다! 감사합니다 🚀