기본적인 구성 : @Entity
@ : Annotation(애노테이션)이라고 지칭한다
Entity : 해당 애노테이션의 이름이다
자바 애노테이션은 값을 세팅할 수 있는 요소들을 가질수 있는데 속성이나 매개변수 정도라고 볼수 있다
@Entity(tableName = "vehicles")
은 tableName이라는 이름의 요소를 하나 가지고 있다는 뜻으로 값은 "vehicle"이다
요소를 하나만 가질경우 @tableName("vehicles")
로 줄여쓸수 있다
여러개의 요소를 가질 경우
Entity(tableName = "vehicles", primaryKey = "id")
로 나타낼 수 있다
애노테이션은 클래스, 인터페이스, 메소드, 메서드 매개변수, 필드, 지역변수 위에 위치할 수 있다
클래스 위에 선언된 경우
@Entity
public class Vehicle {
}
사용 예시
@Entity
public class Vehicle {
@Persistent
protected String vehicleName = null;
@Getter
public String getVehicleName() {
return this.vehicleName;
}
public void setVehicleName(@Optional vehicleName) {
this.vehicleName = vehicleName;
}
public List addVehicleNameToList(List names) {
@Optional
List localNames = names;
if(localNames == null)
localNames = new ArrayList();
localNames.add(getVehicleName());
return localNames;
}
}
이 애노테이션이 달린 해당 클래스/메소드 등은 더이상 지원하지 않거나, 좋지 않거나, 더 나은 방법이 있으니 사용하지 말라는 의미이다
만약, 이 애노테이션이 달린 객체를 사용할 경우 자바 컴파일러는 경고를 출력한다
super클래스에 대해서 오버라이드 되어있다는것을 명시적으로 알려준다. 따라서, 만약 메서드가 super클래스와 매칭되지 않았다면 에러를 출력한다
예시
public class MySuperClass {
public void doTheThing() {
System.out.println("Do the thing");
}
}
public class MySubClass extends MySuperClass{
@Override
public void doTheThing() {
System.out.println("Do it differently");
}
}
@Override를 사용하는 것이 강제는 아니지만, 사용하는 것을 지향한다
메소드 오버라이드를 하고 있는지 모른체 super클래스가 변경될때 컴파일러가 알려주므로 변경점을 체크하기 쉽다
해당 메소드에 대해서 compiler suppress warnings(컴파일러 경고 억제)를 만들어 낸다. 해당 코드에서 출력하는 경고메시지를 무시할수 있게 해준다
@SuppressWarnings
public void methodWithWaring(){
}
개인적으로 사용할 애노테이션을 만드는 것이 가능하며 애노테이션은 클래스나 인터페이스처럼 자신의 파일에 정의된다
예시
@interface MyAnnotation {
String value();
String name();
int age();
String[] newNames();
}
위 애노테이션은 4개의 요소를 가지고 있으며 이름은 Annotation이다
@interface 키워드는 자바 컴파일러에게 해당 코드가 애노테이션 정의라는 것을 명시해준다
요소들은 인터페이스에서의 메소드 정의와 유사하다
사용
@MyAnnotation(
value="123",
name="woonsik",
age=26,
newNames={"woonsik", "byeori"}
)
public class myClass{
}
위의 사용 예시 처럼 각각의 요소에 원하는 값을 지정해서 사용할 수 있다
@interface MyAnnotation{
String value() default"";
String name();
int age();
String[] newNames();
}
@MyAnnotation(
name="woonsik",
age=26,
newNames={"woonsik","byeori"}
)
public class MyClass{
}
SOURCE : 애노테이션 정보가 컴파일시 사라짐, 바이트 코드에서는 존재하지 않는다
ex) @Override, @SuppressWarnings
CLASS : 클래스 파일에 존재하고 컴파일러에 의해 사용가능하다, 런타임에서는 사라진다
RUNTIME : 실행시 애노테이션 정보가 JVM에 의해 참조 가능하다. 자바리플렉션에 의해 사용된다
예시
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
String value() default "";
}
기존 @Target 목록
ElementType.ANNOTATION_TYPE
ElementType.CONSTRUCTOR
ElementType.FIELD
ElementType.LOCAL_VARIABLE
ElementType.METHOD
ElementType.PACKAGE
ElementType.PARAMETER
ElementType.TYPE
자바8에서 추가된 @Target
ElementType.TYPE_PARAMETER
ElementType.TYPE_USE;
TYPE이란?
사용
import java.lang.annotation.Target;
import java.lang.annotation.ElementType;
@Target(ElementType.TYPE_PARAMETER)
public @interface MyAnnotation {
String value() default "";
}
@Inherited 애노테이션을 사용한 슈퍼클래스를 상속한 서브(자식)클래스에서도 해당 애노테이션을 갖도록 한다
java.lang.annotation.Inherited
@Inherited
public @interface MyAnnotation {
}
@MyAnnotation
public class MySuperClass{
}
public calss MySubClass extends MySuperClass {
}
여기서 MySubClass클래스는 @MyAnnotation을 상속받는다
@Documented 애노테이션이 지정된 대상의 JavaDoc에 이 애노테이션의 존재를 표기하도록 지정한다
java.lang.annotation.Documented
@Documented
public @interface MyAnnotation {
}
@MyAnnotation
public class MySubClass{
}
MySubClass클래스는 JavaDoc에서 @Documented를 표시하게 된다