Mapper 인터페이스 개념
Mapper 인터페이스
- Mapping 파일에 기재된 SQL을 호출하기 위한 인터페이스
- SQL을 호출하는 프로그램을 TypeSafe 하게 하기 위해 MyBatis3.x부터 등장
- Mapping 파일에 있는 SQL을 자바 인터페이스를 통해 호출할 수 있도록 해줌
Mapper 인터페이스를 사용하지 않았을 때
- SQL을 호출하는 프로그램은 SqlSession 의 메서드 아규먼트에 문자열로 네임스페이스+"."+SQLID로 지정해야 한다.
- 문자열로 지정하기 때문에 오타에 의한 버그, IDE에서 제공하는 code assist 사용 불가
Mapper 인터페이스를 사용할 경우
- UserMapper 인터페이스는 개발자가 작성한다.
- 패키지 이름 + "." + 인터페이스 이름 + "." + 메서드 이름이 네임스페이스 +"." + SQLID 가 되도록 네임스페이스와 SQL의 ID를 설정해야 한다.
- 네임스페이스 속성에는 패키지를 포함한 Mapper 인터페이스 이름
- SQL ID 에는 매핑하는 메서드 이름을 지정
Mapper 인터페이스 작성 및 설정
Mapper 인터페이스 작성
Mapping 파일 수정
DAO 클래스 수정
MapperFactoryBean의 설정
- MapperFactoryBean은 UserMapper을 구현하는 프락시 클래스를 생성하고 , 그것을 애플리케이션에 주입한다.
- 프락시는 런타임 시에 생성되므로 지정된 Mapper는 실제 구현 클래스가 아닌, 인터페이스여야만 한다.
- MapperFactoryBean은 sqlSessionFactory나 sqlSessionTemplate를 필요로 한다.
Mapper 인터페이스 사용 테스트
여러 개의 Mapper 인터페이스 설정
MapperScannerConfigurer의 사용
- MapperFactoryBean을 이용해 Mapper 인터페이스를 등록할 때 매퍼 인터페이스의 개수가 많아지게 되면 일일이 정의하는데 시간이 많이 걸림
- Mapper 인터페이스의 수가 많아지면 MapperScannerConfigurer를 이용하여 객체를 한 번에 등록하는 것이 편리
- 지정한 패키지 아래 모든 인터페이스가 Mapper 인터페이스로 간주되어 Mapper 인터페이스의 객체가 DI 컨테이너에 등록되는 것
MapperScannerConfigurer의 설정
- basePackage 속성에서 지정하는 것은 Mapper 인터페이스를 검색할 대상이 되는 Package
- myspring.user.dao 아래 인터페이스들은 모두 Mapper 인터페이스에 대응하여 Mapper 객체가 생성됨
- 예상하지 않은 다른 객체가 등록되어 오류 발생 가능성 있음
MapperScannerConfigurer의 테스트
에러발생
해결 - Marker 인터페이스와 Marker 어노테이션의 사용
- 검색의 대상이 되는 Package 아래의 인터페이스들 중에서 Mapper 로서 작성한 인터페이스로만 범위를 좁히려면 Marker 인터페이스와 Marker 어노테이션을 작성하여 MapperScannerConfigurere에 설정
MapperScannerConfigurer에 Maker 어노테이션 지정
- org.mybatis.spring.mapper.MapperScannerConfigurer 컴포넌트 스캔을 통하여 Mapper을 찾기 위한 설정
- basePackage : Mapper을 찾는 베이스 패키지
- annotationClass : Mapper를 지정하는 어노테이션 클래스
MapperScannerConfigurer의 재테스트