[Spring Boot/JPA] 게시판을 통해 MVC, CRUD 연습하기 2 - 등록
본문 바로가기

Web 개발/게시판 만들기

[Spring Boot/JPA] 게시판을 통해 MVC, CRUD 연습하기 2 - 등록

728x90
반응형

Spring Boot + H2 Database + JPA + Thymeleaf 을 활용해

간단한 게시판을 작성해보고자 합니다.

오늘 다룰 내용은 게시판 글 작성 기능입니다.

 

 

  글에 포함된 기초 개념

  • Get Mapping / Post Mapping 차이
  • Spring annotation - @Transactional

 

* 개발환경
Spring Boot : 2.4.3
Java 11
Thymeleaf 
Maven
War
Lombok

 

List.html에 글쓰기 버튼 추가

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<div id="contents">

	<a th:href="@{/write}">글쓰기</a>
    
    <table>
        <thead>
        <tr>
            <th class="one wide">번호</th>
            <th class="ten wide">글제목</th>
            <th class="two wide">작성자</th>
            <th class="three wide">작성일</th>
        </tr>
        </thead>

        <tbody>
        <!-- CONTENTS !-->
        <tr th:each="board, index : ${boardList}">
            <td>
                <span th:text="${index.index}"></span>
            </td>
            <td>
                <a th:href="@{'/list/' + ${board.id}}">
                    <span th:text="${board.title}"></span>
                </a>
            </td>
            <td>
                <span th:text="${board.writer}"></span>
            </td>
            <td>
                <span th:text="${#temporals.format(board.createdDate, 'yyyy-MM-dd HH:mm')}"></span>
            </td>
        </tr>
        </tbody>
    </table>
    
</div>

</body>
</html>

 

List.html에서 글쓰기 버튼 클릭 시, 이동할 페이지 작성

form을 통해 Post 방식으로 데이터 전달

이때, 추후에 로그인기능을 추가하기 위해서는 th:action으로 넘기거나, csrf token 을 넘긴다

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <form th:action="@{/write}" method="post">
        제목 : <input type="text" name="title"> <br>
        작성자 : <input type="text" name="writer"> <br>
        <textarea name="content"></textarea><br>

        <input type="submit" value="등록">
    </form>

</body>
</html>

 

Controller에 글 작성 관련 메소드 추가

list.html 에서 글쓰기 버튼 클릭 시, Get 방식으로 write.html 로 이동

write.html 에서 등록 버튼 클릭 시, Post 방식으로 오브젝트를 전달받아,

                                             전달받은 오브젝트를 저장 후 메인페이지로 이동

package com.example.demo.controller;

import com.example.demo.dto.BoardDto;
import com.example.demo.service.BoardService;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;

import java.util.List;

@Controller
public class BoardController {
    private BoardService boardService;

    public BoardController(BoardService boardService){
        this.boardService = boardService;
    }

    @GetMapping("/")
    public String list(Model model){
        List<BoardDto> boardDtoList = boardService.getBoardList();
        model.addAttribute("boardList", boardDtoList);
        return "list.html";
    }

    @GetMapping("/write")
    public String write(){
        return "write.html";
    }

    @PostMapping("/write")
    public String write(BoardDto dto) {
        boardService.savePost(dto);
        return "redirect:/";
    }
    
}

 

 

Service에 글 작성시, 저장할 메소드 추가

Spring의 @Transactional 어노테이션을 추가하여 하나의 단위로 실행되도록 작성 

package com.example.demo.service;

import com.example.demo.domain.entity.Board;
import com.example.demo.domain.repository.BoardRepository;
import com.example.demo.dto.BoardDto;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;

@Service
public class BoardService {

    private BoardRepository boardRepository;

    public BoardService(BoardRepository boardRepository){
        this.boardRepository = boardRepository;
    }

    @Transactional
    public void savePost(BoardDto boardDto){
        boardRepository.save(boardDto.toEntity()).getId();
    }

    @Transactional
    public List<BoardDto> getBoardList(){
        List<Board> boards = boardRepository.findAll();
        List<BoardDto> boardDtoList = new ArrayList<>();

        for(Board board : boards){
            BoardDto dto = BoardDto.builder()
                    .id(board.getId())
                    .title(board.getTitle())
                    .content(board.getContent())
                    .writer(board.getWriter())
                    .createdDate(board.getCreatedDate())
                    .build();

            boardDtoList.add(dto);
        }
        return boardDtoList;
    }
    
}

 

728x90
반응형