๐ŸŒฑ ์–ด๋…ธํ…Œ์ด์…˜์˜ ๊ธฐ๋ณธ ๊ตฌ์กฐ

์ด๋ฏธ ์„ ์–ธ๋˜์–ด ์žˆ๋Š” ์–ด๋…ธํ…Œ์ด์…˜์„ ๋ณด๋ฉด ๊ธฐ๋ณธ์ ์œผ๋กœ @Target, @Retention์ด ์„ค์ •๋˜์–ด ์žˆ๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

์—ฌ๊ธฐ์„œ ์ด @Target, @Retention์ด ๋ญ˜๊นŒ?

 

๐ŸŒฑ Meta Annotation์ด๋ž€?

๋ฉ”ํƒ€ ์–ด๋…ธํ…Œ์ด์…˜์€ ์–ด๋…ธํ…Œ์ด์…˜์„ ์ •์˜ํ•  ๋•Œ ์‚ฌ์šฉ๋˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜์ด๋‹ค.

๋ฉ”ํƒ€ ์–ด๋…ธํ…Œ์ด์…˜์€ ๋‹ค๋ฅธ ์–ด๋…ธํ…Œ์ด์…˜ ์œ„์— ์„ ์–ธ๋˜์–ด ๊ทธ ์–ด๋…ธํ…Œ์ด์…˜์˜ ์‚ฌ์šฉ ๋ฐฉ๋ฒ•๊ณผ ๋™์ž‘์„ ์ง€์ •ํ•œ๋‹ค.

 

๐Ÿซง @Retention

์–ด๋…ธํ…Œ์ด์…˜์„ ์–ธ์ œ๊นŒ์ง€ ์œ ์ง€ํ• ๊ฒƒ์ธ์ง€ ์ง€์ •ํ•œ๋‹ค.

์†Œ์Šค ์ฝ”๋“œ, ํด๋ž˜์Šค ํŒŒ์ผ, ๋Ÿฐํƒ€์ž„ ์ค‘ ์–ด๋Š ์‹œ์ ๊นŒ์ง€ ์–ด๋…ธํ…Œ์ด์…˜ ์ •๋ณด๋ฅผ ์œ ์ง€ํ• ์ง€๋ฅผ ๊ฒฐ์ •ํ•œ๋‹ค.

1๏ธโƒฃ @Retention(RetentionPolicy.SOURCE)

์ปดํŒŒ์ผ ์ „๊นŒ์ง€๋งŒ ์œ ์ง€๋˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์‚ฌ์šฉํ•˜๋Š” ์˜ต์…˜, ์ปดํŒŒ์ผ๋Ÿฌ์— ์˜ํ•ด ์ œ๊ฑฐ๋œ๋‹ค.

@Target({ElementType.FIELD, ElementType.TYPE})
@Retention(RetentionPolicy.SOURCE)
public @interface Getter {
}

@Getter ์–ด๋…ธํ…Œ์ด์…˜์€ Getter ๋ฉ”์„œ๋“œ๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ์†Œ์Šค ์ฝ”๋“œ ์ˆ˜์ค€์—์„œ๋งŒ ํ•„์š”ํ•˜๋‹ค. ์ฆ‰, ์ปดํŒŒ์ผ ์‹œ์—๋งŒ ํ•ด๋‹น ์–ด๋…ธํ…Œ์ด์…˜ ์ •๋ณด๊ฐ€ ํ•„์š”ํ•˜๋ฉฐ, ๋Ÿฐํƒ€์ž„์—๋Š” ๋” ์ด์ƒ ํ•ด๋‹น ์ •๋ณด๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— SOURCE ์˜ต์…˜์„ ์‚ฌ์šฉํ•œ๋‹ค.

2๏ธโƒฃ @Retention(RetentionPolicy.CLASS)

์ปดํŒŒ์ผ๋Ÿฌ์— ์˜ํ•ด .class ํŒŒ์ผ์— ๊ธฐ๋ก๋˜์ง€๋งŒ ๋Ÿฐํƒ€์ž„์—๋Š” ์‚ฌ๋ผ์ง„๋‹ค.

@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
@Retention(RUNTIME)
@Repeatable(List.class)
@Documented
@Constraint(validatedBy = { })
public @interface NotNull {
}

@NotNull ์–ด๋…ธํ…Œ์ด์…˜์€ ํ•ด๋‹น ์–ด๋…ธํ…Œ์ด์…˜์„ ์„ ์–ธํ•œ ํ•„๋“œ๊ฐ€ null์ด ์•„๋‹Œ ๊ฐ’์„ ๊ฐ€์ ธ์•ผ ํ•จ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค.

์ด ์–ด๋…ธํ…Œ์ด์…˜์€ ํ•„๋“œ์˜ ์œ ํšจ์„ฑ์„ ๊ฒ€์‚ฌํ•˜๋Š” ์—ญํ• ์„ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ปดํŒŒ์ผ๋œ ํด๋ž˜์Šค ํŒŒ์ผ์—๋งŒ ์–ด๋…ธํ…Œ์ด์…˜ ์ •๋ณด๊ฐ€ ์œ ์ง€๋˜์–ด์•ผ ํ•˜๊ณ , ๋Ÿฐํƒ€์ž„์—๋Š” ํ•ด๋‹น ์–ด๋…ธํ…Œ์ด์…˜ ์ •๋ณด๊ฐ€ ๋” ์ด์ƒ ํ•„์š”ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— CLASS ์˜ต์…˜์„ ์‚ฌ์šฉํ•œ๋‹ค.

3๏ธโƒฃ @Retention(RetentionPolicy.RUNTIME)

์ปดํŒŒ์ผ๋Ÿฌ์— ์˜ํ•ด .class ํŒŒ์ผ์— ๊ธฐ๋ก๋˜๊ณ , JVM์— ์˜ํ•ด ์–ด๋…ธํ…Œ์ด์…˜์ด ์œ ์ง€๋œ๋‹ค.
์ฆ‰, Java๋กœ ์ž‘์„ฑํ•œ ์ฝ”๋“œ๊ฐ€ ๋Œ์•„๊ฐ€๋Š” ๋™์•ˆ์—๋Š” ๊ณ„์† ์œ ์ง€๋œ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค.

@Retention(RetentionPolicy.RUNTIME)
@Target(value = { FIELD, METHOD, ANNOTATION_TYPE })
public @interface LastModifiedDate {
}

์Šคํ”„๋ง์—์„œ ๋Œ€๋ถ€๋ถ„์˜ ์–ด๋…ธํ…Œ์ด์…˜์€ RUNTIME ์˜ต์…˜์„ ์‚ฌ์šฉํ•œ๋‹ค. @LastModifiedDate ์–ด๋…ธํ…Œ์ด์…˜์€ ์—”ํ‹ฐํ‹ฐ์˜ ๋งˆ์ง€๋ง‰ ์ˆ˜์ •์ผ์„ ๋‚˜ํƒ€๋‚ด๋Š”๋ฐ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์—”ํ‹ฐํ‹ฐ๊ฐ€ ์ˆ˜์ •๋  ๋•Œ๋งˆ๋‹ค ํ•ด๋‹น ํ•„๋“œ์— ํ˜„์žฌ ์‹œ๊ฐ„์„ ์ž๋™์œผ๋กœ ํ• ๋‹นํ•ด์•ผ ํ•˜๋ฏ€๋กœ RUNTIME ์˜ต์…˜์„ ์‚ฌ์šฉํ•œ๋‹ค.

 

๐Ÿซง @Target

์–ด๋…ธํ…Œ์ด์…˜์ด ์ ์šฉ๋  ๋Œ€์ƒ์„ ์ง€์ •ํ•œ๋‹ค.

ํด๋ž˜์Šค, ํ•„๋“œ, ๋ฉ”์„œ๋“œ ๋“ฑ์˜ ์–ด๋Š ์š”์†Œ์— ์–ด๋…ธํ…Œ์ด์…˜์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€๋ฅผ ๊ฒฐ์ •ํ•œ๋‹ค.

  1. @Target({ElementType.TYPE})
    : ํด๋ž˜์Šค, ์ธํ„ฐํŽ˜์ด์Šค, Enum ๋˜๋Š” Record
  2. @Target({ElementType.FIELD})
    : ๋ณ€์ˆ˜
  3. @Target({ElementType.METHOD})
    : ๋ฉ”์„œ๋“œ
  4. @Target({ElementType.PARAMETER})
    : ๋ฉ”์„œ๋“œ์˜ ํŒŒ๋ผ๋ฏธํ„ฐ(ํด๋ผ์ด์–ธํŠธ์—์„œ ์ „๋‹ฌ ๋ฐ›๋Š” API์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋“ค์— ์ž์ฃผ ์‚ฌ์šฉ๋จ)
  5. @Target({ElementType.CONSTRUCTOR})
    : ์ƒ์„ฑ์ž
  6. @Target({ElementType.LOCAL_VARIABLE})
    : ๋ณ€์ˆ˜ ์ค‘ ์ง€์—ญ ๋ณ€์ˆ˜๋งŒ
  7. @Target({ElementType.ANNOTATION_TYPE})
    : ์–ด๋…ธํ…Œ์ด์…˜
  8. @Target({ElementType.PACKAGE})
    : ํŒจํ‚ค์ง€. ํŒจํ‚ค์ง€ ์ •๋ณด๋ฅผ ๊ธฐ๋กํ•˜๋Š” ์—ญํ• 
  9. @Target({ElementType.TYPE_PARAMETER})
    : ํƒ€์ž… ๋ณ€์ˆ˜(ex. ์ œ๋„ค๋ฆญ์— ์„ ์–ธํ•˜๋Š” ํƒ€์ž… ๋“ฑ)
  10. @Target({ElementType.TYPE_USE})
    : ํƒ€์ž… ๋ณ€์ˆ˜ ๋ฟ ์•„๋‹ˆ๋ผ ๋ชจ๋“  ํƒ€์ž…
  11. @Target({ElementType.RECORD_COMPONENT})
    : ๋ ˆ์ฝ”๋“œ
  12. @Target({ElementType.MODULE})
    : ๋ชจ๋“ˆ

 

๐Ÿซง @Documented

ํ•ด๋‹น ์–ด๋…ธํ…Œ์ด์…˜์ด javadoc์— ํฌํ•จ๋˜๋„๋ก ์ง€์ •ํ•œ๋‹ค.

์ฆ‰, ํ•ด๋‹น ์–ด๋…ธํ…Œ์ด์…˜์˜ ์‚ฌ์šฉ๋ฒ•๊ณผ ์„ค๋ช…์ด ๋ฌธ์„œํ™”๋œ๋‹ค.

@Documented
@Retention(RUNTIME)
public @interface Nonnull {
}

 

๐Ÿซง @Inherited

ํ•ด๋‹น ์–ด๋…ธํ…Œ์ด์…˜์ด ์ƒ์†๋  ์ˆ˜ ์žˆ๋„๋ก ์ง€์ •ํ•œ๋‹ค.

์ฆ‰, ๋ถ€๋ชจ ํด๋ž˜์Šค์— ์„ ์–ธ๋œ ์–ด๋…ธํ…Œ์ด์…˜์ด ์ž์‹ ํด๋ž˜์Šค์—๋„ ์ ์šฉ๋˜๋„๋ก ํ•œ๋‹ค.

@Inherited
@InterceptorBinding
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(value = RetentionPolicy.RUNTIME)
public @interface Transactional {
}