우선 게시물이 등록된 시간을 판단하기 위해서는 reg_date라는 컬럼을 읽어야합니다.
사용자가 게시물 목록요청을 했을 때 DB로부터 읽어들인 목록 안에 들어있는 reg_date 컬럼을 읽습니다.
읽힌 reg_date 컬럼의 값과 현재시간을 읽은 후 둘의 차이를봐서 만약 그게 하루 미만이면 new마크를 붙히는 증표를남기고 3일 이내의 게시물에 처리한다면 3일 미만인지 시간차를 봐서 지정한 기간 내의 게시글이라면 new마크를 붙힐 수 있는 논리적 증거를 vo에 처리하고 화면쪽에서 그 증표를 보고 html로 new를 만들 지 안만들지를 구현합니다.
BoardVO에 newMark 필드 추가
public class BoardVO {
private Integer boardNo;
private String title;
private String content;
private String writer;
private Integer viewCnt;
/* 이하 set get메서드 생략 */
//////////////////////////////////////////////////////////////////////////////////////
/*new 마크 로직에 필요한 필드*/
private Date regDate;
private boolean newMark;
public boolean isNewMark() {
return newMark;
}
public void setNewMark(boolean newMark) {
this.newMark = newMark;
}
}
Service에서 추가 로직을 구현합니다.
@Override
public List<BoardVO> getArticleList(SearchVO search) {
List<BoardVO> list= mapper.getArticleList(search);
/* 이곳에 new 마크 추가 로직 구현 */
return list;
}
}
List를 불러올때 List<Board>VO list = mapper.getArticleList(search); 라인이 실행되면
값을 불러온 상태이므로 그 아래 return을 해주기 전에 추가 작업에 대한 로직을 구현해줍니다.
@Override
public List<BoardVO> getArticleList(SearchVO search) {
List<BoardVO> list= mapper.getArticleList(search);
for(BoardVO article : list) {
long now = System.currentTimeMillis();
Date regDate = article.getRegDate();
//long regTime = regDate.getTime();
long regTime = article.getRegDate().getTime();
if(now - regTime < 60*60*24*3*1000) {
article.setNewMark(true);
}
}
return list;
}
로직을 추가합니다.
List<BoardVO> list= mapper.getArticleList(search);
DB로부터 게시글정보 목록을 불러와서 컨트롤러에게 그 정보를 보내기 전에 시간판단을 해서 newMark에대한 설정을 만들어 놓고 컨트롤러에게 보냅니다.
1일 이내 신규글 newMark처리로직
for(BoardVO article : list) {
게시글에서 신규글인지를 하나씩 반복해서 파악 합니다.
현재 시간 읽어오기
long now = System.currentTimeMillis();
밀리초로 읽어들임(15억...*1000초) / currentTimeMillis()메서드는 반환타입이 long입니다.
Date regDate = article.getRegDate();
우선 article로부터 DB에 저장된 시간을 불러옵니다 이때 VO에 선언된 regDate는 date타입이며 날짜 객체형 입니다.
현재시간과 저장된 시간 둘중 하나를 같은 타입으로 맞춰줍니다.
long regTime = regDate.getTime();
getTime();메서드는 date클래스에서 제공하는 메서드 이며 1970년부터 현재시간까지의 시간으로 날짜데이터를 밀리초로 리턴해줍니다.
long regTime = article.getRegDate().getTime();
두 코드라인을 합쳐서 작성합니다.
if(now - regTime < 60*60*24*1000) {
60* 60* 24*1000은 3 1일 을 밀리초로 환산한 값입니다.
1일 : 60 * 60 * 24 *1000
3일 : 60 * 60 * 24 * 3 * 1000
3달 : 60 * 60 * 24 * 90 * 1000
각각 이렇게 구할수 있겠습니다.
즉, 현재시간에서 게시글이저장된 시간을 뺏을때 1일보다 작다면 등록한지 1일 미만이므로
article.setNewMark(true);
1일이내에 게시글이 등록되었다는 기준에 부합하므로 마크를 붙혀야 하며
VO 필드의 newMark를 트루로 초기화합니다.
return list;
이제 컨트롤러에게 이 new마크 처리가 완료된 객체를 보내면 컨트롤러가 그것을list.jsp에보내게 됩니다.
list.jsp 화면에서 받은 list객체의 newMark가 true이면 new마크를 붙히게 하고 false이면 출력하지 않도록 코드합니다.
list.jsp
<c:if test="${b.newMark}">
<span class="label label-red">new</span>
</c:if>
<c:if >문을 사용하는데 이때 조건식이 ${article.newMark == true} 라고 궂이 할 필요가 없습니다.
false이면 null이 되므로 el자체적으로 인식이 되지 않기 때문입니다.
이제 new마크는 if 조건식이 true일때 지정된 부트스트랩 클래스를 사용하여 표시하게 됩니다
'SpringFramework > Board게시판' 카테고리의 다른 글
미완성 [Transaction]게시물을 읽으면 조회수가 증가되는 로직 및 호출위치 (0) | 2020.09.08 |
---|---|
[미완성] 페이징 쪽나누기 (rowNum 쿼리 해설 완성) (0) | 2020.09.06 |