[ Spring Boot + JPA + Thymeleaf ] 게시판 만들기 - 2
- 게시판 리스트 출력 기능
- 우선 게시판의 기본적이 레이아웃 구성은 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 기능을 구현해볼것이다.
[실행결과 화면]