์–ด๋…ธํ…Œ์ด์…˜ (Annotation)

2023. 7. 22. 13:57ยท ๐Ÿง Programming/Java
๋ชฉ์ฐจ
  1. (1) ์–ด๋…ธํ…Œ์ด์…˜์ด๋ž€
  2. (2) ์–ด๋…ธํ…Œ์ด์…˜ ํƒ€์ž… ์ •์˜์™€ ์ ์šฉ
  3. (3) ์–ด๋…ธํ…Œ์ด์…˜ ์ ์šฉ ๋Œ€์ƒ
  4. (4) ์–ด๋…ธํ…Œ์ด์…˜ ์œ ์ง€ ์ •์ฑ…

1) ์–ด๋…ธํ…Œ์ด์…˜ (Annotation)

 

(1) ์–ด๋…ธํ…Œ์ด์…˜์ด๋ž€

  • ์ฝ”๋“œ์—์„œ โ€œ@โ€์œผ๋กœ ์ž‘์„ฑ๋˜๋Š” ์š”์†Œ๋ฅผ ์–ด๋…ธํ…Œ์ด์…˜์ด๋ผ๊ณ  ํ•˜๋ฉฐ, ์–ด๋…ธํ…Œ์ด์…˜์€ ํด๋ž˜์Šค ๋˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ปดํŒŒ์ผํ•˜๊ฑฐ๋‚˜ ์‹คํ–‰ํ•  ๋•Œ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•  ๊ฒƒ์ธ์ง€๋ฅผ ์•Œ๋ ค์ฃผ๋Š” ์„ค์ • ์ •๋ณด์ด๋‹ค.

 

  • ์–ด๋…ธํ…Œ์ด์…˜์€ ์ฃผ๋กœ ์„ธ ๊ฐ€์ง€ ์šฉ๋„๋กœ ์‚ฌ์šฉ๋˜์–ด์ง„๋‹ค.

โ‘  ์ปดํŒŒ์ผ ์‹œ ์‚ฌ์šฉํ•˜๋Š” ์ •๋ณด ์ „๋‹ฌ

โ‘ก ๋นŒ๋“œ ํˆด์ด ์ฝ”๋“œ๋ฅผ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ์ •๋ณด ์ „๋‹ฌ

โ‘ข ์‹คํ–‰ ์‹œ ํŠน์ • ๊ธฐ๋Šฅ์„ ์ฒ˜๋ฆฌํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ์ •๋ณด ์ „๋‹ฌ

 

  • ์ปดํŒŒ์ผ ์‹œ, ์‚ฌ์šฉ๋˜๋Š” ์ •๋ณด ์ „๋‹ฌ์˜ ๋Œ€ํ‘œ์ ์ธ ์˜ˆ๋Š” @Override ์–ด๋…ธํ…Œ์ด์…˜์ด๋‹ค.

 

  • @Override๋Š” ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋ฉ”์†Œ๋“œ ์žฌ์ •์˜ ๊ฒ€์‚ฌ๋ฅผ ํ•˜๋„๋ก ์„ค์ •ํ•˜๋ฉฐ ์ •ํ™•ํžˆ ์žฌ์ •์˜๋˜์ง€ ์•Š์•˜๋‹ค๋ฉด ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์—๋Ÿฌ๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค.

 

  • ์–ด๋…ธํ…Œ์ด์…˜์€ ์ž๋ฐ” ํ”„๋กœ๊ทธ๋žจ์„ ๊ฐœ๋ฐœํ•  ๋•Œ ํ•„์ˆ˜์ ์ธ ์š”์†Œ๋กœ ํŠนํžˆ, ์›น ๊ฐœ๋ฐœ์— ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” Spring ํ”„๋ ˆ์ž„ ์›Œํฌ ๋˜๋Š” Spring Boot์—์„œ ๋‹ค์–‘ํ•œ ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ์›น ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์„ค์ •ํ•œ๋‹ค.

 

(2) ์–ด๋…ธํ…Œ์ด์…˜ ํƒ€์ž… ์ •์˜์™€ ์ ์šฉ

  • ์–ด๋…ธํ…Œ์ด์…˜๋„ ํ•˜๋‚˜์˜ ํƒ€์ž…์ด๋ฏ€๋กœ ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋จผ์ € ์ •์˜๋ถ€ํ„ฐ ํ•ด์•ผ ํ•˜๋ฉฐ, ์–ด๋…ธํ…Œ์ด์…˜์„ ์ •์˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์ธํ„ฐํŽ˜์ด์Šค ์ •์˜ํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ ์œ ์‚ฌํ•˜๋‹ค.
[์˜ˆ์‹œ]
public @interface AnnotationName { }        

โ†’ @interface ๋’ค์— ์‚ฌ์šฉํ•  ์–ด๋…ธํ…Œ์ด์…˜ ์ด๋ฆ„์ด ์˜จ๋‹ค.


@AnnotationName
public class AnnoExample {}        

โ†’ ์ •์˜ํ•œ ์–ด๋…ธํ…Œ์ด์…˜์€ ์ฝ”๋“œ์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‚ฌ์šฉ!
  • ๋˜ํ•œ, ์–ด๋…ธํ…Œ์ด์…˜์€ ์†์„ฑ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์œผ๋ฉฐ ์†์„ฑ์€ ํƒ€์ž…๊ณผ ์ด๋ฆ„์œผ๋กœ ๊ตฌ์„ฑ๋˜๋ฉฐ ์ด๋ฆ„ ๋’ค์— ๊ด„ํ˜ธ๋ฅผ ๋ถ™์ธ๋‹ค.

 

  • ์†์„ฑ์˜ ๊ธฐ๋ณธ๊ฐ’์€ default ํ‚ค์›Œ๋“œ๋กœ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.
[์˜ˆ์‹œ]
public @interface AnnotationName {
    String prop1();                
    int prop2() default 1;
}

@AnnotationName(prop1 = โ€œ๊ฐ’โ€)            
โ†’ prop1์€ ๊ธฐ๋ณธ๊ฐ’์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ˜๋“œ์‹œ ๊ฐ’์„ ๊ธฐ์ˆ ํ•ด์•ผ ํ•˜๊ณ 

@AnnotationName(prop1 = โ€œ๊ฐ’โ€, prop2 = 3)    
โ†’ prop2๋Š” ๊ธฐ๋ณธ๊ฐ’์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ƒ๋žต ๊ฐ€๋Šฅํ•˜๋‹ค.


[์˜ˆ์‹œ]
public @interface AnnotationName {
    String value();                
    int prop2() default 1;        
}

โ†’ value๋Š” ์–ด๋…ธํ…Œ์ด์…˜์˜ ๊ธฐ๋ณธ ์†์„ฑ์œผ๋กœ value ์†์„ฑ์„ ๊ฐ€์ง„ ์–ด๋…ธํ…Œ์ด์…˜์„ ์ฝ”๋“œ์—์„œ
   ์‚ฌ์šฉํ•  ๋•Œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ๊ฐ’๋งŒ ๊ธฐ์ˆ ํ•  ์ˆ˜ ์žˆ๋‹ค.

@AnnotationName(โ€œ๊ฐ’โ€);                
โ†’ ์ด ๊ฐ’์€ value ์†์„ฑ์— ์ž๋™์œผ๋กœ ๋Œ€์ž…๋œ๋‹ค.

@AnnotationName(value=โ€œ๊ฐ’โ€, prop2=3);        
โ†’ ํ•˜์ง€๋งŒ value ์†์„ฑ๊ณผ ๋‹ค๋ฅธ ์†์„ฑ์˜ ๊ฐ’์„ ๋™์‹œ์— ์ฃผ๊ณ  ์‹ถ๋‹ค๋ฉด value ์†์„ฑ๋ช…์„ ์ ์–ด์ค˜์•ผ ํ•จ

(3) ์–ด๋…ธํ…Œ์ด์…˜ ์ ์šฉ ๋Œ€์ƒ

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

 

  • ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋Œ€์ƒ์˜ ์ข…๋ฅ˜๋Š” ElementType ์—ด๊ฑฐ ์ƒ์ˆ˜๋กœ ์ •์˜๋˜์–ด ์žˆ๋‹ค.

Element.TYPE : ํด๋ž˜์Šค, ์ธํ„ฐํŽ˜์ด์Šค, ์—ด๊ฑฐ ํƒ€์ž…
Element.ANNOTATION_TYPE : ์–ด๋…ธํ…Œ์ด์…˜
Element.FIELD : ํ•„๋“œ
Element.CONSTRUCTOR : ์ƒ์„ฑ์ž
Element.METHOD : ๋ฉ”์†Œ๋“œ
Element.LOCAL_VARIABLE : ๋กœ์ปฌ ๋ณ€์ˆ˜
Element.PACKAGE : ํŒจํ‚ค์ง€

 

@Target( { Element.TYPE, Element.FIELD, Element.METHOD } )
public @interface AnnotationName { }
  • ์ ์šฉ ๋Œ€์ƒ์„ ์ง€์ •ํ•  ๋•Œ์—๋Š” โ€œ@Targetโ€ ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•˜๋ฉฐ @Target์˜ ๊ธฐ๋ณธ ์†์„ฑ์ธ value๋Š” ElementType ๋ฐฐ์—ด์„ ๊ฐ’์œผ๋กœ ๊ฐ€์ง„๋‹ค.

 

  • ์ด๊ฒƒ์€ ์ ์šฉ ๋Œ€์ƒ์„ ๋ณต์ˆ˜ ๊ฐœ๋กœ ์ง€์ •ํ•˜๊ธฐ ์œ„ํ•จ์ด๋ฉฐ ์œ„์˜ ์–ด๋…ธํ…Œ์ด์…˜์€ ํด๋ž˜์Šค, ํ•„๋“œ, ๋ฉ”์†Œ๋“œ์— ํ•ด๋‹น ์–ด๋…ธํ…Œ์ด์…˜์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ๊ณ  ๊ทธ ์™ธ์— ์ƒ์„ฑ์ž, ํŒจํ‚ค์ง€ ๋“ฑ์—๋Š” ์ ์šฉํ•  ์ˆ˜ ์—†๋‹ค.

 

(4) ์–ด๋…ธํ…Œ์ด์…˜ ์œ ์ง€ ์ •์ฑ…

  • ์–ด๋…ธํ…Œ์ด์…˜์„ ์ •์˜ํ•  ๋•Œ, ํ•œ ๊ฐ€์ง€ ๋” ์ค‘์š”ํ•œ ๊ฒƒ์€ @AnnotationName์„ ์–ธ์ œ๊นŒ์ง€ ์œ ์ง€ํ•  ๊ฒƒ์ธ์ง€๋ฅผ ์ง€์ •ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

 

  • ์–ด๋…ธํ…Œ์ด์…˜ ์œ ์ง€ ์ •์ฑ…์€ RetentionPolicy ์—ด๊ฑฐ ์ƒ์ˆ˜๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •์˜๋˜์–ด ์žˆ๋‹ค.

@Target( { Element.TYPE, Element.FIELD, Element.METHOD } )
@Retention( RetentionPolicy.RUNTIME )
public @interface AnnotationName { }
  • ์œ ์ง€ ์ •์ฑ…์„ ์ง€์ •ํ•  ๋•Œ์—๋Š” โ€œ@Retentionโ€ ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•˜๋ฉฐ @Retention์˜ ๊ธฐ๋ณธ ์†์„ฑ์ธ value๋Š” RetentionPolicy ์—ด๊ฑฐ ์ƒ์ˆ˜ ๊ฐ’์„ ๊ฐ€์ง„๋‹ค.

 

[Reference]

  • ์ด๊ฒƒ์ด ์ž๋ฐ”๋‹ค ๊ฐœ์ •ํŒ
๋ฐ˜์‘ํ˜•

'๐Ÿง Programming > Java' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

์ œ๋„ค๋ฆญ (3) - ์ œ๋„ค๋ฆญ ํด๋ž˜์Šค์™€ ์ œ๋„ค๋ฆญ ๋ฉ”์†Œ๋“œ  (0) 2023.07.22
์ œ๋„ค๋ฆญ (2) - ์ œ๋„ค๋ฆญ & ํƒ€์ž… ํŒŒ๋ผ๋ฏธํ„ฐ  (0) 2023.07.22
์ œ๋„ค๋ฆญ (1) - ์ œ๋„ค๋ฆญ์„ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ   (1) 2023.07.22
๋ฆฌํ”Œ๋ ‰์…˜ (Reflection)  (0) 2023.07.22
(Java) JDK ๋ฐ IntelliJ ์„ค์น˜ํ•˜๊ธฐ  (2) 2023.04.07
  1. (1) ์–ด๋…ธํ…Œ์ด์…˜์ด๋ž€
  2. (2) ์–ด๋…ธํ…Œ์ด์…˜ ํƒ€์ž… ์ •์˜์™€ ์ ์šฉ
  3. (3) ์–ด๋…ธํ…Œ์ด์…˜ ์ ์šฉ ๋Œ€์ƒ
  4. (4) ์–ด๋…ธํ…Œ์ด์…˜ ์œ ์ง€ ์ •์ฑ…
'๐Ÿง Programming/Java' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • ์ œ๋„ค๋ฆญ (2) - ์ œ๋„ค๋ฆญ & ํƒ€์ž… ํŒŒ๋ผ๋ฏธํ„ฐ
  • ์ œ๋„ค๋ฆญ (1) - ์ œ๋„ค๋ฆญ์„ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ 
  • ๋ฆฌํ”Œ๋ ‰์…˜ (Reflection)
  • (Java) JDK ๋ฐ IntelliJ ์„ค์น˜ํ•˜๊ธฐ
KR_DEV
KR_DEV
๊ณต๋ถ€์šฉ ๋ธ”๋กœ๊ทธ์ž…๋‹ˆ๋‹ค. :)
๋ฐ˜์‘ํ˜•
KR_DEV
All about IT
KR_DEV
์ „์ฒด
์˜ค๋Š˜
์–ด์ œ
  • ์ „์ฒด (139)
    • ๐Ÿ“š ์—ฐ์žฌ ์‹œ๋ฆฌ์ฆˆ (19)
      • ์ฃผ๋‹ˆ์–ด ๊ฐœ๋ฐœ์ž๊ฐ€ ์•Œ๋ฉด ์ข‹์„ ๋‚ด์šฉ (11)
      • ์ž์ฃผ ์“ฐ์ด๋Š” IT ์šฉ์–ด ์ •๋ฆฌ (6)
      • ์žก๋‹คํ•œ IT ์ •๋ณด (2)
    • ๐ŸŽฎ Toy Project (1)
    • ๐Ÿ’ฏ Coding Test (35)
      • ์•Œ๊ณ ๋ฆฌ์ฆ˜ ํ…Œ์ŠคํŠธ (14)
      • SQL ํ…Œ์ŠคํŠธ (21)
    • ๐Ÿ’ป Computer Science (14)
      • Hardware (4)
      • Operating System (3)
      • Network (4)
      • Database (3)
      • Data Structures (0)
      • Algorithms (0)
    • ๐ŸŒ Front End (0)
      • HTML5 (0)
      • CSS3 (0)
    • ๐Ÿ‘จโ€๐Ÿ’ป Back End (30)
      • Spring (5)
      • MySQL (12)
      • Redis (3)
      • OOP (0)
      • Design Pattern (0)
      • HTTP (2)
      • Servlet (1)
      • JDBC (7)
      • MSA (0)
    • ๐Ÿ› ๏ธ Devops (12)
      • HAProxy (1)
      • Linux (6)
      • Virtual Machine (4)
      • Container (0)
      • Ansible (1)
    • ๐Ÿง Programming (20)
      • Java (10)
      • Python (10)
    • ๐ŸŒฅ๏ธ Cloud (2)
      • AWS (1)
      • Oracle Cloud (0)
    • ๐Ÿ’พ Storage (5)
      • MiniO (3)
    • ๐Ÿ” Security & Hacking (1)

๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

  • ํ™ˆ
  • ๋ฐฉ๋ช…๋ก

๊ณต์ง€์‚ฌํ•ญ

  • ๊ตฌ๊ธ€ ์• ๋“œ์„ผ์Šค ํ†ต๊ณผํ–ˆ๋„ค์š” !!!
  • ์•ˆ๋…•ํ•˜์„ธ์š”.

์ธ๊ธฐ ๊ธ€

hELLO ยท Designed By ์ •์ƒ์šฐ.v4.2.2
KR_DEV
์–ด๋…ธํ…Œ์ด์…˜ (Annotation)
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”

๊ฐœ์ธ์ •๋ณด

  • ํ‹ฐ์Šคํ† ๋ฆฌ ํ™ˆ
  • ํฌ๋Ÿผ
  • ๋กœ๊ทธ์ธ

๋‹จ์ถ•ํ‚ค

๋‚ด ๋ธ”๋กœ๊ทธ

๋‚ด ๋ธ”๋กœ๊ทธ - ๊ด€๋ฆฌ์ž ํ™ˆ ์ „ํ™˜
Q
Q
์ƒˆ ๊ธ€ ์“ฐ๊ธฐ
W
W

๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๊ธ€

๊ธ€ ์ˆ˜์ • (๊ถŒํ•œ ์žˆ๋Š” ๊ฒฝ์šฐ)
E
E
๋Œ“๊ธ€ ์˜์—ญ์œผ๋กœ ์ด๋™
C
C

๋ชจ๋“  ์˜์—ญ

์ด ํŽ˜์ด์ง€์˜ URL ๋ณต์‚ฌ
S
S
๋งจ ์œ„๋กœ ์ด๋™
T
T
ํ‹ฐ์Šคํ† ๋ฆฌ ํ™ˆ ์ด๋™
H
H
๋‹จ์ถ•ํ‚ค ์•ˆ๋‚ด
Shift + /
โ‡ง + /

* ๋‹จ์ถ•ํ‚ค๋Š” ํ•œ๊ธ€/์˜๋ฌธ ๋Œ€์†Œ๋ฌธ์ž๋กœ ์ด์šฉ ๊ฐ€๋Šฅํ•˜๋ฉฐ, ํ‹ฐ์Šคํ† ๋ฆฌ ๊ธฐ๋ณธ ๋„๋ฉ”์ธ์—์„œ๋งŒ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.