[Spring] Uricomponents, 동적SQL

Posted by 신희준 on October 25, 2017


2017 - 10 - 25 (수)

  • UriComponentsBuilder
  • 동적 SQL

  • 코드로 배우는 스프링 웹프로젝트[구멍가게 코딩단 지음] 참조


    UriComponents


    URI를 작성할 때 도음을 주는 클래스이다. 이와함꼐 UriComponentsBuilder를 같이 사용한다.
    사용법을 보면 다음과 같다.

    public String makeQuery(int page){
    
    		UriComponents uriComponents =
    	            UriComponentsBuilder.newInstance()
    	            .queryParam("page", page)
    	            .queryParam("perPageNum", cri.getPerPageNum())
    	            .build();	            
    
    		return uriComponents.toUriString();
    	}
    

    makeQuery를 활용하여 페이지에 따른 게시글을 표시해준다.

    <c:forEach items="${list}" var="boardVO">
      <tr>
        <td>${boardVO.bno}</td>
        <td><a
          href='/board/readPage${pageMaker.makeQuery(pageMaker.cri.page) }&bno=${boardVO.bno}'>
            ${boardVO.title}</a></td>
        <td>${boardVO.writer}</td>
        <td><fmt:formatDate pattern="yyyy-MM-dd HH:mm"
            value="${boardVO.regdate}" /></td>
        <td><span class="badge bg-red">${boardVO.viewcnt }</span></td>
      </tr>
    
    </c:forEach>
    


    동적 SQL


    MyBatis는 Mapper를 활용하여 DB에 특정 쿼리문을 날린다.
    MyBatis는 내부적으로 몇개의 표현식을 가지고 있어서 상황에 따른 SQL 생성을 할 수 있다.
    이것을 동적 SQL 이라 한다.

    IF , CHOOSE , TRIM , FOREACH 를 활용한다.
    아래는 if를 사용한 예이다.

    <sql id="search">
     <if test="searchType != null" >
       <if test="searchType == 't'.toString()">
         and title like CONCAT('%', #{keyword}, '%')
       </if>
       <if test="searchType == 'c'.toString()">
         and content like CONCAT('%', #{keyword}, '%')
       </if>
       <if test="searchType == 'w'.toString()">
         and writer like CONCAT('%', #{keyword}, '%')
       </if>     
       <if test="searchType == 'tc'.toString()">
         and ( title like CONCAT('%', #{keyword}, '%') OR content like CONCAT('%', #{keyword}, '%'))
       </if>        
       <if test="searchType == 'cw'.toString()">
         and ( content like CONCAT('%', #{keyword}, '%') OR writer like CONCAT('%', #{keyword}, '%'))
       </if>        
       <if test="searchType == 'tcw'.toString()">
         and (   title like CONCAT('%', #{keyword}, '%')
               OR
                 content like CONCAT('%', #{keyword}, '%')
               OR
                 writer like CONCAT('%', #{keyword}, '%'))
       </if>              
     </if>  
    </sql>