VS Code 에서 바로복사하면 예쁘게해주는지 이제 처음 알았음.. 코드블럭 안쓸래 이제
PostController 내용 추가
@Autowired
CommentService commentService;
@GetMapping("/Content")
public ModelAndView viewPost(HttpServletRequest request) {
String num = request.getParameter("num");
Post post = postService.getPost(num);
mav.setViewName("Post");
mav.addObject("post", post);
List<Comment> commentList = commentService.selectCommentByPostId(num);
mav.addObject("commentList", commentList);
System.out.println(post.getContents());
mav.addObject("status", "0");
return mav;
}
Autowired 에 댓글 서비스 추가해주고,
게시글을 보여주는 Content Method 에 commentList 를 받아서 넘길수있게 바꿔주었다.
그리고 Post 객체도
@Data
public class Post {
private String num;
private String title;
private String author;
private String contents;
private String date;
private String commentNum;
}
가져올때 한번에 가져오기위해 commentNum 을 추가해줌. (insert 시에 사용하지않지만 이후 join 에서 한번에 담아와서 list 시에 댓글 수도 같이 뿌릴 수 있음)
PostService 에는 아래와 같이 추가하였다.
@Autowired CommentDao commentDao;
@Transactional
public void deletePost(String num) throws IOException {
commentDao.deleteCommentByPostId(num);
postDao.deletePost(num);
}
Transactional 로 중간에 SQL이 안되더라도 원자성을 유지할 수 있게끔 해준다.
우선 comment를 지우고 이후 post를 지우게 해뒀음.
이후 mapper-post.xml 도 수정해준다.
<select id="selectTotalList" parameterType="int" resultType="com.example.post.model.Post">
SELECT t.*, c.commentNum
FROM TEST1 t
LEFT JOIN (
SELECT postid, COUNT(*) AS commentNum
FROM COMMENTS1
GROUP BY postid
) c ON t.num = c.postid
ORDER BY t.num DESC
OFFSET #{pageNum} ROWS FETCH NEXT 10 ROWS ONLY
</select>
<select id="selectList" parameterType="map" resultType="com.example.post.model.Post">
SELECT t.*, c.commentNum
FROM TEST1 t
LEFT JOIN (
SELECT postid, COUNT(*) AS commentNum
FROM COMMENTS1
GROUP BY postid
) c ON t.num = c.postid
<where>
<if test="sp.startDate != null and !sp.startDate.isEmpty()">
AND CONVERT(varchar, DATE, 23) BETWEEN #{sp.startDate} AND #{sp.endDate}
</if>
<if test="sp.searchWord != null and !sp.searchWord.isEmpty()">
AND ${sp.searchType} LIKE CONCAT('%', #{sp.searchWord}, '%')
</if>
</where>
ORDER BY num DESC
OFFSET #{pageNum} ROWS FETCH NEXT 10 ROWS ONLY
</select>
list 출력시 아래처럼 댓글 수도 같이 표현하고싶어서 게시글 리스트를 가져오는 SQL에 comment 테이블을 join 하여 같이 가지고 오게끔 바꾸었다.
그럼 jsp 를 수정하여 표시할수 있게끔 해본다.
List.jsp 에 게시글 list 작성 jstl 부분에 commentNum 값을 추가한다.
<table>
<tr>
<td>게시글번호</td><td>제목</td><td>작성자</td><td>날짜</td> <!-- 5개 -->
</tr>
<c:forEach items="${list}" var="post">
<tr>
<td>${post.num}</td><td><a href="${pageContext.request.contextPath}/Content?num=${post.num}">${post.title}
[${post.commentNum}]</a></td><td>${post.author}</td><td>${post.date}</td>
</tr>
</c:forEach>
</tr>
</table>
그리고 Post.jsp 에 댓글 작성 및 출력부분을 추가한다.
status==0 은 조회화면일 때를 나타냄 ( 수정일때 덧글내용이 나오면 안되니)
<c:choose>
<c:when test="${status == 0}">
<table>
<c:forEach items="${commentList}" var="comment">
<tr>
<td>${comment.author}</td>
<td>${comment.contents}</td>
<td>${comment.date}</td>
<td><a href="${pageContext.request.contextPath}/Comment/Delete?commentId=${comment.commentId}&postId=${post.num}">삭제</td>
</tr>
</c:forEach>
</table>
<form action="${pageContext.request.contextPath}/Comment/Write?num=${post.num}" method="post" accept-charset="utf-8">
<input type="text" id="author" name="author" placeholder="작성자">
<input type="text" id="contents" name="contents" placeholder="내용">
<input type="hidden" id="postId" name="postId" value="${post.num}">
<input type="submit" value="등록">
</form>
</c:when>
</c:choose>
내용도 대충이고 ui 도 대충이지만 아무튼 기능은 되니 우선 통과..
일단 댓글기능까지 완료하였다.
이후 JavaScript 나 비동기 통신을 활용한 것으로 바꿀지 모르겠지만 일단 여기까지