전체 흐름 요약
[심플 버전]
1. Mapper Interface (개발자가 호출)
↓
2. SqlSession (SQL 실행 추상화)
↓
3. JDBC Connection (DB와의 통신)
↓
4. DB SQL 실행 결과 → 매핑
[상세 버전]
[1] Controller에서 Mapper 호출
↓
[2] Mapper 인터페이스 (프록시 객체)
↓
[3] SqlSession.select() → MappedStatement 조회
↓
[4] JDBC Connection 획득 (DataSource에서)
↓
[5] PreparedStatement 생성 및 바인딩
↓
[6] SQL 실행 → ResultSet 획득
↓
[7] TypeHandler/ResultMap을 통해 Java 객체로 매핑
↓
[8] SqlSession이 Mapper에게 반환
Mapper Interface
- Java 코드에서 SQL 호출을 추상화한 인터페이스
- 내부적으로 MyBatis가 Proxy로 동작하여 Mapper XML의 SQL을 대신 실행함
- 개발자가 호출하는 시작점의 역할을 하고 실제 SQL은 호출 시점까지 실행되지 않음
SqlSession.getMapper(UserMapper.class)를 통해 동적 프록시 객체로 반환됨
SqlSession
- 실제 SQL을 실행하는 주체(JPA 구현체 Hibernate와 비슷한 역할 수행)
selectOne(), insert(), update() 등의 메서드를 제공
- 트랜잭션 처리, 커넥션 관리도 담당
- Mapper 인터페이스 메서드가 호출되면 SqlSession은 해당 메서드에 매핑된
MapperStatement(SQL)를 찾아 실행
- MapperStatement에는 SQL, 입력 파라미터, 결과 타입 등이 포함
SqlSessionFactory
- SqlSession을 생성하는 공장(factory) 역할
- 초기 설정 정보(환경, DataSource, MyBatis Config 등)를 바탕으로 내부 자원 초기화
JDBC
- MyBatis 내부에서 실제 DB에 SQL을 전달하고 결과를 가져오는 저수준 레이어
- PreparedStatement, ResultSet 등을 통해 SQL 실행
- MyBatis가 SqlSession 내부에서 JDBC API를 감싸서 사용