이 글은 2026년 05월 14일 작성된 글입니다.

오늘은 MyBatis 기반 CRUD 기능 확장과
동적 SQL(Dynamic SQL), 정렬, 검색, 다중 삭제,
그리고 Mapper XML 분리와 회원 도메인 추가까지 진행했다.


1. 게시물 생성

int id = postService.create("제목 3", "내용 3");

생성 후 다시 조회해서 정상 저장 여부를 검증했다.


2. 게시물 생성 V2

postService.createV2("제목 3", "내용 3");

int id = postService.getLastInsertId();

자동 증가된 PK를 기반으로 생성 데이터를 다시 조회할 수 있다.


3. 게시물 삭제

postService.deleteById(1);

삭제 후 목록 개수를 검증하여 정상 동작 여부를 확인했다.


4. 게시물 수정

postService.update(1, "제목 1 수정", "내용 1 수정");

수정 후 다시 조회해서 변경 사항이 반영되었는지 확인했다.


5. 제목 검색

List<Post> posts = postService.search("title", "제목");

제목 기반 검색과 부분 검색을 구현했다.


6. 내용 검색과 동적 쿼리

<if test="kwType == 'content'">

조건에 따라 SQL이 동적으로 변경되도록 처리했다.


7. MyBatis 동적 SQL

태그역할
<if>조건부 SQL
<choose>분기 처리
<where>WHERE 자동 처리
<set>UPDATE 자동 처리
<foreach>반복 처리

8. #{} 특징

WHERE title = #{title}

#{} 는 값 바인딩만 가능하다.

컬럼명이나 정렬 기준은 직접 바인딩할 수 없다.


9. 게시물 정렬 기능

postService.findAllOrdered("title", "asc");
  • 제목 오름차순
  • 제목 내림차순
  • 생성일 기준 정렬

기능을 구현했다.


10. 생성일 정렬

createDate DATETIME(6)
now(6)

밀리세컨드까지 저장해서 더 정확한 최신순 정렬이 가능해졌다.


11. 수정 기능 동적 처리

postService.update(1, "", "내용 수정");

빈 값은 제외하고 일부 데이터만 수정 가능하도록 처리했다.


12. 다중 삭제

<foreach collection="ids" item="id"
         open="(" separator="," close=")">
    #{id}
</foreach>

IN 절 기반 다중 삭제 기능을 구현했다.


13. foreach 태그

foreach는 반복 기반 SQL 생성에 사용된다.

대표 사용처:

  • IN 절
  • Bulk Insert
  • 다중 삭제

14. set 태그

<set>
    title = #{title},
    content = #{content},
</set>

마지막 쉼표를 자동 제거해서 SQL 문법 오류를 방지할 수 있다.


15. Mapper XML 분리

mybatis:
  mapper-locations: classpath:mybatis/mapper/**/*.xml

Mapper XML을 분리해서 SQL 관리 구조를 정리했다.


16. 회원 도메인 추가

  • Member
  • MemberService
  • MemberMapper

회원 기능 구조를 추가했다.


17. 회원 조회 테스트

List<Member> members = memberService.findAll();
Member member = memberService.findById(1);

회원 다건 조회와 단건 조회 테스트를 구현했다.


✅ 정리

  • MyBatis 기반 CRUD 기능을 확장하면서 생성·수정·삭제·검색 흐름을 구현할 수 있었다.
  • 동적 SQL을 사용하면 조건에 따라 유연한 쿼리를 작성할 수 있다.
  • foreach, set, where 태그를 활용하면 복잡한 SQL도 깔끔하게 처리할 수 있다.
  • Mapper XML 분리를 통해 SQL 관리 구조를 더 명확하게 만들 수 있었다.
  • 회원 도메인과 조회 기능을 추가하면서 구조를 확장할 수 있었다.

0개의 댓글