MyBatis와 MyBatis-Plus 소스 코드 읽기: SqlSession부터 플러그인 체인까지
기준 버전: MyBatis 3.5.x, MyBatis-Plus 3.5.x, Spring Boot 3, Java 17+.
1. 기본 실행 체인
Mapper proxy -> SqlSession -> Executor -> StatementHandler -> JDBC -> ResultSetHandler
SqlSession이 진입점이며, Executor는 조회, 업데이트, 트랜잭션 및 1단계 캐시를 담당하고, StatementHandler는 파라미터와 Statement를, ResultSetHandler는 결과 매핑을 담당합니다. MyBatis-Plus는 BaseMapper, Wrapper, 자동 채우기, 논리 삭제, 페이징 및 인터셉터를 추가하지만 JDBC 트랜잭션 제약을 변경하지는 않습니다.
2. 파라미터 바인딩
<select id="findByStatus" resultType="Order">
select * from orders where status = #{status}
</select>
문자열 치환은 화이트리스트로 지정한 테이블명, 컬럼명 및 정렬 필드에만 사용할 수 있으며, 사용자 입력을 SQL에 직접 이어 붙여서는 안 됩니다.
3. Executor와 캐시
SimpleExecutor는 매번 Statement를 생성하고, ReuseExecutor는 Statement를 재사용하며, BatchExecutor는 업데이트를 일괄 전송합니다. CachingExecutor는 namespace 단위 2단계 캐시를 처리합니다. 1단계 캐시는 SqlSession/Executor의 수명 주기 내에 존재하고, 2단계 캐시는 직렬화와 무효화 일관성이 필요하므로 기본적으로 Redis 캐시로 간주해서는 안 됩니다.
4. 플러그인 체인
페이징, 낙관적 락, 테넌트 및 데이터 권한은 플러그인 체인을 통해 실행됩니다. 플러그인 순서, 테넌트 조건, 페이징 및 논리 삭제는 통합 테스트로 검증해야 합니다. 논리 삭제는 데이터가 더 이상 증가하지 않는다는 뜻이 아닙니다. 업그레이드할 때는 고정된 버전의 소스 코드를 기준으로 합니다.