GET /api/memos?keyword=테스트
GET /api/memos?status=ING&keyword=메모&page=1&size=5
status 필터, 페이지네이션 다음으로 keyword 조건을 추가했다.
패턴은 status 필터와 동일하고, XML 조건만 LIKE로 바뀐다.
SELECT ID as 'id'
, TITLE as 'title'
, CONTENT as 'content'
, STATUS as 'status'
FROM MEMO
WHERE DEL_YN = 'N'
AND (TITLE LIKE '%테스트%'
OR CONTENT LIKE '%테스트%')
ORDER BY ID
LIMIT 5 OFFSET 0;
%테스트% → 앞뒤에 뭐가 와도 '테스트'가 포함되면 매칭 (부분 일치)
status + keyword 함께 쓸 때:
SELECT ID, TITLE, CONTENT, STATUS
FROM MEMO
WHERE DEL_YN = 'N'
AND STATUS = 'ING'
AND (TITLE LIKE '%메모%'
OR CONTENT LIKE '%메모%')
ORDER BY ID
LIMIT 5 OFFSET 0;
기존 selectMemoList, selectMemoCount 둘 다 같은 조건 추가
<if test="keyword != null and keyword != ''">
AND (TITLE LIKE CONCAT('%', #{keyword}, '%')
OR CONTENT LIKE CONCAT('%', #{keyword}, '%'))
</if>
CONCAT('%', #{keyword}, '%') — SQL에 %를 직접 붙이지 않고 MyBatis에서 조합
목록·count 쿼리 WHERE 조건은 항상 동일하게 맞춘다
private String keyword;
// getter / setter
size, offset과 같은 역할public MemoPageVO selectMemoPage(String status, String keyword, int page, int size) {
MemoVO param = new MemoVO();
param.setStatus(status);
param.setKeyword(keyword);
param.setSize(size);
param.setOffset((page - 1) * size);
int total = memoMapper.selectMemoCount(param);
List<MemoVO> items = memoMapper.selectMemoList(param);
// ... MemoPageVO 반환
}
selectMemoPage에 keyword만 추가keyword를 param.setKeyword()로 Mapper에 전달@GetMapping
public MemoPageVO list(
@RequestParam(required = false) String status,
@RequestParam(required = false) String keyword,
@RequestParam(defaultValue = "1") int page,
@RequestParam(defaultValue = "5") int size
) {
return memoService.selectMemoPage(status, keyword, page, size);
}
GET http://localhost:8080/playground/api/memos?keyword=테스트
GET http://localhost:8080/playground/api/memos?keyword=테스트&page=1&size=5
GET http://localhost:8080/playground/api/memos?status=ING&keyword=메모&page=1&size=5
응답 형태는 페이지네이션과 동일:
{
"items": [ ... ],
"total": 3,
"page": 1,
"size": 5
}
GET /api/memos?keyword=테스트 → 제목/내용에 '테스트' 포함된 메모만 반환Controller: @RequestParam keyword
→ Service: param.setKeyword(keyword)
→ Mapper: selectMemoList(param) / selectMemoCount(param)
→ XML: keyword 있으면 TITLE LIKE ... OR CONTENT LIKE ...
→ DB
LIKE '%키워드%'<if test="keyword"> + LIKE (목록·count 둘 다)keywordparam.setKeyword(keyword)@RequestParam(required = false) String keywordGET .../api/memos?keyword=테스트@RequestParam 추가
→ Service param.setXxx()
→ XML <if test="xxx">
→ Postman 확인