검색 기능
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
'예제를 만들자 뚱땅뚱땅' 카테고리의 다른 글
API 만들기 연습 #9 (0) | 2022.09.02 |
---|---|
API 만들기 연습 #8 추가 설계 (0) | 2022.09.01 |
API 만들기 연습 #6 유효성 검증 (0) | 2022.08.30 |
API 만들기 연습 #5 CustomException (0) | 2022.08.29 |
API 만들기 연습 #4 페이징 (0) | 2022.08.26 |