ReplyRepository 생성
package com.pure.blog.repository;
import org.springframework.data.jpa.repository.JpaRepository;
import com.pure.blog.model.Reply;
public interface ReplyRepository extends JpaRepository<Reply, Integer> {
}
Board 객체를 보면 이미 Reply를 필드에 가지고 있다.
package com.pure.blog.model;
import java.sql.Timestamp;
import java.util.List;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.Lob;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import org.hibernate.annotations.ColumnDefault;
import org.hibernate.annotations.CreationTimestamp;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Entity
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class Board {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY) //auto_increment
private int id;
@Column(nullable = false, length = 100)
private String title;
@Lob // 대용량 데이터
private String content; //섬머노트 라이브러리 <html>태그가 섞여서 디자인 됨.
@ColumnDefault("0")
private int count; // 조회수
@ManyToOne(fetch = FetchType.EAGER) //Many = Board, User = One // 한 명의 유저가 여러개의 보드 글을 쓸 수 있음. //EAGER가 기본. 무조건 들고와.
@JoinColumn(name="userId") //userId가 FK로 생성됨
private User user; // DB는 오브젝트를 저장할 수 없다. --> FK 사용. 하지만 자바는 오브젝트를 저장할 수 있다.
@OneToMany(mappedBy = "board", fetch = FetchType.EAGER) //하나의 게시글에 여러개의 댓글이 달릴 수 있음. / mappedBy --> 연관관계의 주인이 아님.(FK가 아님을 뜻함.) = DB에 컬럼을 만들지 말아라.
private List<Reply> replys;
@CreationTimestamp
private Timestamp createDate;
}
따라서 detail.jsp에 이미 board 객체를 넘겼기 때문에 바로 가져다 쓰면 된다.
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ include file="../layout/header.jsp"%>
<div class="container">
<div class="form-group">
글 번호 : <span id="id">${board.id }</span> <br> 작성자 : <span id="username">${board.user.username}</span>
</div>
<hr>
<div class="form-group">
<h3>${board.title }</h3>
</div>
<hr>
<div class="form-group">
<p>${board.content }</p>
</div>
<div class="d-flex justify-content-end">
<button class="btn btn-secondary" onclick="history.back()">뒤로가기</button>
<c:if test="${board.user.id == principal.user.id }">
<button class="btn btn-info" onclick="location.href='/board/${board.id}/updateForm'">수정</button>
<button id="btn-delete" class="btn btn-danger">삭제</button>
</c:if>
</div>
<hr>
<div class="card">
<div class="card-body">
<textarea class="form-control" rows="2"></textarea>
</div>
<div class="card-footer">
<button class="btn btn-primary">등록</button>
</div>
</div>
<br>
<br>
<div class="card">
<div class="card-header">댓글 리스트</div>
<ul id="reply--box" class="list-group">
<c:forEach var="reply" items="${board.replys }" varStatus="status">
<li id="reply--${status.count }" class="list-group-item d-flex justify-content-between">
<div>${reply.content}</div>
<div class="d-flex">
<div class="font-italic">작성자: ${reply.user.username} </div>
<button class="badge badge-dark">삭제</button>
</div>
</li>
</c:forEach>
</ul>
</div>
</div>
<script src="/js/board.js"></script>
<%@ include file="../layout/footer.jsp"%>
그런데 현재 Board 객체 설계는 무한참조를 일으킬 수 있음. (${reply.board} 하면 StackOverFlow 에러남)
Board안에 Reply가 있는데 Reply안에 Board가 또 있기 때문임.
Board의 Reply부분을 이렇게 바꾸면 해결.
@OneToMany(mappedBy = "board", fetch = FetchType.EAGER) //하나의 게시글에 여러개의 댓글이 달릴 수 있음. / mappedBy --> 연관관계의 주인이 아님.(FK가 아님을 뜻함.) = DB에 컬럼을 만들지 말아라.
@JsonIgnoreProperties({"board"})
@OrderBy("id desc")
private List<Reply> replys;
Board에서 getter로 reply를 읽어서 가져올 때 reply 안의 board는 무시한다는 뜻임.
OrderBy를 통해 최신 댓글이 위로 나오게 정렬.
'취업 준비 > Spring boot' 카테고리의 다른 글
41. 회원가입 시 중복 아이디 거르기 (0) | 2022.02.01 |
---|---|
40. 댓글 쓰기 (0) | 2022.01.31 |
38. 댓글 화면 디자인 (0) | 2022.01.31 |
37. 카카오 로그인 REST API 방식 (0) | 2022.01.31 |
36. 카카오 로그인 준비 (0) | 2022.01.29 |