Annotation

μ–΄λ…Έν…Œμ΄μ…˜ (@, Annotation) μ΄λž€ JDK 5 λΆ€ν„° λ“±μž₯ν•œ 기술둜 μ£Όμ„μ΄λΌκ³ λŠ” κ°„λ‹¨νžˆ ν‘œν˜„λ˜μ—ˆμ§€λ§Œ μ–΄λ…Έν…Œμ΄μ…˜μ— κ΅¬ν˜„λœ 정보에 따라 μ½”λ“œμ˜ μ—°κ²° λ°©ν–₯성이 κ²°μ •λœλ‹€.

λΉ„μ§€λ‹ˆμŠ€ λ‘œμ§μ—λŠ” 영ν–₯을 주지 μ•Šμ§€λ§Œ ν•΄λ‹Ή νƒ€κ²Ÿμ˜ μ—°κ²°λ°©λ²•μ΄λ‚˜ μ†ŒμŠ€μ½”λ“œμ˜ ꡬ쑰λ₯Ό κ²°μ •μ§“λŠ” μ€‘μš”ν•œ κΈ°λŠ₯을 ν• μˆ˜λ„ μžˆλ‹€.

μ–΄λ…Έν…Œμ΄μ…˜μ€ μ†ŒμŠ€ μ½”λ“œμ— 메타 정보λ₯Ό μ‚½μž…ν•˜λŠ”κ²ƒ 이기 λ•Œλ¬Έμ— 잘 μ΄μš©ν•˜λ©΄ ꡬ독성 뿐만이 μ•„λ‹ˆλΌ 체계적인 μ†ŒμŠ€μ½”λ“œ κ΅¬μ„±μ˜ 도움을 μ€€λ‹€.

μ»€μŠ€ν…€ μ–΄λ…Έν…Œμ΄μ…˜

μ–΄λ…Έν…Œμ΄μ…˜μ€ 기본적으둜 μΈν„°νŽ˜μ΄μŠ€ ν˜•νƒœλ₯Ό μ·¨ν•˜κ³  있으며 interface μ•žμ— @ ν‘œμ‹œλ₯Ό ν•΄μ€€λ‹€. μ–΄λ…Έν…Œμ΄μ…˜ ν•„λ“œμ—μ„œλŠ” enum String μ΄λ‚˜ κΈ°λ³Έ μžλ£Œν˜• ν˜Ήμ€ κΈ°λ³Έ μžλ£Œν˜•μ˜ 배열듀을 μ‚¬μš©ν•  수 μžˆλ‹€.

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface CustomAnnotation {
  boolean isCheck() default true;
}

@Target

  • μ–΄λ…Έν…Œμ΄μ…˜μ΄ 적용될 μœ„μΉ˜λ₯Ό μ„ νƒν•©λ‹ˆλ‹€.
μœ ν˜• μ„€λͺ…
ElementType.PACKAGE νŒ¨ν‚€μ§€ μ„ μ–Έ
ElementType.TYPE νƒ€μž… μ„ μ–Έ
ElementType.ANNOTATION_TYPE μ–΄λ…Έν…Œμ΄μ…˜ νƒ€μž… μ„ μ–Έ
ElementType.CONSTRUCTOR μƒμ„±μž μ„ μ–Έ
ElementType.FIELD 멀버 λ³€μˆ˜ μ„ μ–Έ
ElementType.LOCAL_VARIABLE 지역 λ³€μˆ˜ μ„ μ–Έ
ElementType.METHOD λ©”μ„œλ“œ μ„ μ–Έ
ElementType.PARAMETER μ „λ‹¬μΈμž μ„ μ–Έ
ElementType.TYPE_PARAMETER μ „λ‹¬μΈμž νƒ€μž… μ„ μ–Έ
ElementType.TYPE_USE νƒ€μž… μ„ μ–Έ

@Retention

  • μžλ°” μ»΄νŒŒμΌλŸ¬κ°€ μ–΄λ…Έν…Œμ΄μ…˜μ„ λ‹€λ£¨λŠ” 방법을 κΈ°μˆ ν•˜λ©° νŠΉμ • μ‹œμ κΉŒμ§€ 영ν–₯을 λ―ΈμΉ˜λŠ”μ§€ κ²°μ •ν•œλ‹€.
μœ ν˜• μ„€λͺ…
RetentionPolicy.SOURCE 컴파일 μ „κΉŒμ§€λ§Œ 유효
컴파일 μ΄ν›„μ—λŠ” 사라짐
RetentionPolicy.CLASS μ»΄νŒŒμΌλŸ¬κ°€ 클래슀λ₯Ό μ°Έμ‘°ν•  λ•ŒκΉŒμ§€ 유효.
RetentionPolicy.RUNTIME 컴파일 이후에도 JVM에 μ˜ν•΄ 계속 μ°Έμ‘°κ°€ κ°€λŠ₯.
λ¦¬ν”Œλ ‰μ…˜ μ‚¬μš©

@Documented

  • ν•΄λ‹Ή μ–΄λ…Έν…Œμ΄μ…˜μ„ Javadoc 에 ν¬ν•¨μ‹œν‚΅λ‹ˆλ‹€.

@Inherited

  • μ–΄λ…Έν…Œμ΄μ…˜μ˜ 상속을 κ°€λŠ₯ν•˜κ²Œ ν•©λ‹ˆλ‹€.

@Repeatable

  • JDK8 λΆ€ν„° 지원
  • μ—°μ†μ μœΌλ‘œ μ–΄λ…Έν…Œμ΄μ…˜ μ„ μ–Έν•  수 있게 지원해쀀닀.

Java μ—μ„œ 제곡

@Override

  • μ„ μ–Έν•œ λ©”μ„œλ“œκ°€ μ˜€λ²„λΌμ΄λ“œ 됨
  • μƒμœ„ (λΆ€λͺ¨) 클래슀 (ν˜Ήμ€ μΈν„°νŽ˜μ΄μŠ€) μ—μ„œ ν•΄λ‹Ή λ©”μ„œλ“œλ₯Ό 찾을 수 μ—†λ‹€λ©΄ 컴파일 μ—λŸ¬λ₯Ό λ°œμƒμ‹œν‚¨λ‹€.

@Deprecated

  • ν•΄λ‹Ή λ©”μ„œλ“œκ°€ 더 이상 μ‚¬μš©λ˜μ§€ μ•ŠμŒμ„ ν‘œμ‹œ
  • λ§Œμ•½ μ‚¬μš©ν•  경우 컴파일 κ²½κ³ λ₯Ό λ°œμƒ

@SuppressWarnings

  • μ„ μ–Έν•œ 곳의 컴파일 κ²½κ³ λ₯Ό λ¬΄μ‹œν•˜λ„λ‘ ν•œλ‹€.

@SafeVarargs

  • JDK 7 λΆ€ν„° 지원
  • μ œλ„€λ¦­ 같은 κ°€λ³€ 인자의 λ§€κ°œλ³€μˆ˜λ₯Ό μ‚¬μš©ν•  λ•Œμ˜ κ²½κ³ λ₯Ό λ¬΄μ‹œ

@FunctionalInterface

  • JDK 8 λΆ€ν„° 지원
  • ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€λ₯Ό 지정
  • λ©”μ„œλ“œκ°€ μ‘΄μž¬ν•˜μ§€ μ•Šκ±°λ‚˜, 1개 μ΄μƒμ˜ λ©”μ„œλ“œ (default λ©”μ„œλ“œ μ œμ™Έ) κ°€ μ‘΄μž¬ν•  경우 컴파일 였λ₯˜λ₯Ό λ°œμƒ

Spring μ—μ„œ 제곡

@ComponentScan

@Transactional

μ½”λ“œκΈ°λ°˜ νŠΈλžœμž­μ…˜ 처리 (Programmatic Transaction) 뿐만이 μ•„λ‹ˆλΌ 선언적 νŠΈλžœμž­μ…˜ (Declarative Transaction) 을 지원

μŠ€ν”„λ§μ—μ„œ μ œκ³΅ν•˜λŠ” νŠΈλžœμž­μ…˜ ν…œν”Œλ¦Ώ 클래슀λ₯Ό μ΄μš©ν•˜κ±°λ‚˜ μ„€μ •νŒŒμΌ, μ–΄λ…Έν…Œμ΄μ…˜μ„ μ΄μš©ν•˜μ—¬ νŠΈλžœμž­μ…˜ λ²”μœ„ 및 κ·œμΉ™μ„ μ •μ˜ν•  수 μžˆλ‹€.