
이 글은 2026년 05월 14일 작성된 글입니다.
오늘은 MyBatis 기반 CRUD 기능 확장과
동적 SQL(Dynamic SQL), 정렬, 검색, 다중 삭제,
그리고 Mapper XML 분리와 회원 도메인 추가까지 진행했다.
int id = postService.create("제목 3", "내용 3");
생성 후 다시 조회해서 정상 저장 여부를 검증했다.
postService.createV2("제목 3", "내용 3");
int id = postService.getLastInsertId();
자동 증가된 PK를 기반으로 생성 데이터를 다시 조회할 수 있다.
postService.deleteById(1);
삭제 후 목록 개수를 검증하여 정상 동작 여부를 확인했다.
postService.update(1, "제목 1 수정", "내용 1 수정");
수정 후 다시 조회해서 변경 사항이 반영되었는지 확인했다.
List<Post> posts = postService.search("title", "제목");
제목 기반 검색과 부분 검색을 구현했다.
<if test="kwType == 'content'">
조건에 따라 SQL이 동적으로 변경되도록 처리했다.
| 태그 | 역할 |
|---|---|
<if> | 조건부 SQL |
<choose> | 분기 처리 |
<where> | WHERE 자동 처리 |
<set> | UPDATE 자동 처리 |
<foreach> | 반복 처리 |
WHERE title = #{title}
#{} 는 값 바인딩만 가능하다.
컬럼명이나 정렬 기준은 직접 바인딩할 수 없다.
postService.findAllOrdered("title", "asc");
기능을 구현했다.
createDate DATETIME(6)
now(6)
밀리세컨드까지 저장해서 더 정확한 최신순 정렬이 가능해졌다.
postService.update(1, "", "내용 수정");
빈 값은 제외하고 일부 데이터만 수정 가능하도록 처리했다.
<foreach collection="ids" item="id"
open="(" separator="," close=")">
#{id}
</foreach>
IN 절 기반 다중 삭제 기능을 구현했다.
foreach는 반복 기반 SQL 생성에 사용된다.
대표 사용처:
<set>
title = #{title},
content = #{content},
</set>
마지막 쉼표를 자동 제거해서 SQL 문법 오류를 방지할 수 있다.
mybatis:
mapper-locations: classpath:mybatis/mapper/**/*.xml
Mapper XML을 분리해서 SQL 관리 구조를 정리했다.
회원 기능 구조를 추가했다.
List<Member> members = memberService.findAll();
Member member = memberService.findById(1);
회원 다건 조회와 단건 조회 테스트를 구현했다.
foreach, set, where 태그를 활용하면 복잡한 SQL도 깔끔하게 처리할 수 있다.