Deep Dive /Java Web /15-M4

15-M4. Mapper → Service: DTO / VO 반환

MyBatis는 ResultSetHandler가 만든 결과 객체를 다시 MapperMethod.execute(...) 반환값으로 내보내고, 최종적으로 서비스 계층이 이를 받습니다. 즉 SQL 결과가 다시 애플리케이션 코드에서 사용할 수 있는 DTO/VO로 돌아오는 단계입니다.


이번 단계의 역할 — 서비스가 ResultSet을 전혀 보지 않도록 반환 객체로 마무리한다

MyBatis 내부 결과 처리 결과를 서비스가 사용할 수 있는 반환 객체로 마무리하는 단계입니다. 이 구간이 끝나면 서비스는 JDBC나 ResultSet을 전혀 보지 않고 DTO/VO만 받게 됩니다.


호출 흐름 요약 — handleResultSets() 목록 반환 → selectOne() 단건 추출 → execute() 반환

  1. DefaultResultSetHandler.handleResultSets(...)가 결과 목록을 반환합니다.
  2. DefaultSqlSession.selectOne(...)이 단건 결과를 꺼냅니다.
  3. MapperMethod.execute(...)가 그 결과를 그대로 반환합니다.
  4. 서비스가 최종 DTO/VO를 받습니다.

호출 흐름 다이어그램 — DefaultResultSetHandler → DefaultSqlSession → MapperMethod → Service

sequenceDiagram participant RSH as DefaultResultSetHandler participant Session as DefaultSqlSession participant Method as MapperMethod participant Service RSH-->>Session: List<T> Session-->>Method: T Method-->>Service: DTO / VO

핵심 코드 — collapseSingleResultList()와 list.get(0)이 단건을 꺼낸다

// DefaultResultSetHandler.java
return collapseSingleResultList(multipleResults);
// DefaultSqlSession.java
if (list.size() == 1) {
    return list.get(0);
}
// MapperMethod.java
return result;

코드 해설 — 결과를 List로 모은 뒤 selectOne()이면 단일 객체로 꺼내 돌려준다

MyBatis는 SQL 결과를 List로 모은 뒤, selectOne()이라면 단일 객체로 꺼내 반환합니다. 그래서 서비스는 일반 메서드 반환값처럼 DTO/VO를 받게 됩니다.


설계 의도 — JDBC 자료구조가 아니라 애플리케이션 친화적인 객체로 마무리한다

SQL 실행 결과를 JDBC 자료구조가 아니라 애플리케이션 친화적인 객체로 마무리하기 위한 단계입니다. 이 덕분에 서비스는 데이터 접근 구현 세부를 몰라도 됩니다.


다음 단계 연결 — 16번 서비스 결과가 컨트롤러로 돌아오는 공통 흐름으로 이어진다

다음 문서 16번에서는 JPA/MyBatis 어느 경로를 탔든, 서비스 결과가 다시 컨트롤러로 돌아오는 공통 흐름을 봅니다.

← 이전: 15-M3. DB → Mapper | 다음: 16. Service → Controller