홈 › 실무 확장 › 05 / 22

MyBatis 어노테이션 매퍼로 쿼리 연동

섹션 7진행 0 / 22

MyBatis 어노테이션 매퍼로 쿼리 연동

XML 매퍼 파일 없이 인터페이스에 @Select/@Insert/@Update/@Delete 를 붙여 SQL 을 선언하고, MyBatis 가 그 인터페이스의 구현체를 만들어 주는 방식을 이해합니다. #{} 와 ${} 의 차이, 세션 = 트랜잭션 생명주기, @Results/@ConstructorArgs 결과 매핑, <script> 와 Provider 두 가지 동적 SQL, BATCH executor 를 이용한 청크 정산까지 순수 자바 설정(H2 인메모리)으로 실행하며 익힙니다.

1. 왜 배우는가

이전 레슨(04 JDBC)에서 SimpleJdbc 헬퍼를 만들며 확인한 것이 있습니다. JDBC 코드의 80% 는 매번 같습니다. 커넥션 얻기, PreparedStatement 준비, ? 에 값 바인딩, ResultSet 을 객체로 옮기기, 자원 닫기. 진짜 다른 것은 SQL 문장과 결과를 받을 타입 두 가지뿐입니다. MyBatis 는 정확히 그 두 가지만 선언하게 하고 나머지를 전부 대신 합니다.

국내 실무에서 MyBatis 점유율은 압도적입니다. 금융·공공·대기업 SI 프로젝트의 대부분이 "Spring + MyBatis + Oracle" 조합이고, 그중 상당수가 XML 매퍼를 씁니다. 그런데 XML 매퍼는 SQL 이 자바 코드와 분리되어 있어 인터페이스 메서드와 XML id 를 오가며 읽어야 하고, 오타가 실행 시점에야 드러납니다.

어노테이션 매퍼는 SQL 이 메서드 바로 위에 있어 한눈에 읽히고, 리팩터링 도구가 메서드 이름 변경을 따라갑니다. 짧고 단순한 SQL 이 대부분인 서비스에서는 어노테이션이 훨씬 생산적이고, 복잡한 동적 SQL 은 Provider 클래스로 자바 코드로 짜면 XML 보다 테스트하기 쉽습니다.

이 레슨은 Spring 없이 MyBatis 코어만으로 진행합니다. 그래야 SqlSessionFactory → SqlSession → 매퍼 프록시 → 트랜잭션이라는 실체가 보입니다.

Spring 은 이 위에 SqlSessionTemplate 과 @Transactional 을 얹은 것이라(변형 4), 코어를 이해하면 Spring 설정의 각 줄이 무엇을 대신하는지 알게 됩니다. DB 는 H2 인메모리를 쓰고 jar 는 java-src/lib 에 있습니다.

Oracle 로 바꾸려면 드라이버 jar 와 URL, 그리고 MERGE/LIMIT 같은 방언 몇 곳만 손대면 됩니다.