λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

빈 ꡬ멍 μ±„μš°κΈ°

[Java] μ–΄λ…Έν…Œμ΄μ…˜

좜처

Gemini


μ–΄λ…Έν…Œμ΄μ…˜(Annotation)μ΄λž€

μžλ°” μ†ŒμŠ€ μ½”λ“œμ— μΆ”κ°€ν•˜μ—¬ νŠΉμ • 정보λ₯Ό μ œκ³΅ν•˜λŠ” λ©”νƒ€λ°μ΄ν„°μ˜ 일쒅이닀. μ΄λŸ¬ν•œ λ©”νƒ€λ°μ΄ν„°λŠ” 컴파일러, 개발 도ꡬ, λ˜λŠ” λŸ°νƒ€μž„ μ‹œμŠ€ν…œμ— μ˜ν•΄ μ½ν˜€μ Έ λ‹€μ–‘ν•œ μš©λ„λ‘œ ν™œμš©λ  수 μžˆλ‹€. 마치 ν¬μŠ€νŠΈμž‡μ²˜λŸΌ μ½”λ“œμ— λ©”λͺ¨λ₯Ό λΆ™μ—¬ λ†“λŠ” 것과 λΉ„μŠ·ν•˜λ‹€κ³  μƒκ°ν•˜λ©΄ 쉽닀.

 

νŠΉμ§•

선언적 ν”„λ‘œκ·Έλž˜λ°

μ½”λ“œμ— λŒ€ν•œ 정보λ₯Ό λͺ…μ‹œμ μœΌλ‘œ μ„ μ–Έν•˜μ—¬ μ½”λ“œμ˜ 가독성을 높이고 μœ μ§€λ³΄μˆ˜λ₯Ό μš©μ΄ν•˜κ²Œ ν•œλ‹€.

메타데이터 제곡

컴파일러, IDE, ν”„λ ˆμž„μ›Œν¬ 등에 좔가적인 정보λ₯Ό μ œκ³΅ν•˜μ—¬ λ”μš± μ •κ΅ν•œ 처리λ₯Ό κ°€λŠ₯ν•˜κ²Œ ν•œλ‹€.

μ½”λ“œμ— 영ν–₯을 λ―ΈμΉ˜μ§€ μ•ŠμŒ

μ–΄λ…Έν…Œμ΄μ…˜ μžμ²΄λŠ” μ‹€ν–‰ μ½”λ“œμ— 직접적인 영ν–₯을 λ―ΈμΉ˜μ§€ μ•Šμ§€λ§Œ, 컴파일 μ‹œμ μ΄λ‚˜ λŸ°νƒ€μž„ μ‹œμ μ— νŠΉμ • ν–‰μœ„λ₯Ό μœ λ°œν•  수 μžˆλ‹€.

 

μ’…λ₯˜

ν‘œμ€€ μ–΄λ…Έν…Œμ΄μ…˜

μžλ°”μ—μ„œ 기본적으둜 μ œκ³΅λ˜λŠ” μ–΄λ…Έν…Œμ΄μ…˜. @Override, @Deprecated, @SuppressWarnings 등이 μžˆλ‹€.

메타 μ–΄λ…Έν…Œμ΄μ…˜

λ‹€λ₯Έ μ–΄λ…Έν…Œμ΄μ…˜μ„ μ •μ˜ν•˜κΈ° μœ„ν•œ μ–΄λ…Έν…Œμ΄μ…˜. @Target, @Retention, @Documented 등이 μžˆλ‹€.

μ‚¬μš©μž μ •μ˜ μ–΄λ…Έν…Œμ΄μ…˜

κ°œλ°œμžκ°€ 직접 μ •μ˜ν•˜μ—¬ μ‚¬μš©ν•˜λŠ” μ–΄λ…Έν…Œμ΄μ…˜.

 

ν™œμš©

컴파일러 μ§€μ‹œ

μ»΄νŒŒμΌλŸ¬μ—κ²Œ νŠΉμ • μ½”λ“œμ— λŒ€ν•œ 좔가적인 κ²€μ‚¬λ‚˜ 처리λ₯Ό μ§€μ‹œν•œλ‹€.

IDE 지원

IDEμ—μ„œ μ½”λ“œ μžλ™ μ™„μ„±, λ¦¬νŒ©ν† λ§ 등을 μ§€μ›ν•˜λŠ” 데 μ‚¬μš©λœλ‹€.

ν”„λ ˆμž„μ›Œν¬ 연동

μŠ€ν”„λ§ ν”„λ ˆμž„μ›Œν¬μ™€ 같은 ν”„λ ˆμž„μ›Œν¬μ—μ„œ 빈 μ„€μ •, AOP 등을 μœ„ν•œ λ©”νƒ€λ°μ΄ν„°λ‘œ ν™œμš©λœλ‹€.

  • κ΄€λ ¨ κΈ€ -> [μš©μ–΄] AOP Aspect Oriented Programming
  • μ–΄λ…Έν…Œμ΄μ…˜μ€ AOP의 핡심 κΈ°λŠ₯인 ν¬μΈνŠΈμ»·μ„ μ§€μ •ν•˜κ³ , μ–΄λ“œλ°”μ΄μŠ€λ₯Ό μ„€μ •ν•˜λŠ” 데 μ‚¬μš©λ˜λŠ” 메타데이터이닀.

λΉŒλ“œ 도ꡬ μ„€μ •

λΉŒλ“œ 도ꡬ(Maven, Gradle)μ—μ„œ ν”„λ‘œμ νŠΈ λΉŒλ“œ 섀정을 μœ„ν•œ 정보λ₯Ό μ œκ³΅ν•œλ‹€.

λŸ°νƒ€μž„ μ‹œμŠ€ν…œ

λŸ°νƒ€μž„ μ‹œμŠ€ν…œμ—μ„œ 객체 직렬화, λ¦¬ν”Œλ ‰μ…˜ 등을 μœ„ν•œ 정보λ₯Ό μ œκ³΅ν•œλ‹€.

 

μž₯점

μ½”λ“œ 가독성 ν–₯상

μ½”λ“œμ˜ μ˜λ„λ₯Ό λͺ…ν™•ν•˜κ²Œ ν‘œν˜„ν•˜μ—¬ μ½”λ“œλ₯Ό μ΄ν•΄ν•˜κΈ° μ‰½κ²Œ λ§Œλ“ λ‹€.

μœ μ§€λ³΄μˆ˜μ„± ν–₯상

μ½”λ“œ λ³€κ²½ μ‹œ μ–΄λ…Έν…Œμ΄μ…˜μ„ 톡해 κ΄€λ ¨ 뢀뢄을 μ‰½κ²Œ μ°Ύμ•„ μˆ˜μ •ν•  수 μžˆλ‹€.

μž¬μ‚¬μš©μ„± 증가

μ–΄λ…Έν…Œμ΄μ…˜μ„ 톡해 곡톡적인 κΈ°λŠ₯을 μΆ”μΆœν•˜μ—¬ μž¬μ‚¬μš©ν•  수 μžˆλ‹€.

ν™•μž₯μ„±

μ‚¬μš©μž μ •μ˜ μ–΄λ…Έν…Œμ΄μ…˜μ„ 톡해 λ‹€μ–‘ν•œ κΈ°λŠ₯을 κ΅¬ν˜„ν•  수 μžˆλ‹€.

 

단점

1. κ³Όλ„ν•œ μ˜μ‘΄μ„±

  • 컴파일 μ‹œ 의쑴: μ–΄λ…Έν…Œμ΄μ…˜ ν”„λ‘œμ„Έμ„œκ°€ ν•„μš”ν•˜κΈ° λ•Œλ¬Έμ— 컴파일 과정이 λ³΅μž‘ν•΄μ§ˆ 수 μžˆλ‹€.
  • λŸ°νƒ€μž„ 의쑴: λŸ°νƒ€μž„ μ‹œ μ–΄λ…Έν…Œμ΄μ…˜ 값을 읽어와 λ‘œμ§μ„ λ³€κ²½ν•˜λŠ” 경우, μ–΄λ…Έν…Œμ΄μ…˜μ— λŒ€ν•œ μ˜μ‘΄μ„±μ΄ κ°•ν•΄μ Έ μœ μ§€ λ³΄μˆ˜κ°€ μ–΄λ €μ›Œμ§ˆ 수 μžˆλ‹€.

2. 가독성 μ €ν•˜

  • μ½”λ“œμ— 직접적인 영ν–₯을 λ―ΈμΉ˜μ§€ μ•Šμ§€λ§Œ, μ½”λ“œμ˜ 의미λ₯Ό νŒŒμ•…ν•˜λŠ” 데 λ°©ν•΄κ°€ 될 수 μžˆλ‹€. 특히, λ§Žμ€ μ–΄λ…Έν…Œμ΄μ…˜μ΄ μ‚¬μš©λ  경우 μ½”λ“œκ°€ λ³΅μž‘ν•΄ 보일 수 μžˆλ‹€.
  • μ–΄λ…Έν…Œμ΄μ…˜μ˜ 의미λ₯Ό μ •ν™•νžˆ νŒŒμ•…ν•˜κΈ° μœ„ν•΄ 좔가적인 λ¬Έμ„œν™”κ°€ ν•„μš”ν•˜λ‹€.

3. μ˜€λ²„ μ—”μ§€λ‹ˆμ–΄λ§

  • κ°„λ‹¨ν•œ λ‘œμ§μ— λΆˆν•„μš”ν•˜κ²Œ μ–΄λ…Έν…Œμ΄μ…˜μ„ μ‚¬μš©ν•˜λ©΄ 였히렀 μ½”λ“œλ₯Ό λ³΅μž‘ν•˜κ²Œ λ§Œλ“€ 수 μžˆλ‹€.
  • μ–΄λ…Έν…Œμ΄μ…˜μ„ λ‚¨μš©ν•˜λ©΄ μ½”λ“œμ˜ 가독성이 였히렀 λ–¨μ–΄μ§ˆ 수 μžˆλ‹€.

4. λŸ°νƒ€μž„ μ„±λŠ₯ μ €ν•˜:

  • μ–΄λ…Έν…Œμ΄μ…˜ 처리λ₯Ό μœ„ν•΄ 좔가적인 μ˜€λ²„ν—€λ“œκ°€ λ°œμƒν•  수 μžˆλ‹€. 특히, λ§Žμ€ μ–΄λ…Έν…Œμ΄μ…˜μ΄ μ‚¬μš©λ˜λŠ” 경우 μ„±λŠ₯ μ €ν•˜κ°€ λ°œμƒν•  수 μžˆλ‹€.

5. 툴 μ˜μ‘΄μ„±

  • μ–΄λ…Έν…Œμ΄μ…˜ ν”„λ‘œμ„Έμ„œμ™€ 같은 μ™ΈλΆ€ 도ꡬ에 μ˜μ‘΄ν•˜κΈ° λ•Œλ¬Έμ—, λ„κ΅¬μ˜ 버전 λ¬Έμ œλ‚˜ ν˜Έν™˜μ„± λ¬Έμ œκ°€ λ°œμƒν•  수 μžˆλ‹€.

6. ν…ŒμŠ€νŠΈμ˜ 어렀움

  • μ–΄λ…Έν…Œμ΄μ…˜ 기반의 μ½”λ“œλ₯Ό ν…ŒμŠ€νŠΈν•˜κΈ° μœ„ν•΄μ„œλŠ” μ–΄λ…Έν…Œμ΄μ…˜ ν”„λ‘œμ„Έμ„œλ₯Ό ν•¨κ»˜ μ‚¬μš©ν•΄μ•Ό ν•˜λŠ” κ²½μš°κ°€ λ§Žλ‹€. μ΄λŠ” ν…ŒμŠ€νŠΈ ν™˜κ²½ 섀정을 λ³΅μž‘ν•˜κ²Œ λ§Œλ“€ 수 μžˆλ‹€.

 

μ–΄λ…Έν…Œμ΄μ…˜μ„ 효과적으둜 μ‚¬μš©ν•˜κΈ° μœ„ν•œ 팁

ν•„μš”ν•œ κ²½μš°μ—λ§Œ μ‚¬μš©

λͺ¨λ“  상황에 μ–΄λ…Έν…Œμ΄μ…˜μ„ μ‚¬μš©ν•˜λŠ” 것은 λ°”λžŒμ§ν•˜μ§€ μ•Šλ‹€.

λͺ…ν™•ν•œ 의미 λΆ€μ—¬

μ–΄λ…Έν…Œμ΄μ…˜μ˜ 의미λ₯Ό λͺ…ν™•ν•˜κ²Œ μ •μ˜ν•˜κ³ , λ‹€λ₯Έ κ°œλ°œμžλ“€μ΄ μ‰½κ²Œ 이해할 수 μžˆλ„λ‘ λ¬Έμ„œν™”ν•΄μ•Ό ν•œλ‹€.

κ³Όλ„ν•œ μ‚¬μš© 자제

λ„ˆλ¬΄ λ§Žμ€ μ–΄λ…Έν…Œμ΄μ…˜μ„ μ‚¬μš©ν•˜λ©΄ μ½”λ“œ 가독성이 μ €ν•˜λ  수 μžˆμœΌλ―€λ‘œ μ μ ˆν•œ μˆ˜μ€€μ—μ„œ μ‚¬μš©ν•΄μ•Ό ν•œλ‹€.

ν…ŒμŠ€νŠΈ ν™˜κ²½ ꡬ좕

μ–΄λ…Έν…Œμ΄μ…˜ 기반의 μ½”λ“œλ₯Ό ν…ŒμŠ€νŠΈν•˜κΈ° μœ„ν•œ ν™˜κ²½μ„ 미리 ꡬ좕해 λ‘λŠ” 것이 μ’‹λ‹€.

툴 ν™œμš©

μ–΄λ…Έν…Œμ΄μ…˜ ν”„λ‘œμ„Έμ„œλ₯Ό 효과적으둜 ν™œμš©ν•˜κΈ° μœ„ν•œ νˆ΄μ„ μ‚¬μš©ν•˜λ©΄ 개발 생산성을 높일 수 μžˆλ‹€.

 

 

μ•Œλ©΄ 쒋은 μ–΄λ…Έν…Œμ΄μ…˜λ“€

1. ν‘œμ€€ μ–΄λ…Έν…Œμ΄μ…˜

@Override

λ©”μ„œλ“œκ°€ λΆ€λͺ¨ 클래슀의 λ©”μ„œλ“œλ₯Ό μ˜€λ²„λΌμ΄λ“œν–ˆμŒμ„ λ‚˜νƒ€λ‚Έλ‹€. μ»΄νŒŒμΌλŸ¬κ°€ μ˜€νƒ€λ‚˜ μ‹€μˆ˜λ₯Ό μž‘μ•„λ‚΄λŠ” 데 도움을 μ€€λ‹€.

@Deprecated

더 이상 μ‚¬μš©λ˜μ§€ μ•ŠλŠ” μš”μ†Œμž„μ„ λ‚˜νƒ€λ‚Έλ‹€. μ‚¬μš© μ‹œ 컴파일러 κ²½κ³ λ₯Ό λ°œμƒμ‹œμΌœ μ½”λ“œ μœ μ§€λ³΄μˆ˜μ— 도움을 μ€€λ‹€.

@SuppressWarnings

컴파일러 κ²½κ³ λ₯Ό μ–΅μ œν•œλ‹€. νŠΉμ • κ²½κ³  λ©”μ‹œμ§€κ°€ μ½”λ“œμ˜ 본질적인 문제λ₯Ό λ‚˜νƒ€λ‚΄μ§€ μ•Šμ„ λ•Œ μ‚¬μš©ν•œλ‹€.

 

2. 메타 μ–΄λ…Έν…Œμ΄μ…˜

@Target

μ–΄λ…Έν…Œμ΄μ…˜μ„ μ μš©ν•  수 μžˆλŠ” μœ„μΉ˜λ₯Ό μ§€μ •ν•©λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, 클래슀, λ©”μ„œλ“œ, ν•„λ“œ 등에 μ μš©ν•  수 μžˆλ‹€.

@Retention

μ–΄λ…Έν…Œμ΄μ…˜μ΄ μœ μ§€λ˜λŠ” μ‹œκΈ°λ₯Ό μ§€μ •ν•©λ‹ˆλ‹€. 컴파일 μ‹œ, 클래슀 파일, λŸ°νƒ€μž„ 쀑에 μœ μ§€λ  수 μžˆλ‹€.

@Documented

μ–΄λ…Έν…Œμ΄μ…˜μ΄ Javadoc에 ν¬ν•¨λ˜μ–΄ λ¬Έμ„œν™”λ  수 μžˆλ„λ‘ ν•œλ‹€.

 

3. 자주 μ‚¬μš©λ˜λŠ” ν”„λ ˆμž„μ›Œν¬ μ–΄λ…Έν…Œμ΄μ…˜

μŠ€ν”„λ§ ν”„λ ˆμž„μ›Œν¬

  • @Component: μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆμ— 빈으둜 λ“±λ‘ν•œλ‹€.
  • @Service: μ„œλΉ„μŠ€ κ³„μΈ΅μ˜ λΉˆμ„ λ‚˜νƒ€λ‚Έλ‹€.
  • @Repository: 데이터 μ ‘κ·Ό κ³„μΈ΅μ˜ λΉˆμ„ λ‚˜νƒ€λ‚Έλ‹€.
  • @Controller: μ›Ή κ³„μΈ΅μ˜ 컨트둀러λ₯Ό λ‚˜νƒ€λ‚Έλ‹€.
  • @Autowired: μ˜μ‘΄μ„± μ£Όμž…μ„ μœ„ν•œ μ–΄λ…Έν…Œμ΄μ…˜.

JPA

  • @Entity: μžλ°” 클래슀λ₯Ό λ°μ΄ν„°λ² μ΄μŠ€ ν…Œμ΄λΈ”κ³Ό λ§€ν•‘ν•œλ‹€.
  • @Id: μ—”ν‹°ν‹°μ˜ κΈ°λ³Έ ν‚€λ₯Ό λ‚˜νƒ€λ‚Έλ‹€.
  • @Column: ν…Œμ΄λΈ”μ˜ 컬럼과 λ§€ν•‘ν•œλ‹€.

JUnit

  • @Test: ν…ŒμŠ€νŠΈ λ©”μ†Œλ“œλ₯Ό λ‚˜νƒ€λ‚Έλ‹€..
  • @Before, @After: 각 ν…ŒμŠ€νŠΈ λ©”μ†Œλ“œ μ‹€ν–‰ 전후에 싀행될 λ©”μ†Œλ“œλ₯Ό μ§€μ •ν•œλ‹€.

 

μ‚¬μš©μž μ–΄λ…Έν…Œμ΄μ…˜μ΄ ν•„μš”μ„±

μ½”λ“œμ˜ μ˜λ„λ₯Ό λͺ…ν™•ν•˜κ²Œ ν‘œν˜„ν•˜κ³  싢을 λ•Œ

  • 예λ₯Ό λ“€μ–΄, νŠΉμ • λ©”μ†Œλ“œκ°€ 둜그λ₯Ό 남겨야 ν•œλ‹€κ±°λ‚˜, νŠΉμ • ν•„λ“œλŠ” ν•„μˆ˜ μž…λ ₯값인지λ₯Ό λͺ…μ‹œν•˜κ³  싢을 λ•Œ μ‚¬μš©μž μ •μ˜ μ–΄λ…Έν…Œμ΄μ…˜μ„ ν™œμš©ν•˜μ—¬ μ½”λ“œμ˜ μ˜λ„λ₯Ό λͺ…ν™•ν•˜κ²Œ λ“œλŸ¬λ‚Ό 수 μžˆλ‹€.

ν”„λ ˆμž„μ›Œν¬μ™€μ˜ 연동을 μœ„ν•œ μ„€μ •

  • μŠ€ν”„λ§ ν”„λ ˆμž„μ›Œν¬μ™€ 같은 ν”„λ ˆμž„μ›Œν¬μ—μ„œ 빈 μ„€μ •, AOP 등을 μœ„ν•œ λ©”νƒ€λ°μ΄ν„°λ‘œ ν™œμš©λœλ‹€. 예λ₯Ό λ“€μ–΄, μŠ€ν”„λ§ MVCμ—μ„œ @Controller, @Service, @Repository λ“±μ˜ μ–΄λ…Έν…Œμ΄μ…˜μ„ μ‚¬μš©ν•˜μ—¬ 각 κ³„μΈ΅μ˜ 역할을 λͺ…ν™•νžˆ κ΅¬λΆ„ν•˜κ³  μ˜μ‘΄μ„± μ£Όμž…μ„ μžλ™ν™”ν•œλ‹€.

μ½”λ“œ 검증

  • 컴파일 μ‹œμ μ΄λ‚˜ λŸ°νƒ€μž„ μ‹œμ μ— μ½”λ“œμ˜ μœ νš¨μ„±μ„ κ²€μ¦ν•˜λŠ” 데 μ‚¬μš©ν•  수 μžˆλ‹€. 예λ₯Ό λ“€μ–΄, νŠΉμ • ν•„λ“œμ— νŠΉμ • κ°’λ§Œ ν—ˆμš©ν•˜λ„λ‘ μ œν•œν•˜λŠ” μ–΄λ…Έν…Œμ΄μ…˜μ„ μ •μ˜ν•˜μ—¬ 였λ₯˜λ₯Ό 미리 방지할 수 μžˆλ‹€.

도ꡬ 지원

  • IDEλ‚˜ λΉŒλ“œ 도ꡬ와 같은 개발 λ„κ΅¬μ—μ„œ μ½”λ“œ 뢄석, μžλ™ μ™„μ„±, λ¦¬νŒ©ν† λ§ 등을 μ§€μ›ν•˜λŠ” 데 μ‚¬μš©λœλ‹€.

 

 

μ‚¬μš©μž μ–΄λ…Έν…Œμ΄μ…˜ μ˜ˆμ‹œ

둜그 남기기

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Loggable {
}

@Loggable
public void someMethod() {
    // ...
}

 

μœ„ μ˜ˆμ‹œμ—μ„œλŠ” @Loggable μ–΄λ…Έν…Œμ΄μ…˜μ„ μ‚¬μš©ν•˜μ—¬ ν•΄λ‹Ή λ©”μ†Œλ“œμ— λŒ€ν•œ 둜그λ₯Ό 남겨야 함을 λͺ…μ‹œμ μœΌλ‘œ ν‘œν˜„ν–ˆλ‹€. AOPλ₯Ό ν™œμš©ν•˜μ—¬ μ–΄λ…Έν…Œμ΄μ…˜μ΄ 뢙은 λ©”μ†Œλ“œ μ‹€ν–‰ 전후에 둜그λ₯Ό λ‚¨κΈ°λŠ” κΈ°λŠ₯을 κ΅¬ν˜„ν•  수 μžˆλ‹€.

 

ν•„μˆ˜ μž…λ ₯κ°’ 검증

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface Required {
}

public class User {
    @Required
    private String name;
    // ...
}

 

μœ„ μ˜ˆμ‹œμ—μ„œλŠ” @Required μ–΄λ…Έν…Œμ΄μ…˜μ„ μ‚¬μš©ν•˜μ—¬ name ν•„λ“œκ°€ ν•„μˆ˜ μž…λ ₯κ°’μž„μ„ λ‚˜νƒ€λ‚Έλ‹€. 데이터 검증 λ‘œμ§μ—μ„œ 이 μ–΄λ…Έν…Œμ΄μ…˜μ„ μ°Έκ³ ν•˜μ—¬ ν•„μˆ˜ ν•„λ“œκ°€ μž…λ ₯λ˜μ—ˆλŠ”μ§€ 확인할 수 μžˆλ‹€.

 

μ»€μŠ€ν…€ 데이터 ν˜•μ‹

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface Email {
}

public class User {
    @Email
    private String email;
    // ...
}

 

μœ„ μ˜ˆμ‹œμ—μ„œλŠ” @Email μ–΄λ…Έν…Œμ΄μ…˜μ„ μ‚¬μš©ν•˜μ—¬ ν•΄λ‹Ή ν•„λ“œκ°€ 이메일 ν˜•μ‹μ΄μ–΄μ•Ό 함을 λ‚˜νƒ€λ‚Έλ‹€. 데이터 검증 λ‘œμ§μ—μ„œ 이 μ–΄λ…Έν…Œμ΄μ…˜μ„ μ°Έκ³ ν•˜μ—¬ 이메일 ν˜•μ‹μ΄ λ§žλŠ”μ§€ 확인할 수 μžˆλ‹€.

 

 

 

 


Gemini κΈ€μ˜ 좜처

https://knowledgebasement.com/how-to-create-custom-annotations-in-java/

 

How to Create Custom Annotations in Java

In Java, annotations are a form of metadata that provide additional information about program elements such as classes, methods, fields, and parameters. Annotations are defined using the '@' symbol followed by an annotation name and can be added to a progr

knowledgebasement.com