15-M1. Service → Mapper: selectBy…()
MyBatis 경로에서는 서비스가 Mapper 인터페이스 메서드를 호출하고, 실제 실행은 MapperProxy가 가로채서 처리합니다.
즉 이 단계는 서비스의 메서드 호출이 SQL 실행 파이프라인으로 진입하는 첫 관문입니다.
이번 단계의 역할
Mapper 인터페이스는 선언만 있고 구현이 없습니다.
실제 구현은 MapperProxy가 담당하며, 서비스 호출을 MapperMethod.execute(...)로 연결합니다.
호출 흐름 요약
- 서비스가
mapper.select...()메서드를 호출합니다. MapperProxy.invoke(...)가 이 호출을 받습니다.- 프록시는
MapperMethod.execute(...)를 실행합니다. - 그 뒤부터는
SqlSession이 실제 SQL 실행을 담당합니다.
호출 흐름 다이어그램
sequenceDiagram
participant Service
participant Proxy as MapperProxy
participant Method as MapperMethod
participant Session as SqlSession
Service->>Proxy: mapper.selectOne(...)
Proxy->>Method: execute(sqlSession, args)
Method->>Session: selectOne(statement, param)
핵심 코드
// MapperProxy.java
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
return cachedInvoker(method).invoke(proxy, method, args, sqlSession);
}
// MapperMethod.java
public Object execute(SqlSession sqlSession, Object[] args) {
Object param = method.convertArgsToSqlCommandParam(args);
Object result = sqlSession.selectOne(command.getName(), param);
return result;
}
코드 해설
MyBatis는 Repository 구현체를 제공하는 대신, Mapper 인터페이스를 프록시로 감쌉니다.
그래서 서비스는 인터페이스 메서드를 호출하지만 실제로는 MapperProxy가 SQL 세션으로 위임합니다.
설계 의도
개발자는 SQL에 집중하면서도, 호출부에서는 일반 인터페이스 메서드처럼 사용할 수 있게 하기 위한 구조입니다. 즉 SQL 매퍼 패턴과 자바 인터페이스 호출 경험을 동시에 만족시키려는 설계입니다.
다음 단계 연결
다음 문서 15-M2에서는 SqlSession이 실제 DB 쿼리 실행으로 어떻게 내려가는지 봅니다.
← 이전: 15-J6. JpaRepository → Service | 다음: 15-M2. Mapper → DB