오늘 이거 알았네요/Java

[Java / Spring] 커스텀 Annotation

로그관리자 2023. 2. 10. 23:53
728x90

 

 

 

 

 

직접 어노테이션을 만들어보자

 

 

 

 

타입 정의하기

 

@interface 어노테이션 이름 {
		타입 요소이름();   // 어노테이션 요소를 선언한다
		...
}

 

 

어노테이션 내에 선언된 메서드를 ‘어노테이션의 요소(element)’라고 한다.

 

 

 

@interface TestInfo {
	int count();
	String testBy();
	String[] testTools();
	TestType testType();  //enum TestType {FIRST, FINAL}
	DateTime testDate();  // 자신이 아닌 다른 어노테이션(@DateTime}을 포함할 수 있다.
}

@interface DateTime {
	String yymmdd();
	String hhmmss();
}

 

 

어노테이션의 요소

 

1. 반환 값이 있다.

2. 매개변수가 없는 추상메소드의 형태

3. 상속을 통해 구현하지 않아도 된다.

 

but, 이 요소들의 값을 빠짐없이 지정해주어야 한다. (순서 상관 없음)

@TestInfo(
	count = 3, 
	testBy = "Kim",
	testTools = {"JUnit", "AutoTester"},
	testType = TestType.FIRST,
	testDate = @DateTime(yymmdd="160101", hhmmss="2359559")
)
public class NewClass { ... }

 

4. 각 요소는 기본값을 가질 수 있다. (기본 값으로 null을 제외한 모든 리터럴이 가능)

5. 요소가 오직 하나뿐이고 이름이 value인 경우, 어노테이션 적용 시 이름 생략 가능

 

@interface TestInfo {
	String value();
}

@TestInfo("passed") //@TestInfo(Value="passed")와 동일
class NewClass { ... }

 

6. 요소 타입이 배열

  • 괄호 { }를 사용해서 여러 개의 값을 지정
  • 기본 값 지정 시 괄호{ } 사용 가능
  • 요소의 타입이 배열일 때 요소 이름이 value이면 요소 이름 생략 가능
@interface TestInfo {
	String[] testTools();
}

@Test(testTools={"JUnit", "AutoTester"}) // 값이 여러개인 경우
@Test(testTools="JUnit") // 값이 하나일 때 괄호 {} 생략 가능 
@Test(testTools={}) // 값이 없을 때 **괄호 {} 반드시 필요** 

 

 

어노테이션 요소의 규칙

 

  • 요소의 타입은 기본형, String, Enum, 어노테이션, Class만 허용
  • ()안에 매개변수 선언 못 해
  • 예외 선언 못 해
  • 요소 타입을 매개변수로 정의 못 해

 

 

 

 

 

728x90