207. 플러그인 (plugins)

2012. 4. 19. 17:54공부/MYBATIS

마이바티스는 매핑된 구문이 실행되고 있는 특정 시점에 호출을 가로채는 것을 허용해. 기본적으로, 마이바티스는 다음과 같은 메소드 호출을 가로채기 위한 플러그인을 허용하지.

  • Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)
  • ParameterHandler (getParameterObject, setParameters)
  • ResultSetHandler (handleResultSets, handleOutputParameters)
  • StatementHandler (prepare, parameterize, batch, update, query)

이들 클래스 메소드들의 세부사항은 각각의 전체 메소드 특징들을 살펴봄으로써 찾을 수 있고, 가각의 마이바티스 릴리스에서 소스코드를 구할 수 있어. 네가 오버라이딩 하려는 메소드의 작동방식을 이해햐만 하고, 단지 호출을 모니터링 하는 것 이상의 무언가를 하고 있다는 것을 추정해야 해. 주어진 메소드의 작동방식을 오버라이드한다거나 수정하려 시도한다는 것은, 마이바티스 코어를 고장내는 것과 비슷해. 이것들은 저수준의 클래스와 메소드들이므로 플러그인 사용은 매우 조심스러워야 해.

그것들이 제공하는 능력이 주어진 플러그인을 사용하는 것은 매우 간단해. 간단히, 네가 인터셉트하고자 하는 특징을 반드시 기술하는 인터셉터 인터페이스를 구현해.

// ExamplePlugin.java
@Intercepts({@Signature(
  type= Executor.class,
  method = "update",
  args = {MappedStatement.class,Object.class})})
public class ExamplePlugin implements Interceptor {
  public Object intercept(Invocation invocation) throws Throwable {
    return invocation.proceed();
  }
  public Object plugin(Object target) {
    return Plugin.wrap(target, this);
  }
  public void setProperties(Properties properties) {
  }
}
<!-- mybatis-config.xml -->
<plugins>
  <plugin interceptor="org.mybatis.example.ExamplePlugin">
    <property name="someProperty" value="100"/>
  </plugin>
</plugins>

위의 플러그인은 매핑된 구문의 저수준 실행에 대한 책임이 있는 내부 객체인 Executor 인스턴스 상의 "update" 메소드에 대한 모든 호출을 인터셉트해.

NOTE 설정 클래스 오버라이딩

코어 마이바티스의 작동방식을 수정하는것 외에도, 설정클래스 전체를 오버라이딩할 수도 있어. 간단히 그걸 확장(extend)하고, 내부의 모든 메소드를 오버라이드하고, 그것을 SqlSessionFactoryBuilder.build(myConfig) 메소드를 호출하는 곳으로 전달해. 다시 이야기하지만, 이것은 마이바티스의 작동방식에 매우 심각한 영향을 줄 수 있으므로 주의해서 사용해.