예제를 만들자 뚱땅뚱땅

API 만들기 연습 #7 검색

NEWDODORIPYO 2022. 8. 31. 09:10

검색 기능

ListDTO

package com.apiservice.model;

import lombok.Getter;
import lombok.ToString;

@ToString
@Getter
public class ListDTO{

   private int page;

   private int size;

   private String type; // 겁색 타입

   private String keyword; // 키워드

   public ListDTO(){
           this.page = 1; //page 는 기본이 1 page
           this.size = 10; // size 는 기본 10개
        }

   public void setPage(int page){

           this.page = page <= 0? 1:page;
   }

   public void setSize(int size){

           this.size = size < 10? 10:size;
   }

   public int getSkip(){

           return (this.page - 1) * size;
   }

   public String[] getTypes(){
       if (type == null){
           return new String[]{};
       }
       return type.split("");
   } // 조건이 없을때는 빈 배열을 리턴해준다

   public String getKeyword(){

       return keyword;
   } // 키워드는 없을수 없다

    public void setType(String type) {
        this.type = type;
    }

    public void setKeyword(String keyword) {
        this.keyword = keyword;
    }

}

ApiRepository.xml

<select id="selectList" resultType="com.apiservice.model.ApiVO">
        select member_number ,member_id , member_pw , member_name , member_phone , advert , update_date
        from api
        <where>
            <if test="keyword != null">
                <foreach collection="types" item="item">
                    <if test = 'item == "i"'>
                        member_id like concat('%',#{keyword} , '%')
                    </if>                
                </foreach>
            </if>
        </where>
        order by member_number desc
        limit #{skip},#{size}
    </select>
  • <keyword 가 null이 아닐 때 foreach가 돌 수 있게>
    • ⭐사용자가 만약 이렇게 입력하면???  “type=t&keyword=hi “
    • 키워드가 null 아니면  if 조건이 돌아간다 t로 들어왔기 때문에 t의 if문이 돌아가고 t는 title의 검색 조건이다 그렇기에 title의 검색조건 중 keyword 인 hi를 찾게 된다 
  • member_id를 type “i” 로 지정했다
  • concat 내용은 입력되는 keyword 앞 뒤에 어떤 내용이던 상광 없다 라는 ‘%’를 설정해준다
  • swagger-ui로 테스트해보면 데이터를 잘 가져온다 <분량상 테스트 정보는 생략>

이제 다른 조건들도 만들어 주자

<where>
            <if test="keyword != null">
                <foreach collection="types" item="item" separator="OR" open="(" close=")">
                    <if test = 'item == "i"'>
                        member_id like concat('%',#{keyword} , '%')
                    </if>
                    <if test='item =="n"'>
                        member_name like concat('%' , #{keyword} , '%')
                    </if>
                    <if test='item =="p"'>
                        member_phone like concat('%' , #{keyword} , '%')
                    </if>
                    <if test='item =="a"'>
                        advert like concat('%' , #{keyword} , '%')
                    </if>
                </foreach>
            </if>
        </where>
  • 복합 조건에는 or 필요하기에 separator="OR"를 설정해주고 open로 감싸주자
  • 1차 적으로 검색 조건 코드는 완성

ListDTO의 getKeyword 코드 수정

public String getKeyword(){

    return keyword == null? null:keyword.trim();
} // 키워드는 없을수 없다
  • keyword 가 null 이면 null 반환 null 이 아니면 trim 이 앞뒤 공백을 지워준다

ApiRepository.xml 코드 정리하기

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.apiservice.repository.ApiRepository">

    <sql id="search">
        <where>
            <if test="keyword != null">
                <foreach collection="types" item="item" separator="OR" open="(" close=")">
                    <if test = 'item == "i"'>
                        member_id like concat('%',#{keyword} , '%')
                    </if>
                    <if test='item =="n"'>
                        member_name like concat('%' , #{keyword} , '%')
                    </if>
                    <if test='item =="p"'>
                        member_phone like concat('%' , #{keyword} , '%')
                    </if>
                    <if test='item =="a"'>
                        advert like concat('%' , #{keyword} , '%')
                    </if>
                </foreach>
            </if>
        </where>

    </sql>

    <insert id="insert">
        insert into api(member_id , member_pw , member_name , member_phone , advert)
        values (#{memberId} , #{memberPw} , #{memberName} , #{memberPhone} , #{advert})
    </insert>


    <update id="update">
        update api
        set update_date  = now()
          <if test=" memberId != null and memberId != '' ">
          , member_id    = #{memberId}
          </if>
          <if test="memberPw != null and memberPw != '' ">
          , member_pw    = #{memberPw}
          </if>
          <if test="memberName != null and memberName != '' ">
          , member_name  = #{memberName}
          </if>
          <if test="memberPhone != null and memberPhone != '' ">
          , member_phone = #{memberPhone}
          </if>
          <if test="advert != null and advert != '' ">
          , advert       = #{advert}
          </if>
        where member_number = #{memberNumber}
    </update>

    <delete id="delete">
        delete
        from api
        where member_number = #{memberNumber}
    </delete>

    <select id="selectList" resultType="com.apiservice.model.ApiVO">
        select member_number ,member_id , member_pw , member_name , member_phone , advert , update_date
        from api
        <include refid="search"></include>
        order by member_number desc
        limit #{skip},#{size}
    </select>

    <select id="getTotal" resultType="int">
        select count (member_number) from api
        <include refid="search"></include>
    </select>

    <select id="getPk" resultType="com.apiservice.model.ApiVO">
        select member_number from api
        where member_number = #{memberNumber}
    </select>

    <select id="getId" resultType="com.apiservice.model.ApiVO">
        select member_id  from api
        where member_id = #{memberId}
    </select>

</mapper>
  • selectList와 getTotal 둘 다 검색에 대한 정보가 필요하기에 <sql>로 따로 만들고 <include> 해주었다

이로써 기본적인 CRUD 기능과 검색 기능을 가진 API 서버가 완성되었습니다

아직 데이터 검사나 에러 처리 등 미흡한 부분이 있지만 지금으로서는 최선을 다한 코드입니다 ㅠ

미흡한 부분이나 지적할 부분은 언제든지 댓글로 남겨주세요!!

 

코드는 여기서 확인해보세요 👇

git : https://github.com/kimdoyoun1993/ApiService/tree/main/src/main/java/com/apiservice