2013. 7. 29. 16:04

.

하지만 자바 리플렉션도 같은 기능을 제공한다고 생각할 수도 있다. 결국 이 모든 정보에 대한 코드를 검사할 수 있다. 표면적으로 볼 때 그럴 듯 하지만 실제로 그렇지 않다. 

많은 경우 메소드는 인풋으로서 받아들이거나 아웃풋으로 리턴한다. 이는 메소드가 원하는 것이 아니다. 예를 들어, 매개변수 유형이 Object이지만 메소드는 Integer를 사용해서만 작동한다. 

 

이는 메소드가 겹쳐 쓰기된 곳에서 쉽게 발생할 수 있다. 그리고 슈퍼클래스가 메소드를 일반 매개변수로 선언하던가 많은 직렬화가 진행되는 시스템에서도 쉽게 발생한다. 두 경우 모두 메타데이터는 코드 분석 툴을 지정할 수 있다. 매개변수 유형이 Object이더라도 정말로 원하는 것은 Integer라는 것을 나타낼 수 있다. 이러한 종류의 분석은 상당히 유용하며 그 가치는 상당하다. 

 

보다 복잡한 경우 코드 분석 툴은 모든 종류의 추가 태스크들을 수행할 수 있다. 그 예 중 하나가 Enterprise JavaBean (EJB) 컴포넌트이다. 심지어 간단한 EJB 시스템으로의 의존성과 복잡함은 상당하다. 

로컬 인터페이스와 로컬 홈 인터페이스의 가능성과 함께 홈 인터페이스와 원격 인터페이스를 얻는다. 이 모든 클래스들을 연동시키는 것은 진정한 고통이다. 하지만 메타데이터는 이 문제에 대한 솔루션을 제공한다. 좋은 툴은(예를 들어, XDoclet)은 이 모든 의존성을 관리하면서 "코드-레벨" 연결이 없지만 "로컬-레벨" 관계를 가진 클래스들이 연동될 수 있도록 한다. 이것이 바로 메타 테이터의 진정한 가치이다. 

 

2. Annotation의 종류

 1) Mark Annotation

   변수가 없다. 이 어노테이션은 이름으로 구분되며 추가 데이터 없이 나타난다. 예를 들어, 

 

@MarkerAnnotation은 marker 어노테이션이다. 데이터가 없으며 단지 어노테이션 이름만 있을 뿐이다.

   예) @Stateless

 


2) Single-value Annotation

   marker와 비슷하지만 데이터를 제공한다. 싱글 비트 데이트를 제공하기 때문에 간단한 신택스를 사용할 수 있다. (단, 어노테이션 유형이 이 문법을 수용해야 함)

 

@SingleValueAnnotation("my data")이는 @표시만 제외하고는 일반적인 자바 메소드 호출과 비슷하다.

   예) @Resource("mappedName=PERSON")

 


 3) Full Annotation(Multi value Annotation)

   다중 데이터 멤버를 갖고 있다. 결과적으로 전체 신택스를 사용해야 한다. (그리고 어노테이션은 일반 자바 메소드와 더 이상 비슷하지 않다) 

 

@FullAnnotation(var1="data value 1", 

var2="data value 2", var3="data value 3") 

 


 4) 커스텀 annotation 구현 : 개발자가 직접 annotation을 구현


public @interface TODO {      // Single-Value Annotation
            String value();       // value가 아닌 다른 이름을 사용하면 사용시 메소드 이름을 써준다
    }
 
    // @TODO("Something todo")
 
    public @interface TODO{      // Single-Value Annotation
            String msg();        // value가아닌다른이름을사용한경우
    }
    // @TODO(msg="Something todo")



3. Annotation을 구분하는 또 다른 기준

 1) Simple Annotation

    메소드나 변수 위에 붙이는 일반적인 Annotation

 

 2) Meta Annotation

    Annotation의 Annotation(다른 Annotation 위에다가 설정)

 

 

4. Meta Annotation

 1) @Target annotation

    작성한 annotation이 어디에서 사용하게 될지를 결정


@Target(
{
                ElementType.TYPE,              // 클래스,인터페이스,enum
                ElementType.METHOD,            // 생성자를 제외한 모든 메소드
                ElementType.CONSTRUCTOR,       // 생성자
                ElementType.ANNOTATION_TYPE    // 메타 annotation
         }
)


2) @Retention annotation([속성값])

   작성한 annotation의 지속성을 설정

 

   - RetentionPolicy.SOURCE : 컴파일러가 컴파일시 삭제하여 클래스 파일에 저장되지 않는다

   - RetentionPolicy.CLASS : 클래스 파일에 저장되지만 JVM은 무시

   - RetentionPolicy.RUNTIME : 클래스 파일에 저장하고 JVM

 

 

5. 내장 Annotation

 1) @Override

   슈퍼클래스의 메소드를 오버라이드


public class OverrideTester {
    public OverrideTester() { }
 
    @Override
    public String toString() {
      return super.toString() + " [Override Tester Implementation]";
    }
 
    @Override
    public int hasCode() {
      return toString().hashCode();
    }
  }
 


 2) @Deprecated

    Override와 마찬가지로 Deprecated는 marker 어노테이션이다. Deprecated를 사용하여 더 이상 사용되지 말아야 하는 메소드에 주석을 단다. Override와 다른 점은, Deprecated는 더 이상 사용되지 말아야 하는(depreciated) 메소드와 같은 라인상에 놓여져야 한다.


public class DeprecatedClass {
    @Deprecated public void doSomething() {
      // some code
    }
 
    public void doSomethingElse() {
      // This method presumably does what doSomething() does, but better
    }
  }


 3) @SuppressWarnings

   번거로운 경고를 제거한다.

   Override와 Deprecated와는 다르게 SupressWarnings는 변수를 갖고 있다. 따라서 이를 작동하게 하려면 싱글-어노테이션 유형을 사용한다. 값 어레이로서 변수를 제공할 수 있다. 각각 삭제할(Suppress) 특정 유형의 경고를 나타낸다.


@SuppressWarnings(value={"unchecked"})
  public void nonGenericsMethod() {
    List wordList = new ArrayList();
    wordList.add("foo");
  }



'Framework > Spring' 카테고리의 다른 글

Spring Framework/ DI / IOC 컨테이너 / POJO  (0) 2013.07.30
Annotation_Spring_MVC_2  (0) 2013.07.29
Annotation_Spring_MVC_1  (0) 2013.07.29
Posted by 1+1은?