생각해보면 지금까지 진행한 내용중에 약간 이상한 부분이 있다.
ItemMapper 매퍼 인터페이스의 구현체가 없는데 어떻게 동작한 것일까?
ItemMapper 인터페이스
package hello.itemservice.repository.mybatis;
import hello.itemservice.domain.Item;
import hello.itemservice.repository.ItemSearchCond;
import hello.itemservice.repository.ItemUpdateDto;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
import java.util.Optional;
@Mapper
public interface ItemMapper {
void save(Item item);
void update(@Param("id") Long id, @Param("updateParam") ItemUpdateDto updateParam);
Optional<Item> findById(Long id);
List<Item> findAll(ItemSearchCond itemSearch);
}
이 부분은 MyBatis 스프링 연동 모듈에서 자동으로 처리해주는데 다음과 같다.
설정 원리
1. 애플리케이션 로딩 시점에 MyBatis 스프링 연동 모듈은 @Mapper 가 붙어있는 인터페이스를 조사한다.
2. 해당 인터페이스가 발견되면 동적 프록시 기술을 사용해서 ItemMapper 인터페이스의 구현체를
만든다.
3. 생성된 구현체를 스프링 빈으로 등록한다.
실제 동적 프록시 기술이 사용되었는지 간단히 확인해보자.
MyBatisItemRepository - 로그 추가
@Slf4j
@Repository
@RequiredArgsConstructor
public class MyBatisItemRepository implements ItemRepository {
private final ItemMapper itemMapper;
@Override
public Item save(Item item) {
log.info("itemMapper class={}", itemMapper.getClass());
itemMapper.save(item);
return item;
}
}
실행해서 주입 받은 ItemMapper 의 클래스를 출력해보자.
실행 결과
itemMapper class=class com.sun.proxy.$Proxy66
매퍼 구현체
● 마이바티스 스프링 연동 모듈이 만들어주는 ItemMapper 의 구현체 덕분에 인터페이스 만으로 편리하게 XML의 데이터를 찾아서 호출할 수 있다.
● 원래 마이바티스를 사용하려면 더 번잡한 코드를 거쳐야 하는데, 이런 부분을 인터페이스 하나로 매우 깔끔하고 편리하게 사용할 수 있다.
● 매퍼 구현체는 예외 변환까지 처리해준다. MyBatis에서 발생한 예외를 스프링 예외 추상화인 DataAccessException 에 맞게 변환해서 반환해준다. JdbcTemplate이 제공하는 예외 변환 기능을 여기서도 제공한다고 이해하면 된다.
정리
● 매퍼 구현체 덕분에 마이바티스를 스프링에 편리하게 통합해서 사용할 수 있다.
● 매퍼 구현체를 사용하면 스프링 예외 추상화도 함께 적용된다.
● 마이바티스 스프링 연동 모듈이 많은 부분을 자동으로 설정해주는데, 데이터베이스 커넥션, 트랜잭션과 관련된 기능도 마이바티스와 함께 연동하고, 동기화해준다.
참고
마이바티스 스프링 연동 모듈이 자동으로 등록해주는 부분은 MybatisAutoConfiguration 클래스를 참고하자.
출처 : 김영환 스프링 DB2 강의
'데이터 접근 기술 > MyBatis' 카테고리의 다른 글
MyBatis 기능 정리2 - 기타 기능 (0) | 2022.08.17 |
---|---|
MyBatis 기능 정리1 - 동적 쿼리 (0) | 2022.08.16 |
MyBatis 적용2 - 설정과 실행 (0) | 2022.08.16 |
MyBatis 적용1 - 기본 (0) | 2022.08.16 |
MyBatis 설정 (0) | 2022.08.16 |