BackEnd/SpringBoot

[Spring] μ–΄λ…Έν…Œμ΄μ…˜μ˜ μ •μ˜μ™€ λ™μž‘μ›λ¦¬

hyunki.Dev 2023. 9. 18. 14:31

πŸ“Œ λ“€μ–΄κ°€λ©°

SpringBootλ₯Ό μ΄μš©ν•΄ κ°œλ°œμ„ ν•˜λ‹€λ³΄λ©΄ 정말 많이 μ‚¬μš©ν•˜κ²Œ λ˜λŠ” 것 쀑 ν•˜λ‚˜κ°€ μ–΄λ…Έν…Œμ΄μ…˜μž…λ‹ˆλ‹€. μ’…λ₯˜λ„ 맀우 λ‹€μ–‘ν•˜λ©°(@RestController, @Component.. λ“±) Personal μ–΄λ…Έν…Œμ΄μ…˜μ„ λ§Œλ“€ μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€. μ˜€λŠ˜μ€ μ΄λŸ¬ν•œ Springμ—μ„œ μ–΄λ…Έν…Œμ΄μ…˜μ˜ μ •μ˜μ™€ λ™μž‘μ›λ¦¬μ— λŒ€ν•΄μ„œ μ•Œμ•„λ³΄λ„λ‘ ν•˜κ² μŠ΅λ‹ˆλ‹€.

 

πŸ“Œ Annotation 의 μ •μ˜

μ–΄λ…Έν…Œμ΄μ…˜μ— λŒ€ν•œ μ •μ˜λ₯Ό μžλ°” 곡식 λ¬Έμ„œμ—μ„œ 찾아보면

 

https://docs.oracle.com/javase/tutorial/java/annotations/

 

Lesson: Annotations (The Java™ Tutorials > Learning the Java Language)

The Java Tutorials have been written for JDK 8. Examples and practices described in this page don't take advantage of improvements introduced in later releases and might use technology no longer available. See Java Language Changes for a summary of updated

docs.oracle.com

 

Annotations, a form of metadata, provide data about a program that is not 
part of the program itserlf. Annotaions have no direct effect on the operation of the code they annotate.

 

사전적인 μ˜λ―Έλ‘œλŠ” 주석을 λœ»ν•˜λ©° 즉, μ½”λ“œ 사이에 μ£Όμ„μ²˜λŸΌ μ“°μ΄λ©΄μ„œ νŠΉλ³„ν•œ 의미, κΈ°λŠ₯을 μˆ˜ν–‰ν•˜λ„λ‘ ν•˜λŠ” 기술둜 

μ½”λ“œμ˜ λ™μž‘μ—λŠ” μ§μ ‘μ μœΌλ‘œ 영ν–₯을 주지 μ•Šκ³ 

ν”„λ‘œκ·Έλž¨μ—κ²Œ 좔가적인 정보λ₯Ό μ œκ³΅ν•΄μ£ΌλŠ” 메타 λ°μ΄ν„°μž…λ‹ˆλ‹€.

 

일반적으둜 μ•„λž˜μ™€ 같은 μ„Έ 가지 μš©λ„λ‘œ ν™œμš©λ©λ‹ˆλ‹€.

  • μ»΄νŒŒμΌλŸ¬μ—κ²Œ μ½”λ“œ μž‘μ„± 문법 μ—λŸ¬λ₯Ό μ²΄ν¬ν•˜λ„λ‘ 정보λ₯Ό 제곡
  • μ†Œν”„νŠΈμ›¨μ–΄ 개발툴이 λΉŒλ“œλ‚˜ 배치 μ‹œ μ½”λ“œλ₯Ό μžλ™μœΌλ‘œ 생성할 수 μžˆλ„λ‘ 정보λ₯Ό 제곡
  • λŸ°νƒ€μž„ μ‹œ νŠΉμ • κΈ°λŠ₯을 μ‹€ν–‰ν•˜λ„λ‘ 정보λ₯Ό 제곡

 

πŸ“Œ Annotation 파일 μ •μ˜ν•˜κΈ°

@Target({ElementType.[μ μš©λŒ€μƒ]})
@Retention(RetentionPolicy.[μ •λ³΄μœ μ§€λ˜λŠ” λŒ€μƒ])
public @interface [μ–΄λ…Έν…Œμ΄μ…˜ 이름]{
    ...
}

μ–΄λ…Έν…Œμ΄μ…˜ νŒŒμΌμ€ μœ„μ™€ 같이 μ •μ˜ν•˜λ©° 각 상황에 맞게 ν•„μš”μ— 따라 μ μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

Target μ„€μ •

ElementType Enum κ°’
ANNOTATION_TYPE μ–΄λ…Έν…Œμ΄μ…˜ μ„ μ–Έ
CONSTRUCTOR μƒμ„±μž μ„ μ–Έ
FIELD ν•„λ“œ μ„ μ–Έ (μ—΄κ±° ν˜• μƒμˆ˜ 포함)
LOCAL_VARIABLE 지역 λ³€μˆ˜ μ„ μ–Έ
METHOD λ©”μ„œλ“œ μ„ μ–Έ
PACKAGE νŒ¨ν‚€μ§€ μ„ μ–Έ
PARAMETER Public Parameter
TYPE 클래슀, μΈν„°νŽ˜μ΄μŠ€(주석 μœ ν˜• 포함) λ˜λŠ” μ—΄κ±° ν˜• μ„ μ–Έ
TYPE_PARAMETER Type νŒŒλΌλ―Έν„° μ„ μ–Έ (java 8에 μΆ”κ°€)
TYPE_USE Type 이 μƒμš”λ˜λŠ” κ³³ (java 8dp μΆ”κ°€)

 

Retention μ„€μ •

RetentionPolicy Enum κ°’
CLASS μ»΄νŒŒμΌλŸ¬μ— μ˜ν•΄ 클래슀 νŒŒμΌμ— κΈ°λ‘λ˜μ§€λ§Œ
λŸ°νƒ€μž„μ—λŠ” μœ μ§€λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
RUNTIME μ»΄νŒŒμΌλŸ¬μ— μ˜ν•΄ 클래슀 νŒŒμΌμ— 기둝되고
λŸ°νƒ€μž„μ— μœ μ§€λ©λ‹ˆλ‹€.
SOURCE μ†ŒμŠ€μ—λ§Œ λ°˜μ˜λ˜μ–΄ μ»΄νŒŒμΌλŸ¬μ— μ˜ν•΄ μ‚­μ œλ©λ‹ˆλ‹€.

 

πŸ“Œ Annotation의 λ™μž‘μ›λ¦¬

Annotation 의 λ™μž‘μ›λ¦¬λŠ” μ•„λž˜ κ·Έλ¦Όκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

 

Annotation Processorκ°€ ν•΄λ‹Ή Annotation κ³Ό Annotation이 뢙은 뢀뢄을 μˆ˜μ§‘ν•΄μ„œ byte codeλ₯Ό λ§Œλ“€κ³  .class νŒŒμΌμ„ λ§Œλ“­λ‹ˆλ‹€.

이 κ³Όμ •μ—μ„œ ParserλŠ” μˆ˜μ§‘(μ‹€ν–‰)λ˜μ§€ μ•Šμ€ Annotation Processor κ°€ μžˆλŠ”μ§€ ν™•μΈν•œ ν›„ 

λͺ¨λ‘ μˆ˜ν–‰ν•  λ•ŒκΉŒμ§€ μž‘μ—…μ„ λ°˜λ³΅ν•©λ‹ˆλ‹€.

 

Oracle 은 Processing 의 반볡 횟수λ₯Ό Round 라고 λΆ€λ¦…λ‹ˆλ‹€. ν•œ Roundμ—μ„œλŠ” ν•˜λ‚˜μ˜ Annotation을 톡해 

Boilerplate codeλ₯Ό λ§Œλ“€κ³  λ‚˜μ„œ λ‹€μ‹œ Parserκ°€ 검사λ₯Ό ν•˜λŠ”λ° μ΄λ•Œ Annotation이 μ€‘μ²©λ˜μ–΄ μžˆλŠ” 경우

아직 λ™μž‘ν•˜μ§€ μ•Šμ€(Boilerplate codeλ₯Ό λ§Œλ“€μ§€ μ•Šμ€) Annotation이 μžˆμ„ 수 있기 λ•Œλ¬Έμž…λ‹ˆλ‹€.

 

.class νŒŒμΌμ„ 기반으둜 jvm 의 클래슀 λ‘œλ”μ— μ˜¬λΌκ°€λŠ”λ° 그전에 annotation 이 뢙은 μ½”λ“œλ“€μ΄ 잘 λ°”λ€Œμ–΄μ•Ό ν•©λ‹ˆλ‹€.

 

 

 

μ°Έκ³ :

https://hirlawldo.tistory.com/43

https://velog.io/@gale4739/Spring-Boot-%EC%96%B4%EB%85%B8%ED%85%8C%EC%9D%B4%EC%85%98

https://developer-youn.tistory.com/122

https://honeyinfo7.tistory.com/56