실무 프로젝트가 실제로 쓰는 형태의 MyBatis 를 다룹니다. SQL 을 XML 매퍼 파일에 두고
<resultMap>,<where>/<if>/<foreach>/<choose>/<bind>,<sql>/<include>,<collection>으로 조립하는 법, 시퀀스·ROWNUM·MERGE 같은 Oracle 문법을databaseId로 DB 별 분기하는 법, PageHelper 가 내부에서 하는 일을 30줄 인터셉터로 직접 구현해 보는 것, 그리고 Spring Boot 가 이 모든 설정을 어떻게 대신하는지까지. 실행 예제는 H2 의 Oracle 호환 모드에서 Oracle SQL 을 그대로 돌립니다.
이전 레슨(05)에서 어노테이션 매퍼로 MyBatis 의 실체를 배웠습니다. 그런데 실제 업무 프로젝트를 열어 보면 풍경이 다릅니다. 이 학습 사이트를 만든 개발 환경의 실무 프로젝트 하나를 조사한 결과가 이렇습니다.
Spring Boot 3.5 + Java 21 + Maven
MyBatis (mybatis-spring-boot-starter) — 어노테이션 매퍼 0개, XML 매퍼 84개
resources/mapper/{oracle | maria | tibero}/{모듈}/*.xml ← DB 방언별 XML 폴더
PageHelper (pagehelper-spring-boot-starter) 로 목록 페이징
Oracle ojdbc11 주력, Tibero, MariaDB 드라이버 동봉
Spring Batch 없이 @Scheduled 자체 스케줄러국내 SI·금융·공공 프로젝트의 표준 조합입니다. 어노테이션이 아닌 XML 을 쓰는 이유는 셋입니다. 첫째, SQL 이 수십 줄입니다. 조인 5개, 서브쿼리, CASE, 분석 함수가 들어간 리포트 SQL 을 자바 문자열에 넣으면 읽을 수 없습니다. 둘째, DBA 와 협업합니다.
DBA 는 자바를 모르지만 XML 안의 SQL 은 검토하고 튜닝할 수 있습니다. 셋째, DB 방언별 분기입니다. 같은 서비스가 Oracle 고객사와 MariaDB 고객사에 납품되면 SQL 파일만 폴더째 바꿔 끼웁니다.
이 레슨은 그 실무 형태를 폐쇄망 학습 PC 에서 그대로 재현합니다. Oracle 이 없으니 H2 의 Oracle 호환 모드(MODE=Oracle)를 씁니다.
NUMBER, VARCHAR2, 시퀀스, DUAL, ROWNUM, NVL, TO_CHAR, MERGE USING 이 그대로 동작하므로 실무 XML 의 SQL 을 거의 손대지 않고 실행할 수 있습니다.
PageHelper 와 Spring 은 jar 가 없으므로, PageHelper 는 원리를 직접 구현하고 Spring 은 설정 대응표로 다룹니다. 원리를 알면 라이브러리의 설정 한 줄이 무엇을 대신하는지 보이고, PageHelper 의 유명한 함정(다음 조회에 잘못 적용되는 페이징)이 왜 생기는지 이해할 수 있습니다.
코드는 java-src/extension/06_mybatis_xml 에 있습니다. 자바 파일 8개와 XML 3개, properties 1개입니다.