티스토리 뷰
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)' 사이를 이어주는 규격입니다.
- 쿼리 실행: selectList가 호출됩니다.
- 데이터 인출: DB에서 ID, NAME 컬럼 데이터를 가져옵니다.
- 리플렉션(Reflection): MyBatis가 DTO 클래스를 살펴보고, 컬럼 이름과 일치하는 필드(private String id; 등)를 찾아 Setter를 통해 값을 쏙쏙 집어넣습니다.
- 배달: 값이 꽉 찬 DTO(혹은 DTO 리스트)가 Service 계층으로 배달됩니다.
4. 최근의 변화: DAO 생략 (Mapper 인터페이스)
최근 스프링 프로젝트에서는 SqlSession을 직접 쓰는 DAO 클래스를 아예 만들지 않고, 인터페이스만 선언해서 사용하는 경우가 많습니다.
- Mapper 인터페이스 방식:이 경우 스프링이 내부적으로 DAO 역할을 하는 대리 객체(Proxy)를 자동으로 만들어주기 때문에 코드가 훨씬 간결해집니다.
-
Java
@Mapper // DAO 클래스 없이 인터페이스만 정의 public interface UserMapper { List<UserDTO> selectUserList(); // 메서드 이름이 XML의 id와 같아야 함 }
요약: 흐름 정리
- Service: "목록 가져와" (DAO 메서드 호출)
- DAO: "XML에 selectUserList라고 적힌 쿼리 실행해줘" (sqlSession.selectList 호출)
- MyBatis: 쿼리 실행 후 결과를 DTO에 담아서 List로 만듦
- 반환: 최종적으로 **List<UserDTO>**가 서비스에 전달됨
※ 해당 내용은 Google Gmini3.0에서 작성되었습니다.
'WEB > 자바' 카테고리의 다른 글
| 스프링부트가 실행될때 어떤순서로 불러오는지 궁금합니다. (0) | 2026.03.25 |
|---|---|
| DAO - selectUserList - xml 어느파일에 있는줄 알고 가져와요? (0) | 2026.03.25 |
| Dao dto를 사용하고 dao에서 selectList selectOne를 사용하는 경우는 jpa일까요? (1) | 2026.03.25 |
| Dao는 어떤경우에 쓰나요? (0) | 2026.03.25 |
| 자바 스프링 기반 웹 애플리케이션의 전체적인 동작 흐름 (0) | 2026.03.25 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 와이파이증폭기추천 #와이파이설치
- thymeleaf
- 정보처리기사 #정보처리기사요약 #정보처리기사요점정리
- 무료폰트 #무료웹폰트 #한수원한돋움 #한수원한울림 #한울림체 #한돋움체
- echart
- 좋은책 #밥프록터 #부의원리
- 자바스크립트break
- 자바스크립트정규표현식
- 자바스크립트 #javascript #math
- 파비콘 #파비콘 사이트에 적용
- 좋은책
- sw기술자평균임금 #2025년 sw기술자 평균임금
- iptime와이파이증폭기 #와이파이증폭기설치
- 쇼팬하우어 #좋은책
- jdk #jre
- SQL명령어 #SQL
- 광주분식 #광주분식맛집 #상추튀김 #상추튀김맛집 #광주상추튀김
- 연명의료결정제도 #사전연명의료의향서 #사전연명의료의향서등록기관 #광주사전연명의료의향서
- css미디어쿼리 #미디어쿼리 #mediaquery
- 테스크탑무선랜카드 #무선랜카드 #아이피타이무선랜카드 #a3000mini #무선랜카드추천
- jQuery #jQuery이미지슬라이드 #이미지슬라이드
- 자바스크립트countiue
- 썬크림 #닥터지썬크림 #내돈내산 #내돈내산썬크림 #썬크림추천 #spf50썬크림 #닥터지메디유브이울트라선
- lg그램pro #lg그램 #노트북 #노트북추천 #lg노트북
- // 사진직: 데이터가 없으면 DEFAULT_IMG 사용 const profileSrc = (d.img && d.img !== "") ? d.img : DEFAULT_IMG;('#user-photo').attr('src'
- 탭메뉴자바스크립트
- 증폭기 #아이피타임증폭기
- 파비콘사이즈
- ajax
- 바지락칼국수 #월곡동칼국수 #칼국수맛집
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
글 보관함

