목록의 댓글 수를 위한 VIEW 생성하기
목록을 보여주는 쿼리문은
" SELCT ROWNUM NUM, N.* "
+ " FROM (SELECT * FROM NOTICE WHERE "+field+" LIKE? ORDER BY REGDATE DESC) N" + ")" +
"WHERE NUM BETWEEN ? AND? ";
에서 기본적인 데이터는 NOTICE입니다.
SELECT N.ID,N.TITLE, N.WRITER_ID , N.REGDATE, N.HIT, N.FILES, COUNT(C.ID) CMT_COUNT FROM NOTICE N
LEFT JOIN "COMMENT" C ON N.ID =C.NOTICE_ID
GROUP BY N.ID,N.TITLE, N.WRITER_ID , N.REGDATE, N.HIT, N.FILES
ORDER BY N.REGDATE DESC
새로운 쿼리문과 합치게 된다면 코드가 복잡해지므로
NOTICE_VIEW를 생성해 새로운 코드를 결과 집합으로 하는 VIEW로 사용할 생각입니다.
VIEW를 생성할때 정렬은 하지 않고 칼럼을 추가하는 수준만 하는 게 좋습니다.
CREATE VIEW NOTICE_VIEW
AS
SELECT N.ID,N.TITLE, N.WRITER_ID , N.REGDATE, N.HIT, N.FILES, COUNT(C.ID) CMT_COUNT FROM NOTICE N
LEFT JOIN "COMMENT" C ON N.ID =C.NOTICE_ID
GROUP BY N.ID,N.TITLE, N.WRITER_ID , N.REGDATE, N.HIT, N.FILES
VIEW를 생성했으니 기존 쿼리문에 적용시켜줍니다.
String sql = "SELECT * FROM(" +
" SELCT ROWNUM NUM, N.* "
+ " FROM (SELECT * FROM NOTICE_VIEW WHERE "+field+" LIKE ? ORDER BY REGDATE DESC) N" + ")" +
"WHERE NUM BETWEEN ? AND? ";
이제 새로운 컬럼인 CMT_COUNT가 추가됐습니다. 다만 서비스 함수에서는 새로 생긴 칼럼을 받을 수 있는 공간이 없기 때문에 추가를 해줘야 합니다. Notice에서 따로 칼럼을 받도록 추가하지 말고 Notice를 상속받는 클래스를 만들어줍니다.
package com.newlec.web.entity;
import java.util.Date;
public final class NoticeView extends Notice {
private int cmtCount;
public NoticeView() {
}
public NoticeView(int id, String title, String writerId, Date regdate, int hit, String files,int cmtCount) {
super(id, title, writerId, null, regdate, hit, files);
this.cmtCount = cmtCount;
}
public int getCmtCount() {
return cmtCount;
}
public void setCmtCount(int cmtCount) {
this.cmtCount = cmtCount;
}
}
이제는 컨트롤러에서 받는 데이터형식이 NoticeView이므로 service함수의 형식을 변경해줍니다.
public List<NoticeView> getNoticeList() {
return getNoticeList("title", "", 1);
}
public List<NoticeView> getNoticeList(int page) {
return getNoticeList("title", "", page);
}
public List<NoticeView> getNoticeList(String field, String query, int page) {
List<NoticeView> list = new ArrayList<NoticeView>();
이제 jsp에 적용을 시켜줘야합니다.
<c:forEach var="n" items="${list}">
<tr>
<td>${n.id}</td>
<td class="title indent text-align-left"><a
href="detail?id=${n.id}">${n.title}></a><span>${n.cmtCount}</span></td>
<td>${n.writerId}</td>
<td><fmt:formatDate pattern="yyyy-MM-dd hh:mm:ss"
value="${n.regdate}" /></td>
<td>${n.hit}</td>
</tr>
</c:forEach>
n.cmtCount로 글제목 옆에 댓글 수가 달리도록 합니다.
'웹 프로그래밍 기초 > 자바기반의 웹&앱 응용SW 개발자' 카테고리의 다른 글
자바기반의 웹&앱 응용 SW개발자 양성과정 49일차 -75 (0) | 2020.05.04 |
---|---|
자바기반의 웹&앱 응용 SW개발자 양성과정 48일차 -74 (0) | 2020.05.03 |
자바기반의 웹&앱 응용 SW개발자 양성과정 47일차 -71 (0) | 2020.05.02 |
자바기반의 웹&앱 응용 SW개발자 양성과정 46일차 -70 (0) | 2020.05.01 |
자바기반의 웹&앱 응용 SW개발자 양성과정 46일차 -69 (0) | 2020.05.01 |
댓글