104. 매핑된 SQL Statements 살펴보기

2012. 4. 17. 15:32공부/MYBATIS

이제 SqlSession 이나 Mapper class에 의해 정확히 무엇이 실행되는지 궁금할겨. 이 주제는 Mapped SQL Statement의 하나의 큰 주제이고, 이 문서의 대부분에서 주요하게 다루어지지. 너에게 정확이 무엇이 수행되는지에 대한 아이디어를 주기위해 한 쌍의 예를 준비했어.

앞서 말했던 예제에서처럼, statement는 XML 혹은 Annotations로 정의될 수 있어. XML을 먼저 볼까. mybatis에 의해 제공되는 모든 특징은 mybatis를 수년에 걸쳐 인기있게 만든 XML기반 매핑 언어 사용으로 인식될 수 있어. 전에 mybatis를 사용해봤다면 그 개념이 친숙하겠지만, XML 매핑 문서는 수 많은 개선이 있었기에 좀 더 뒤에 그 개념이 명확해질 거야. 아래는이전에 얘기한 SQLSession 호출을 만족시키는 XML 기반 매핑 구문 예제야.

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.mybatis.example.BlogMapper">
  <select id="selectBlog" parameterType="int" resultType="Blog">
    select * from Blog where id = #{id}
  </select>
</mapper>

위의 간단한 예제가 많은 overhead처럼 보일지 모르지만, 실제로 이건 매우 단순해. 하나의 mapper XML 파일에는 네가 워하는 만큼 수 많은 매핑 구문을 정의할 수 있어. 그래서 XML헤더와 doctype 선언이 필요없는 큰 혜택을 누릴 수 있지. 파일의 나머지 부분은 꽤 쉽지. "org.mybatis.example.BlogMapper" 이라는 namespace에서, "selectBlog"의 매핑구문을 정의했고, 이것은 전체 이름인 "org.mybatis.example.BlogMapper.selectBlog"를 아래 예제처럼 호출할 수 있도록 해줘

Blog blog = (Blog) session.selectOne("org.mybatis.example.BlogMapper.selectBlog", 101);

이건 fully qualified 자바 클래스의 메쏘드를 호출하는 것과 비슷하지 않은가, 그리고 그 이유가 여기 있어. This name can be directly mapped to a Mapper class of the same name as the namespace, with a method that matches the name, parameter, and return type as the mapped select statement. 위에서 본대로 매우 간단하게 Mapper Interface에 대한 메쏘드를 호술할 수 있도록 해주지. 하지만 여기 또 다른 예제를 볼래

BlogMapper mapper = session.getMapper(BlogMapper.class);
Blog blog = mapper.selectBlog(101);

두번째 접근법은 많은 이점이 있어. 먼저 문자열 상수에 의존하지 않기에 더 안전하고, 다음으로 너의 IDE 툴이 코드완성기법을 제공한다면, 매핑된 SQL 구문을 사용하는 수고를 덜 수 있는겨.


 NOTE 네임스페이스

이전 버전의 mybatis에서 헷갈리고 도움안되는 네임스페이스는 선택의 문제였어.  하지만 이제는 필요하고, 긴 풀네임을 가진 구문을 구분하는 것 이상의 목적을 가지고 있어.

네임스페이스는 여기서 보듯 인터페이스 바인딩을 가능하게 하고, 네가 오늘날 사용할거라 생각지 않더라도, 넌 네 마음가짐을 바꾸기 위해서라도 여기에 있는 연습을 따라해야 해. 네임스페이스를 일단 한 번 써보면, 알맞은 자바 패키지 네임스페이스는 네 코드를 깔끔하게 하고, 길게보면 mybatis의 사용능력을 향상시킬거야.

네임 분석: 타이핑량을 줄이기 위해, MyBatis는 구문, 결과셋, 캐시 등의 모든 명명된 설정요소에 다음과 같은 이름분석규칙을 사용해.

  • 풀네임 (예를들면 “com.mypackage.MyMapper.selectAllThings” 과 같은 풀 패키지 네임) 은 직접 찾아지고, 찾아지면 바로 사용되어져.
  • 숏네임 (예를들면 “selectAllThings”) 은 분명한 녀석에 대한 참조로 사용되어져. 만약 2개 이상이 발견되면 (예를들면 “com.foo.selectAllThings" 와 "com.bar.selectAllThings”), short name이 모호하므로 에러리포트를 받게 될겨. 그럴 때에는 풀네임을 써야 해.

여기에 BlogMapper 와 같은 Mapper클레스에 한 가지 트릭이 있지. 매핑된 구문은 더이상 XML로 매핑될 필요가 없어. 대신 Java Annotation으로 사용될 수 있거든. 예를 들면, 상단의XML은 다음과 같이 대체될 수 있어.

package org.mybatis.example;
public interface BlogMapper {
  @Select("SELECT * FROM blog WHERE id = #{id}")
  Blog selectBlog(int id);
}

간단한 구문에서 annotation은 매우 깔끔하지만, 좀 더 복잡한 구문에서는 제한적이고 messier 해. 그러므로, 뭔가 복잡한걸 해야 한다면 XML 매핑 구문을 사용하는 것이 좋아. 무엇이 더 나은지 결정하는것은 전적으로 너나 너의 프로젝트 팀에 달려있어. 그리고 일관성있게 매핑구문을 정의하는 것이 중요해. 이 말은 한 방향으로 너의 접근법을 고집하지 말라는 거야. 쉽게 annotation 기반의 매핑구문을 XML로 변환할 수 있고, 그 반대 역시 가능하거든



출처 : http://www.mybatis.org/core/getting-started.html