<aside> 📌 메타데이터의 한 형태인 주석은 프로그램 자체의 일부가 아닌 프로그램에 대한 데이터를 제공한다.
</aside>
<aside>
😅 메타데이터? 그게 뭘까? 데이터에 대한 데이터다. 도서관에서 사용하는 서지기술용으로 만든 것이 대표적인 예다. 여기서 서지 기술이란 문헌에 관한 것을 그래도 옮겨 쓰는 것이다. 길게 표현하면 특정한 서지 개체가 지닌 속성 요소를 일정한 틀로 표현하는 과정으로서, 특정 자원과 이와 다른 자원 또는 동일 저작의 다른 판과 구별하기 위한 일련의 서지 사항을 체계적으로 기록하는 행위, 또는 이렇게 기록된 일련의 서지사항이다. 이렇게 보면 어렵다. 간단하게 태그 같은 느낌이다. 우리의 학생증을 보면 “이름:”, “학번:” 을 볼 수 있다. 이런 이름을 표현 하기위한 이름이란 태그 같은 느낌의 데이터다.
자바의 Annotation은 다음과 같은 용도를 위하여 사용된다.
출처 : oracle tutorial
</aside>
<aside>
😅 기존의 자바 웹 애플리케이션들은 대부분 설정값을 XML파일에 명시하여 관리했다. 변경될 수 있는 데이터들은 코드가 아닌 외부 설정파일에 분리하기 때문에, 재컴파일 시간이 단축되었다. 하지만, 프로그램 작성을 위해 매번 많은 설정을 해야하며, 수 많은 설정파일들을 관리하는 건 힘든 일이었다. 그래서 나온 것이 Annotation이었다. 이를 사용하면 데이터 유효성 검사 조건을 보다 쉽게 파악 가능해지고, 원하는 클래스만 메타데이터를 표현할 수 있었다.
</aside>
<aside>
😅 나도 이에 대하여 참 고민을 많이 했다. 과연 XML로 메타 데이터를 관리하는 것이 좋을까? Annotation으로 관리하는 것이 좋을까? 사실 이건 답이 없는 것 같다. 그런데 몇몇 의견을 종합해보고 필자가 내린 결론은 하나의 큰 단일 서비스를 고려해야한다면 XML이 좋다. 하지만 여러 작은 서비스들을 이어 붙여 하나의 서비스를 만들어야한다면 각각의 작은 서비스는 Annotation을 사용하는 편이 좋은 것 같다. 이건 내 코드에 얼마나 많은 범위로 영향이 전파되느냐의 문제라고 생각한다. 예를 들자면 결국 “Annotation의 경우 사용하려면 코드 내에 직접 달린다” 라는 조건이 있다. 이를 다시 생각해보면 개발자의 실수가 발생할 수 있는 큰 서비스의 경우 주석보다는 XML로 관리하는 편이 더 위험한 상황을 예방할 수 있다고 생각한다(어디에서 문제가 생길지 며느리도 모른다). 이런 관점에서 나라면 큰 단일서비스의 메타정보 구성은 XML, 이와 반대로 작은 서비스의 결합은 각 서비스마다 Annotation을 사용하겠다.
</aside>
<aside>
😅 Annotation의 경우 java.lang.annotation,Annotation을 implements하고 있다. 또한 Annotation은 리플렉션 기술을 이용해서 사용된다.
</aside>
public @interface Mark {
}
java/lang/annotation/Annotation {
// compiled from: Mark.java
}
... 구조
@interface [애너테이션이름] {
[타입] [요소] [이름](); // 애너테이션의 요소를 선언한다.
...
...
}
<aside> 😅 Annotation 요소의 규칙
<aside> 📌 Annotation의 용도?
참고
어노테이션 반복정의를 위한 @Repeatable 작성법과 주의점
참고
<aside> 📌 앞서 우리는 어노테이션이 데이터의 데이터 역할을 한다고 알고 있다. 근데 이 뒤에 프로세서가 붙으면 뭘하는 걸까? 일반적인 어노테이션의 역할은 다음과 같다.
여기에 프로세스가 붙으면 어노테이션에 정의된 일련의 프로세스를 동작하게 하는 것을 의미한다. 좀 말이 어려울 수 있다. 간단하게 동작을 하게 만든다고 생각하면 된다. 대표적으로 @Override가 있으며, Lombok이라는 라이브러리도 있다. 근데 신기하지 않은가? 동작을 만들어 낸다는 것이!
</aside>