티스토리 뷰

WEB/자바

MyBatis 환경에서 DAO와 XML(Mapper)

silverline79 2026. 3. 25. 21:19

MyBatis 환경에서 DAO와 XML(Mapper)이 어떻게 실질적으로 연결되는지, 그리고 그 과정에서 DTO가 어떻게 활용되는지를 구체적인 메커니즘 위주로 설명해 드릴게요.

전통적인 방식에서는 SqlSession이라는 도구가 징검다리 역할을 합니다.


1. DAO와 XML의 매핑 구조

이 방식의 핵심은 **"DAO가 XML에 적힌 SQL의 ID를 호출하는 것"**입니다.

① XML 파일 (쿼리 정의서)

userMapper.xml 같은 파일에 SQL을 작성합니다. 여기서 가장 중요한 건 id와 resultType입니다.

XML
 
<mapper namespace="com.example.mapper.UserMapper">
    <select id="selectUserList" resultType="com.example.dto.UserDTO">
        SELECT id, name, email FROM users
    </select>
</mapper>

② DAO 클래스 (실행부)

DAO는 SqlSession을 주입받아 위에서 정의한 id를 호출합니다.

Java
 
@Repository
public class UserDAO {
    @Autowired
    private SqlSession sqlSession;

    public List<UserDTO> selectList() {
        // "네임스페이스.아이디" 형식으로 XML의 쿼리를 실행
        return sqlSession.selectList("com.example.mapper.UserMapper.selectUserList");
    }
}

2. selectList와 selectOne의 작동 원리

MyBatis가 내부적으로 데이터를 처리하는 방식은 매우 영리합니다.

  • selectList: 실행 결과가 여러 줄(Row)일 때 사용합니다. MyBatis는 DB에서 가져온 각 행을 하나하나 DTO 객체로 생성한 뒤, 이를 ArrayList에 담아서 반환합니다.
  • selectOne: 실행 결과가 딱 하나여야 할 때 사용합니다. 만약 결과가 2개 이상 나오면 에러(TooManyResultsException)를 뱉어내어 데이터 무결성을 체크해 주기도 합니다.

3. DTO는 여기서 어떤 역할을 하나요?

DTO는 DB의 **'표(Table)'**와 자바의 '객체(Object)' 사이를 이어주는 규격입니다.

  1. 쿼리 실행: selectList가 호출됩니다.
  2. 데이터 인출: DB에서 ID, NAME 컬럼 데이터를 가져옵니다.
  3. 리플렉션(Reflection): MyBatis가 DTO 클래스를 살펴보고, 컬럼 이름과 일치하는 필드(private String id; 등)를 찾아 Setter를 통해 값을 쏙쏙 집어넣습니다.
  4. 배달: 값이 꽉 찬 DTO(혹은 DTO 리스트)가 Service 계층으로 배달됩니다.

4. 최근의 변화: DAO 생략 (Mapper 인터페이스)

최근 스프링 프로젝트에서는 SqlSession을 직접 쓰는 DAO 클래스를 아예 만들지 않고, 인터페이스만 선언해서 사용하는 경우가 많습니다.

  • Mapper 인터페이스 방식:이 경우 스프링이 내부적으로 DAO 역할을 하는 대리 객체(Proxy)를 자동으로 만들어주기 때문에 코드가 훨씬 간결해집니다.
  • Java
     
    @Mapper // DAO 클래스 없이 인터페이스만 정의
    public interface UserMapper {
        List<UserDTO> selectUserList(); // 메서드 이름이 XML의 id와 같아야 함
    }
    

요약: 흐름 정리

  1. Service: "목록 가져와" (DAO 메서드 호출)
  2. DAO: "XML에 selectUserList라고 적힌 쿼리 실행해줘" (sqlSession.selectList 호출)
  3. MyBatis: 쿼리 실행 후 결과를 DTO에 담아서 List로 만듦
  4. 반환: 최종적으로 **List<UserDTO>**가 서비스에 전달됨

※ 해당 내용은 Google Gmini3.0에서 작성되었습니다.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG more
«   2026/03   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함