프로젝트 20일차 / Mybatis 동적 SQL문
동적 SQL문을 활용해 검색 기능을 구현하려고 했는데
자꾸 무언가 문제가 일어났다.
<span id="searchBox">
<form id="frmSearch">
<select id="search">
<option value="member_code">회원코드</option>
<option value="member_name">이름</option>
<option value="mobile_no">핸드폰</option>
<option value="address">주소</option>
<option value="age">나이</option>
<option value="sex">성별</option>
</select>
<input type="text" id="keyword">
<button type="button" onClick="doSearch(1)">찾기</button>
</form>
</span>
셀렉트 박스에서 분류를 택하고
text 폼에 키워드를 입력해서 백으로 넘기면 DB에서 데이터를 찾아 프론트로 넘겨 화면에 출력을 해야한다.
그래서 SearchDto를 따로 만들고, 컨트롤러부터 매퍼까지 작성을 마쳤다.
그런데 자꾸 문제가 일어났다.
1. 프론트에서 검색 분류와 키워드를 입력해 백으로 넘기면 null 값으로 도착함
이것은 두 가지 방법으로 해결했다.
1) 주소값에 search와 keyword를 담아서 오기
/******************************** 검색으로 회원 조회 ********************************/
@ApiOperation(value="검색으로 회원 조회")
@GetMapping("/members/{search}/{keyword}/{pageNum}")
public ResponseDto SearchMember(@PathVariable int pageNum,
@PathVariable SearchDto searchDto) throws Exception {
그런데도 실행이 되지 않아 로그를 찍어보니 Dto에 정보가 담겨있지 않았다. (죄다 null)
그래서 파라미터를 searchDto에서 String Search, String Keyword로 바꾸고
Dto에 직접 주입해주었다.
/******************************** 검색으로 회원 조회 ********************************/
@ApiOperation(value="검색으로 회원 조회")
@GetMapping("/members/{search}/{keyword}/{pageNum}")
public ResponseDto SearchMember(@PathVariable int pageNum,
@PathVariable String search,
@PathVariable String keyword) throws Exception {
SearchDto searchDto = new SearchDto();
searchDto.setSearch(search);
searchDto.setKeyword(keyword);
log.info(searchDto.toString());
이렇게 하니 로그에 찍힌 DTO 값이 null 이 아닌 내가 입력한 값으로 잘 나왔다.
2. 동적 SQL문 문제
컨트롤러~매퍼까지 잘못 입력한게 없는 것 같은데 프론트로 도착하는 데이터를 보면 무언가 이상했다.
'민' 이 들어간 회원 이름을 검색했는데 도착한 데이터들을 보면 '민'이 들어가지 않은 회원의 이름도 보였다.
아무리 봐도 잘못한게 없는 것 같고,
이전 프로젝트 때에도 검색 기능을 문제없이 구현했던 터라 도대체 무엇이 문제일까 골똘히 생각했다.
생각을 하고, 검색을 해도 답을 찾지 못해 옆 자리 분께 여쭤보니 똑같은 문제로 골치 아팠다며 단번에 해결책을 주셨다....
그건 바로.. 사용하는 데이터베이스의 종류였다...
옆자리 분과 1차 프로젝트도 함께 하고 이번 파이널 프로젝트까지 함께 하게 됐는데,
그 분도 나와 같은 실수를 했던 것이었다....
1차 때 사용한 데이터베이스는 오라클이었고, 이번에는 MySQL을 사용하고 있기 때문에... ㅜㅜㅜ
-- 오라클
<select id="doSearch" parameterType="SearchDto" resultType="MemberDto">
select * from member
<where>
<if test="keyword != null and search != null">
${search} like '%'||#{keyword}||'%'
</if>
</where>
</select>
-- MySQL
<select id="doSearch" parameterType="SearchDto" resultType="MemberDto">
select * from member
<where>
<if test="keyword != null and search != null">
${search} like CONCAT('%',#{keyword},'%')
</if>
</where>
</select>
내가 생각해서 답을 찾는 것도 좋지만,
아무리 생각해봐도 답이 나오지 않으면 여기저기 물어보고 다니는 게 좋은 것 같다.