[Java] url param값으로 List 전송

Yeoonnii·2022년 11월 11일
0

Java

목록 보기
8/30
post-thumbnail
post-custom-banner

url param값으로 List를 전송하는 경우

프로젝트 진행시 게시판 페이지에 해시태그를 다중선택하여 게시글을 조회할 수 있는 기능을 구현하였다
해시태그는 1~12번으로 이루어진 12개의 고정된 값이며, 게시글과 해시태그는 1:N 관계를 가지고 있다


param값으로 해시태그 값을 넘겨받을 때 ArrayList<Long> hno을 이용하여 아래와 같은 url 형태로 값을 받아온다



사용자가 게시판 페이지를 최초로 접속하는 경우,
모든 해시태그의 게시글을 가져오는 것을 기본값으로 설정해 두었는데 url이 길어지는게 보기 좋지 않았다


url이 간략해지도록 로직을 변경해보았다

  1. hno의 기본값으로 해시태그에 사용되지 않는 0번을 param값으로 보내주고
  2. RestController에서 if hno = 0 인 경우
  3. DB에 조회될 hno값을 Long[] listHno = {1L,2L,3L,4L,5L,6L,7L,8L,9L,10L,11L,12L};으로 바꿔 조회되도록 하였다

📁 restcontroller/BoardRestController.java

@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;
    }

📁 mappers/boardMapper.xml

<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>
post-custom-banner

0개의 댓글