[싱글이의 영수증] 검색하기

업데이트:

싱글이의 영수증 검색하기

Controller

게시글 목록에서 주소 조합작업을 통해 만들어진 URL을 통해 파라미터를 얻어온다.

검색된 게시글 페이징 처리를 위한 객체를 생성한 후 검색 조건에 맞는 게시글 수를 조회한다
검색 조건이 카테고리, 정렬, 검색 옵션, 검색어 총 4종류이기 때문에 동적sql을 이용해서 카테고리가 비어있지 않을때, 정렬이 비어있지 않을때, 검색어가 비어있지 않을 때로 나눠서 조건을 추가한다
게시글 수를 조회한 후 검색 조건에 맞는 게시글 목록을 조회한다.
목록 조회 마찬가지로 동적sql을 이용해 조건에 맞춰 sql을 조합한다.

@RequestMapping("search")
public String searchBoard(@RequestParam(value="cp", required=false, defaultValue ="1")  int cp,
            @RequestParam(value="sk",required = false) String sk, 
            @RequestParam(value="sv",required = false) String sv,
            @RequestParam(value="ct",required = false) String ct,
            @RequestParam(value="sort",required = false) String sort, 
            @ModelAttribute("rSearch") ReviewSearch rSearch,
            Model model) {
    
    
    rSearch.setSk(sk);
    rSearch.setSv(sv);
    rSearch.setCt(ct);
    rSearch.setSort(sort);
    
    ReviewPageInfo pInfo = service.getSearchPageInfo(rSearch,cp);
    
    
    List<Review> rList = service.selectSearchList(rSearch,pInfo);
    
    
    if(!rList.isEmpty()) {
        List<ReviewAttachment> thList = service.selectThumbnailList(rList);
        model.addAttribute("thList",thList);
    }
    
    model.addAttribute("rList",rList);
    model.addAttribute("pInfo",pInfo);
    model.addAttribute("rSearch",rSearch);
    
    
    return "review/reviewList";
}



  • 검색 조건이 포함된 페이징 정보 얻어오기

Service

ReviewPageInfo getSearchPageInfo(ReviewSearch rSearch, int cp);

ServiceImpl

@Override
public ReviewPageInfo getSearchPageInfo(ReviewSearch rSearch, int cp) {
    
    // 검색 조건에 맞는 게시글 수 조회
    int listCount = dao.getSearchListCount(rSearch);
    
    return new ReviewPageInfo(cp, listCount, '2');
}

DAO

public int getSearchListCount(ReviewSearch rSearch) {
  return sqlSession.selectOne("reviewMapper.getSearchListCount", rSearch);
}

Mapper

<select id="getSearchListCount" parameterType="ReviewSearch" 	resultType="_int">
  SELECT COUNT(*) FROM V_BOARD
  WHERE STATUS = 'N'
  AND BOARD_CD ='2'
  <!-- 넘어오는 값,, ct(카테고리), sk, sv , sort(정렬) -->
  <if test="ct != null">
    <choose>
      <when test="ct == 1">
        AND CATEGORY_CD = 21
      </when>
      <when test="ct== 2">
        AND CATEGORY_CD = 22
      </when>
      <when test="ct == 3">
        AND CATEGORY_CD = 23
      </when>
      <when test="ct == 4">
        AND CATEGORY_CD = 24
      </when>
    </choose>
  </if>

  <if test="sv != null">
    <bind name="val" value="'%' + sv + '%'" /> <!-- bind : 변수처럼 사용가능한 동적 sql -->
    <!-- '%' || #{sv} || '%' ->를 묵어서 val이라고 부르겠다. #{}제외, ||-> +로 변경 -->
    AND
    <choose>
      <when test="sk == 'title'">
        BOARD_TITLE like #{val}
      </when>
      <when test="sk == 'writer'">
        NICKNAME like #{val}
      </when>
      <when test="sk == 'titcont'">
        (BOARD_TITLE like #{val} OR BOARD_CONTENT like #{val})
      </when>
    </choose>
  </if>	

</select>



  • 검색된 게시글 목록 조회

Service

List<Review> selectSearchList(ReviewSearch rSearch, ReviewPageInfo pInfo);

ServiceImpl

@Override
public List<Review> selectSearchList(ReviewSearch rSearch, ReviewPageInfo pInfo) {
  return dao.selectSearchList(rSearch,pInfo);
}

DAO

public List<Review> selectSearchList(ReviewSearch rSearch, ReviewPageInfo pInfo) {
  
  int offset = (pInfo.getCurrentPage()-1) * pInfo.getLimit();
  
  RowBounds rowBounds = new RowBounds(offset, pInfo.getLimit());
  
  return sqlSession.selectList("reviewMapper.selectSearchList", rSearch, rowBounds);
}

Mapper

<select id="selectSearchList" parameterType="ReviewSearch" resultMap="review_rm">
  SELECT * FROM V_BOARD
  WHERE STATUS = 'N'
  AND BOARD_CD ='2'

  <!-- 넘어오는 값,, ct(카테고리), sk, sv , sort(정렬) -->
  <if test="ct != null">

    <choose>
      <when test="ct == 1">
        AND CATEGORY_CD = 21
      </when>
      <when test="ct== 2">
        AND CATEGORY_CD = 22
      </when>
      <when test="ct == 3">
        AND CATEGORY_CD = 23
      </when>
      <when test="ct == 4">
        AND CATEGORY_CD = 24
      </when>
    </choose>
  </if>


  <if test="sv != null">
    <bind name="val" value="'%' + sv + '%'" /> <!-- bind : 변수처럼 사용가능한 동적 sql -->
    <!-- '%' || #{sv} || '%' ->를 묵어서 val이라고 부르겠다. #{}제외, ||-> +로 변경 -->
    AND
    <choose>
      <when test="sk == 'title'">
        BOARD_TITLE like #{val}
      </when>

      <when test="sk == 'writer'">
        NICKNAME like #{val}
      </when>

      <when test="sk == 'titcont'">
        (BOARD_TITLE like #{val} OR BOARD_CONTENT like #{val})
      </when>
    </choose>
  </if>

  <if test="sort != null">
    <choose>
      <when test="sort == 'like'">
        ORDER BY LIKE_COUNT DESC, BOARD_NO DESC
      </when>
      <otherwise>
        ORDER BY BOARD_NO DESC
      </otherwise>
    </choose>
  </if>
  
  <if test="sort == null">
    ORDER BY BOARD_NO DESC
  </if>

</select>



  • 검색된 게시글 썸네일 조회

Service

List<ReviewAttachment> selectThumbnailList(List<Review> rList);

ServiceImpl

@Override
public List<ReviewAttachment> selectThumbnailList(List<Review> rList) {
  return dao.selectThumbnailList(rList);
}

DAO

public List<ReviewAttachment> selectThumbnailList(List<Review> rList) {
  return sqlSession.selectList("reviewMapper.selectThumbnailList",rList);
}

Mapper

<select id="selectThumbnailList" parameterType="list" resultMap="attachment_rm">
  SELECT * FROM BOARD_FILE
  WHERE FILE_LEVEL = 1
  AND PARENT_BOARD_NO IN
  <foreach collection="list" item="review" open="(" close=")"	separator=",">
    #{review.boardNo}
  </foreach>
</select>



댓글남기기