인라인 메소드 또는 어노테이션이 있는 메소드 앞 및 뒤에 실행되는 Hook 메소드 작성 및 실행

com.ibm.pdq.runtime.statement.Hook 인터페이스를 사용하여 인라인 메소드 또는 어노테이션이 있는 메소드 앞 및 뒤에 실행되는 메소드를 작성할 수 있습니다.
어노테이션이 있는 인터페이스의 생성된 구현 또는 인라인 메소드에서 사용되는 Data 오브젝트에 등록된 Hook가 있는 경우, 애플리케이션이 메소드를 호출할 때 다음 단계가 발생합니다.

인라인 메소드를 정의하는 Data 인터페이스에는 Connection 오브젝트에 대한 여러 가지 JDBC 메소드(예: close(), commit(), rollback(), setAutoCommit()getAutoCommit())가 포함되어 있습니다. 이러한 메소드를 pre()post() 메소드로 분류할 수 없습니다.

예제

예를 들어, sendFormLetter() 어노테이션이 있는 메소드에는 사용할 동문 편지를 식별하는 코드를 제공하는 int 매개변수가 있습니다. 이 메소드에는 또한 동문 편지에 입력할 정보 및 동문 편지를 보내기 위한 도시, 주 및 우편번호를 제공하는 String 매개변수가 있습니다. 마지막으로 sendFormLetter() 메소드는 편지를 인쇄하고 보내야 하는지 여부를 추적하는 테이블을 갱신합니다.

sendFormLetter() 메소드를 호출하는 애플리케이션이 도시, 주 또는 우편번호를 제공하지 않거나 이 중 두 가지는 제공하지만 세 가지를 모두 제공하지는 않을 수 있다고 가정하십시오. 세 값이 모두 존재하는지 점검하는 애플리케이션 논리를 작성하려고 하지만 데이터베이스에서 이를 쉽게 수행할 수 없고 sendFormLetter() 메소드의 정의에서 수행할 수 없습니다. 해당 애플리케이션 논리를 작성할 수 있는 한 위치는 다음과 같이 정의할 수 있는 Hook입니다.

import com.ibm.pdq.runtime.statement.*;                      1 

public class ZipHook implements Hook
{
  public void pre (                                          2 
    String methodName, Data dataInstance, SqlStatementType sqlStatementType, Object... parameters)
  {
      if (methodName.startsWith(
             "sendFormLetter(int, java.lang.String"))
      { // right method; params 2,3, & 4 are city, state, zip
        if (parameters[1] == null || parameters[2] == null ||
              parameters[3] == null)
        {  
			  ...                                3 
        }
      }
  }            

  public void post (                                         4 
	  	String methodName, Data dataInstance, Object returnValue, SqlStatementType sqlStatementType, Object... parameters)
  {
   return;  // no action
  }
}
  1. Hook 인터페이스를 포함하는 패키지를 임포트하십시오.
  2. pre() 메소드를 정의하십시오.
    String methodName
    pureQuery가 메소드의 서명을 pre() 메소드에 전달합니다.
    Data dataInstance
    pureQuery가 Data 인터페이스를 구현하는 오브젝트를 전달합니다.
    SqlStatementType sqlStatementType
    pureQuery가 SQL문의 유형(SELECT, UPDATE, INSERT 등)을 전달합니다.
    Object... parameters
    pureQuery가 sendFormLetter() 메소드에 전달되는 매개변수를 전달합니다.
  3. 우편번호를 사용하여 도시 또는 주를 찾거나 도시 및 주를 사용하여 우편번호를 찾는 논리를 제공하십시오. 매개변수를 sendFormLetter() 메소드에 전달하기 전에 매개변수를 갱신하십시오.
  4. post() 메소드가 작업을 수행하지 않도록 정의하십시오.

sendFormLetter() 메소드가 com.company.NotSpam 인터페이스에 정의된 경우, Hook ZipHook의 인스턴스를 sendFormLetter() 메소드의 사용과 연관시키는 애플리케이션 논리는 다음과 같을 수 있습니다.

Connection con = DriverManager.getConnection(...);           1 
ZipHook zHook = new ZipHook();                               2 
Data db = DataFactory.getData(NotSpam.class, con, zHook);    3 

위 코드에서 수행하는 단계는 다음과 같습니다.

  1. 데이터베이스에 대한 연결을 작성합니다.
  2. ZipHook 인터페이스의 구현 인스턴스를 작성합니다.
  3. Data 인터페이스의 구현 인스턴스를 작성합니다. 이 구현은 NotSpam 인터페이스를 구현하고 Hook ZipHook에 지정됩니다.

피드백