티스토리 뷰
아주 날카로운 질문입니다! DAO가 수많은 XML 파일 중에서 정확히 어떤 파일의 어떤 쿼리를 실행해야 하는지 찾는 비결은 크게 두 가지 설정에 있습니다.
1. MyBatis 설정 파일(또는 Spring 설정)의 'Location' 지정
가장 먼저, 스프링 설정 파일(application.yml 또는 mybatis-config.xml)에서 MyBatis에게 **"XML 파일들은 이 폴더에 모여 있어"**라고 미리 알려줍니다.
- 예시 (application.yml):이렇게 설정하면 스프링이 시작될 때 해당 경로에 있는 모든 XML 파일을 다 읽어서 메모리에 올려둡니다.
-
YAML
mybatis: mapper-locations: classpath:/mappers/**/*.xml # mappers 폴더 안의 모든 xml을 다 읽어라!
2. Namespace(네임스페이스)와 ID의 조합
XML 파일이 여러 개일 때 이를 구분하는 '주소' 역할을 하는 것이 바로 **namespace**입니다.
① XML 파일 내부:
각 XML 파일 상단에는 중복되지 않는 고유한 이름표인 namespace를 붙입니다.
XML
<mapper namespace="UserMapper"> <select id="selectUserList" ...> SELECT * FROM users
</select>
</mapper>
② DAO에서 호출할 때:
DAO는 sqlSession을 부를 때 "이름표.쿼리ID" 형식을 사용합니다.
Java
// DAO 코드
public List<UserDTO> selectList() {
// "UserMapper라는 이름표를 가진 파일 안에서, selectUserList라는 ID를 가진 쿼리를 실행해!"
return sqlSession.selectList("UserMapper.selectUserList");
}
3. 만약 이름이 겹치면 어떻게 되나요?
- 파일 이름은 달라도 상관없습니다. (예: A_Mapper.xml, B_Mapper.xml)
- 하지만 **namespace**가 같고 그 안의 **id**까지 같으면, 스프링이 구동될 때 "어떤 쿼리를 써야 할지 모르겠다"며 에러를 발생시킵니다.
- 따라서 관례적으로 namespace는 해당 XML과 연결된 DAO의 패키지 경로를 포함한 풀네임을 써서 중복을 방지합니다. (예: com.example.dao.UserDAO)
4. 요즘 방식 (Mapper Interface)에서는 더 엄격합니다.
앞서 살짝 언급한 인터페이스 방식을 쓰면 연결이 더 자동화됩니다.
- 인터페이스의 패키지 경로와 XML의 namespace를 똑같이 맞춥니다.
- 인터페이스의 메서드명과 XML의 쿼리 id를 똑같이 맞춥니다.
이렇게 하면 DAO 클래스에서 sqlSession.selectList(...)라고 직접 타이핑하지 않아도, MyBatis가 "아, 이 메서드는 이 XML의 이 쿼리를 실행하라는 거구나!"라고 1:1로 매핑해 줍니다.
정리하자면: MyBatis는 1) 설정된 경로의 모든 XML을 다 읽어둔 뒤, 2) DAO가 요청한 '네임스페이스.ID'와 일치하는 쿼리를 찾아서 실행하는 것입니다!
※ 해당 내용은 Google Gmini3.0에서 작성되었습니다.
'WEB > 자바' 카테고리의 다른 글
| 어노테이션이 궁금합니다. (0) | 2026.03.25 |
|---|---|
| 스프링부트가 실행될때 어떤순서로 불러오는지 궁금합니다. (0) | 2026.03.25 |
| MyBatis 환경에서 DAO와 XML(Mapper) (0) | 2026.03.25 |
| Dao dto를 사용하고 dao에서 selectList selectOne를 사용하는 경우는 jpa일까요? (1) | 2026.03.25 |
| Dao는 어떤경우에 쓰나요? (0) | 2026.03.25 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 증폭기 #아이피타임증폭기
- iptime와이파이증폭기 #와이파이증폭기설치
- 연명의료결정제도 #사전연명의료의향서 #사전연명의료의향서등록기관 #광주사전연명의료의향서
- // 사진직: 데이터가 없으면 DEFAULT_IMG 사용 const profileSrc = (d.img && d.img !== "") ? d.img : DEFAULT_IMG;('#user-photo').attr('src'
- 좋은책
- jQuery #jQuery이미지슬라이드 #이미지슬라이드
- 자바스크립트break
- 좋은책 #밥프록터 #부의원리
- lg그램pro #lg그램 #노트북 #노트북추천 #lg노트북
- 정보처리기사 #정보처리기사요약 #정보처리기사요점정리
- 와이파이증폭기추천 #와이파이설치
- sw기술자평균임금 #2025년 sw기술자 평균임금
- 파비콘사이즈
- 파비콘 #파비콘 사이트에 적용
- jdk #jre
- echart
- 광주분식 #광주분식맛집 #상추튀김 #상추튀김맛집 #광주상추튀김
- 자바스크립트 #javascript #math
- css미디어쿼리 #미디어쿼리 #mediaquery
- ajax
- 탭메뉴자바스크립트
- thymeleaf
- 테스크탑무선랜카드 #무선랜카드 #아이피타이무선랜카드 #a3000mini #무선랜카드추천
- 무료폰트 #무료웹폰트 #한수원한돋움 #한수원한울림 #한울림체 #한돋움체
- 쇼팬하우어 #좋은책
- 바지락칼국수 #월곡동칼국수 #칼국수맛집
- SQL명령어 #SQL
- 자바스크립트countiue
- 썬크림 #닥터지썬크림 #내돈내산 #내돈내산썬크림 #썬크림추천 #spf50썬크림 #닥터지메디유브이울트라선
- 자바스크립트정규표현식
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
글 보관함

