Spring Boot

[ Spring Boot + JPA + Thymeleaf ] 게시판 만들기 - 2

현쥬스주스 2021. 2. 10. 14:57
  • 게시판 리스트 출력 기능

    - 우선 게시판의 기본적이 레이아웃 구성은 BootStrap에서 가져와서 사용하였습니다.

 

 

- BoardController.java

package com.example.myhome.controller;


import com.example.myhome.model.Board;
import com.example.myhome.repository.BoardRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;

import java.util.List;

@Controller
@RequestMapping("/board")
public class BoardController {

    @Autowired
    private BoardRepository boardRepository;


    @GetMapping("/list")
    public String list(Model model){
        List<Board> boards = boardRepository.findAll();
        model.addAttribute("boards", boards);
        return "board/list";
    }
}

 

 

- Board.java

package com.example.myhome.model;

import lombok.Data;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
@Data
public class Board {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String title;
    private String content;
}

 

id를 식별자로 사용하기 위하여 @id 애노테이션을 걸어두었고, 식별자를 할당하는 방법은 DB에 데이터를 Insert 하면 auto_incerement로 생성된 값을 식별자로 사용하도록 @GeneratedValue 애노테이션, GenerationType.IDENTITY 전략을 지정해 주었다. @Id 애노테이션이 지정되어 있지 않은 필드에 @GeneratedValue 애노테이션을 지정하게 되면 예외가 발생한다.

 

엔티티 매핑


JPA를 사용하는 데 가장 중요한 일은 엔티티와 테이블을 정확하게 매핑하는 것입니다.
따라서 매핑 어노테이션을 숙지하고 사용해야 합니다. JPA는 다양한 매핑 어노테이션을 지원하는데 크게 4가지로 분류할 수 있다.

 

객체와 테이블 매핑 @Entity, @Table
기본 키 매핑 @Id
필드와 컬럼 매핑 @Column
연관관계 매핑 @ManyToOne, @JoinColumn

JPA에서 사용할 엔티티 이름을 지정한다. 보통 기본값인 클래스 이름을 사용한다. 만약 다른 패키지에 이름이 같은 엔티티 클래스가 있다면 이름을 지정해서 충돌하지 않도록 해야 한다.

 

- BoardRepository

package com.example.myhome.repository;

import com.example.myhome.model.Board;
import org.springframework.data.jpa.repository.JpaRepository;

public interface BoardRepository extends JpaRepository<Board, Long> {

}

 

Board.java 에서 매핑해주었기 때문에 JpaRepository에서 사용 가능하다.

 

 

- list.html

<!doctype html>
<html xmlns:th="http://www.thymelef.org">
<head th:replace="fragments/common :: head('게시판')">
</head>
<body>
<nav class="navbar navbar-expand-md navbar-dark bg-dark fixed-top" th:replace="fragments/common :: menu('list')">
</nav>

<div class="container">
    <h2>게시판</h2>
    <div>총 건수 : <span th:text="${#lists.size(boards)}"></span></div>
    <table class="table">
        <thead>
        <tr>
            <th scope="col">번호</th>
            <th scope="col">제목</th>

        </tr>
        </thead>
        <tbody>
        <tr th:each="board : ${boards}">
            <th th:text="${board.id}">1</th>
            <td><a th:text="${board.title}" th:href="@{/board/form(id=${board.id})}" >Mark</a></td>

        </tr>
        </tbody>
    </table>
    <div class="text-right">
        <a type="button" class="btn btn-primary" th:href="@{/board/form}">글쓰기</a>
    </div>

</div>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta1/dist/js/bootstrap.bundle.min.js" integrity="sha384-ygbV9kiqUc6oa4msXn9868pTtWMgiQaeYH7/t7LECLbyPA2x65Kgf80OJFdroafW" crossorigin="anonymous"></script>
</body>
</html>

 

 

우선 가장 기본적인 게시판 리스트 출력 기능을 구현해보았다.

수동으로 데이터를 넣어놓고 해당 데이터들을 모두 뿌려주는것이다.

#lists.size()를 사용하여 총 데이터의 갯수를 뿌려주고

 

<tr> 태그에 th:each="board : boars" 구문을 넣어 boards객체에 있는 모든 데이터를 반복문으로 출력하는것이다.

 

다음시간에는 게시판의 CRUD 기능을 구현해볼것이다.

 

 

[실행결과 화면]