프로젝트 진행시 게시판 페이지에 해시태그를 다중선택하여 게시글을 조회할 수 있는 기능을 구현하였다
해시태그는 1~12번으로 이루어진 12개의 고정된 값이며, 게시글과 해시태그는 1:N
관계를 가지고 있다
param값으로 해시태그 값을 넘겨받을 때 ArrayList<Long> hno
을 이용하여 아래와 같은 url 형태로 값을 받아온다
사용자가 게시판 페이지를 최초로 접속하는 경우,
모든 해시태그의 게시글을 가져오는 것을 기본값으로 설정해 두었는데 url이 길어지는게 보기 좋지 않았다
url이 간략해지도록 로직을 변경해보았다
- hno의 기본값으로 해시태그에 사용되지 않는 0번을 param값으로 보내주고
- RestController에서 if
hno = 0
인 경우- DB에 조회될 hno값을
Long[] listHno = {1L,2L,3L,4L,5L,6L,7L,8L,9L,10L,11L,12L};
으로 바꿔 조회되도록 하였다
@GetMapping(value = "/boardselectmain.json")
public Map<String, Object> boardselectmainGET(
@RequestParam(name = "hno", required = false) ArrayList<Long> hno,
@RequestParam(name = "page", defaultValue = "1") int page,
@RequestParam(name = "title", required = false) String title,
@RequestParam(name = "content", required = false) String content,
@RequestParam(name = "type", defaultValue = "1") int type,
HttpServletRequest request
){
Map<String , Object> map = new HashMap<>();
try {
Map<String , Object> map1 = new HashMap<>();
System.out.println("hno 가 0인가요? " + hno.get(0).equals(0L));
if(hno.get(0).equals(0L)){ // 전달받은 hno 가 0인 경우
System.out.println("hno는 0입니다!");
// list에 보내줄 전체 해시태그 번호
Long[] listHno = {1L,2L,3L,4L,5L,6L,7L,8L,9L,10L,11L,12L};
ArrayList<Long> listAll = new ArrayList<>(Arrays.asList(listHno));
map1.put("hno", listAll);
} else{ // 전달받은 hno가 0이 아닌 경우
System.out.println("hno는 0이 아닙니다!");
map1.put("hno", hno);
}
System.out.println("파라미터 HNO == > " + hno);
map1.put("page", page);
map1.put("title", title);
map1.put("content", content);
if(type == 1){ // 최신순
map1.put("type", " "); // XML로 값 전달 안해줌
} else if( type == 2 ) { // 조회수 순
map1.put("type", "B.HIT DESC,"); // B.HIT,
} else if( type == 3 ) { // 좋아요 순
map1.put("type", "R.LIKECOUNT DESC, "); // R.LIKECOUNT,
} else if( type == 4 ) { // 댓글수 순
map1.put("type", "RR.REPLYCOUNT DESC, "); // RR.REPLYCOUNT DESC,
}
// 검색결과 게시글 COUNT개수 구하기
Long count = bMapper.boardSelectCount(map1);
// 검색된 게시글 목록
List<BoardMainDTO> boardlist = bMapper.boardSelectMain(map1);
// 메인페이지 이미지 URL번호 가져오기
// System.out.println("boardlist.size() => " + boardlist.size());
for(int i=0; i<boardlist.size(); i++){
Long bno = boardlist.get(i).getBno();
Long imgno = bMapper.boardImageNoSelect(bno);
// 가져온 imgno로 imgurl 생성
String imgurl = request.getContextPath()
+ "/api/board/image?imgno=" + imgno;
boardlist.get(i).setImgurl(imgurl);
}
if(boardlist != null){
map.put("status", 200);
map.put("result", boardlist);
map.put("count", count);
}
} catch (Exception e) {
map.put("status", -1);
map.put("result", e.getMessage());
}
return map;
}
<select id="boardSelectMain" parameterType="map" resultType="com.example.dto.BoardMainDTO">
SELECT * FROM
(SELECT M.NICKNAME, R.LIKECOUNT, RR.REPLYCOUNT, B.BNO, B.CONTENT, B.HIT, B.REGDATE, B.TITLE, B.USERID, ROW_NUMBER() OVER (ORDER BY ${type} B.REGDATE DESC) ROWN FROM
(SELECT DISTINCT BNO
FROM HASHTAGMAPPING HM
<if test="hno != null">
WHERE HM.HNO IN (
<foreach collection="hno" item="tmp" separator = ", ">
#{tmp}
</foreach>
)
</if>
ORDER BY BNO DESC
) BM
INNER JOIN BOARD B ON BM.BNO = B.BNO
INNER JOIN MEMBER M ON M.USERID = B.USERID
INNER JOIN (SELECT BNO, COUNT(USERID) LIKECOUNT FROM LIKES GROUP BY BNO) R ON R.BNO = B.BNO
INNER JOIN (SELECT BNO, COUNT(RNO) REPLYCOUNT FROM REPLY GROUP BY BNO) RR ON RR.BNO = B.BNO
WHERE (B.TITLE LIKE '%' || #{title} || '%' OR B.CONTENT LIKE '%' || #{content} || '%')
)
WHERE ROWN BETWEEN #{page} AND #{page}+11 ORDER BY ROWN
</select>