본문 바로가기
웹 프로그래밍 기초/자바기반의 웹&앱 응용SW 개발자

자바기반의 웹&앱 응용 SW개발자 양성과정 48일차 -73

by oncerun 2020. 5. 3.
반응형

목록의 댓글 수를 위한 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로  글제목 옆에 댓글 수가 달리도록 합니다.

반응형

댓글