추후 레거시 시스템 개선, 마이그레이션을 위해 Mybatis Legacy 프로젝트를 경험해보자.
세팅, 동작 원리가 더 중요하다 생각되어 사용 방법은 생략한다.
Mybatis 세팅 주의할점
plugins {
id 'java'
id 'org.springframework.boot' version '3.3.2'
id 'io.spring.dependency-management' version '1.1.6'
}
스프링 부트 3.3.2 버전에서 오류가 발생했다.
Invalid bean definition with name 'userProfileMapper' defined in file 생략 'factoryBeanObjectType': java.lang.String
상위 버전에서는 스프링 컨테이너에 빈 주입이 실패한다.
plugins {
id 'java'
id 'org.springframework.boot' version '3.1.4'
id 'io.spring.dependency-management' version '1.1.3'
}
위 버전으로 사용하자.
Mybatis 동작 원리
Mybatis 스프링 연동 모듈의 자동 처리 덕분에 매퍼 인터페이스는 실제 구현체 없이도 동작하며 그 과정은 다음과 같다.
1. 애플리케이션이 로딩될 때 Mybatis 스프링 연동 모듈은 @Mapper 어노테이션이 붙은 인터페이스를 탐색한다.
2. Mybatis 모듈이 런타임에 동적으로 해당 인터페이스 기반 프록시 구현체를 생성한다.(Dynamic Proxy) 이 구현체는 실제 SQL 매핑 작업을 수행하며, XML이나 어노테이션 기반으로 정의된 SQL을 실행한다.
3. 생성된 프록시 구현체는 스프링 컨테이너에 빈으로 등록되어 애플리케이션 내에서 주입되어 사용될 수 있다. 이를 통해 개발자는 인터페이스만 정의하면, Mybatis가 자동으로 실제 구현체를 만들어준다.
해당 구현체의 역할
- Mybatis에서 발생하는 다양한 예외들을 스프링의 예외 추상화 계층(DataAccessException)으로 변환하여 처리한다.
- Mybatis와 스프링의 트랜잭션 관리가 연동되어, Mybatis로 실행된 SQL도 스프링의 트랜잭션 범위 내에서 관리된다.
- Mybatis와 스프링의 데이터베이스 커넥션 관리가 통합되어, 커넥션 풀링 및 자원 관리가 스프링의 관리 하에 이루어진다.
프로젝트를 진행하면서 느낀 Mybatis의 단점
1. SQL 쿼리를 직접 작성해야한다, 반면에 Querydsl을 JPA와 같이 사용하면 컴파일 시점에 SQL 구문과 엔티티 필드의 타입이 체크되므로 타입 안정성이 보장된다.
2. XML, mapper로 설정파일을 관리하여 유지보수가 번거롭다.
'메모하는 습관 > 백엔드 스프링' 카테고리의 다른 글
캐싱 전략 (0) | 2024.11.11 |
---|---|
Redis 캐시 적용 해보기 (0) | 2024.09.11 |
낙관적락이 롤백되는 이유 (0) | 2024.09.11 |
SHA-256 핵심, 요약, java 구현, 결론 (0) | 2024.08.28 |
Patch 메서드가 멱등이 아닌 이유 (0) | 2024.04.29 |