Skip to content

Latest commit

Β 

History

History
84 lines (52 loc) Β· 4.99 KB

File metadata and controls

84 lines (52 loc) Β· 4.99 KB

보좩 : λ¦¬ν”Œλ ‰μ…˜κ³Ό μ• λ„ˆν…Œμ΄μ…˜

1. μ• λ„ˆν…Œμ΄μ…˜μ€ 주석과 같은 의미라고 ν•˜λŠ”λ° λŸ°νƒ€μž„μ‹œ μ–΄λ–»κ²Œ μœ μ§€κ°€ 돼? 사라지지 μ•Šμ„κΉŒ?'

μ• λ„ˆν…Œμ΄μ…˜(annotation)은 μžλ°”μ—μ„œ μ†ŒμŠ€ μ½”λ“œμ— 뢀가적인 정보λ₯Ό μΆ”κ°€ν•˜λŠ” 메타데이터 역할을 ν•˜λŠ”λ°μš”, μ£Όμ„κ³ΌλŠ” 달리 컴파일 이후에도 νŠΉμ • μ• λ„ˆν…Œμ΄μ…˜μ€ κ·ΈλŒ€λ‘œ μœ μ§€λ˜μ–΄ λŸ°νƒ€μž„μ—μ„œ ν™œμš©λ  수 μžˆμŠ΅λ‹ˆλ‹€.

μžλ°” μ• λ„ˆν…Œμ΄μ…˜μ€ 크게 μ„Έ κ°€μ§€λ‘œ λ‚˜λ‰©λ‹ˆλ‹€.

  1. SOURCE: μ»΄νŒŒμΌλŸ¬μ—κ²Œλ§Œ 정보λ₯Ό μ œκ³΅ν•˜κ³  컴파일된 ν›„μ—λŠ” μ‚¬λΌμ§€λŠ” μ• λ„ˆν…Œμ΄μ…˜μž…λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, @OverrideλŠ” 컴파일 μ‹œμ—λ§Œ ν•„μš”ν•œ μ• λ„ˆν…Œμ΄μ…˜μ΄λΌ 컴파일 ν›„μ—λŠ” μ œκ±°λ©λ‹ˆλ‹€.
  2. CLASS: 컴파일된 ν›„ .class νŒŒμΌμ— μ €μž₯λ˜μ§€λ§Œ, λŸ°νƒ€μž„μ—μ„œλŠ” μ‚¬μš©λ˜μ§€ μ•ŠλŠ” μ• λ„ˆν…Œμ΄μ…˜μž…λ‹ˆλ‹€.
  3. RUNTIME: λŸ°νƒ€μž„ μ‹œμ—λ„ μœ μ§€λ˜μ–΄ λ¦¬ν”Œλ ‰μ…˜(reflection)을 톡해 μ ‘κ·Όν•  수 μžˆλŠ” μ• λ„ˆν…Œμ΄μ…˜μž…λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, Spring ν”„λ ˆμž„μ›Œν¬μ˜ μ• λ„ˆν…Œμ΄μ…˜(@Autowired, @Service λ“±)은 λŸ°νƒ€μž„ μ‹œ μ‚¬μš©λ˜κΈ° λ•Œλ¬Έμ— RUNTIME으둜 μ„€μ •λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€. 이듀은 λŸ°νƒ€μž„μ— λ¦¬ν”Œλ ‰μ…˜μ„ 톡해 접근이 κ°€λŠ₯ν•˜μ—¬ ν”„λ ˆμž„μ›Œν¬λ‚˜ λΌμ΄λΈŒλŸ¬λ¦¬μ—μ„œ μžλ™μœΌλ‘œ 객체λ₯Ό μ£Όμž…ν•˜κ±°λ‚˜ μ„€μ •ν•  λ•Œ ν™œμš©λ©λ‹ˆλ‹€.

μ΄λ ‡κ²Œ λŸ°νƒ€μž„μ— μœ μ§€λ˜λŠ” μ• λ„ˆν…Œμ΄μ…˜μ€ μžλ°” λ¦¬ν”Œλ ‰μ…˜ APIλ₯Ό 톡해 λ™μ μœΌλ‘œ 읽고 μ²˜λ¦¬ν•  수 μžˆμ–΄μ„œ, ν”„λ ˆμž„μ›Œν¬λ‚˜ λΌμ΄λΈŒλŸ¬λ¦¬μ—μ„œλŠ” μ½”λ“œμ˜ λ™μž‘μ„ μ œμ–΄ν•˜κ±°λ‚˜ μ„€μ •ν•˜λŠ” 데 자주 μ‚¬μš©ν•©λ‹ˆλ‹€.

2. λ¦¬ν”Œλ ‰μ…˜ apiκ°€ 뭔데 μ •ν™•νžˆ μ•Œλ €μ€˜

λ¦¬ν”Œλ ‰μ…˜(Reflection) APIλŠ” μžλ°”μ—μ„œ μ‹€ν–‰ 쀑인 ν”„λ‘œκ·Έλž¨μ΄ μžμ‹ μ˜ ꡬ쑰λ₯Ό μ‘°μ‚¬ν•˜κ³  μˆ˜μ •ν•  수 있게 ν•˜λŠ” κ°•λ ₯ν•œ κΈ°λŠ₯μž…λ‹ˆλ‹€. λ¦¬ν”Œλ ‰μ…˜μ„ 톡해 클래슀의 λ©”μ„œλ“œ, ν•„λ“œ, μƒμ„±μž 등에 λŒ€ν•œ 정보λ₯Ό μ–»κ³  λ™μ μœΌλ‘œ μ ‘κ·Όν•  수 μžˆμŠ΅λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, λ¦¬ν”Œλ ‰μ…˜μ„ 톡해 클래슀 이름을 μ•Œμ§€ λͺ»ν•˜λŠ” μƒνƒœμ—μ„œ νŠΉμ • 클래슀의 λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜κ±°λ‚˜ ν•„λ“œ 값을 읽고 μ“Έ 수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λŠ” λŸ°νƒ€μž„μ— λ™μ μœΌλ‘œ 객체λ₯Ό μƒμ„±ν•˜κ±°λ‚˜, λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜λŠ” 데 μœ μš©ν•©λ‹ˆλ‹€.

λ¦¬ν”Œλ ‰μ…˜ API의 μ£Όμš” ν΄λž˜μŠ€μ™€ κΈ°λŠ₯은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

1. Class 클래슀

μžλ°”μ˜ λͺ¨λ“  ν΄λž˜μŠ€λŠ” Class 클래슀의 μΈμŠ€ν„΄μŠ€λ₯Ό 톡해 κ·Έ 정보λ₯Ό μ°Έμ‘°ν•  수 μžˆμŠ΅λ‹ˆλ‹€. Class 객체λ₯Ό 톡해 λ©”μ„œλ“œ, ν•„λ“œ, μƒμ„±μž λ“± λ‹€μ–‘ν•œ 정보λ₯Ό 얻을 수 μžˆμŠ΅λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, SomeClass.class λ˜λŠ” Class.forName("νŒ¨ν‚€μ§€.ν΄λž˜μŠ€μ΄λ¦„")을 톡해 Class 객체λ₯Ό κ°€μ Έμ˜¬ 수 μžˆμŠ΅λ‹ˆλ‹€.

2. μ£Όμš” λ¦¬ν”Œλ ‰μ…˜ λ©”μ„œλ“œ

Class 객체λ₯Ό 톡해 μ‚¬μš©ν•  수 μžˆλŠ” μ£Όμš” λ©”μ„œλ“œλŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

  • getMethods() / getDeclaredMethods(): 클래슀의 λͺ¨λ“  λ©”μ„œλ“œ(λ˜λŠ” μ„ μ–Έλœ λ©”μ„œλ“œ)λ₯Ό κ°€μ Έμ˜΅λ‹ˆλ‹€.
  • getFields() / getDeclaredFields(): 클래슀의 λͺ¨λ“  ν•„λ“œ(λ˜λŠ” μ„ μ–Έλœ ν•„λ“œ)λ₯Ό κ°€μ Έμ˜΅λ‹ˆλ‹€.
  • getConstructors(): 클래슀의 μƒμ„±μž 정보λ₯Ό κ°€μ Έμ˜΅λ‹ˆλ‹€.
  • getAnnotations(): ν΄λž˜μŠ€μ— 적용된 μ• λ„ˆν…Œμ΄μ…˜μ„ κ°€μ Έμ˜΅λ‹ˆλ‹€.

3. λ¦¬ν”Œλ ‰μ…˜μ˜ 동적 객체 생성 및 λ©”μ„œλ“œ 호좜

λ¦¬ν”Œλ ‰μ…˜μ„ 톡해 λ™μ μœΌλ‘œ 객체λ₯Ό μƒμ„±ν•˜κ³ , λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•  수 μžˆμŠ΅λ‹ˆλ‹€.

  • newInstance(): λ¦¬ν”Œλ ‰μ…˜μ„ 톡해 λ™μ μœΌλ‘œ 객체λ₯Ό μƒμ„±ν•©λ‹ˆλ‹€.
  • invoke(): λ¦¬ν”Œλ ‰μ…˜μ„ μ‚¬μš©ν•˜μ—¬ λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•©λ‹ˆλ‹€.

λ¦¬ν”Œλ ‰μ…˜μ˜ 예제 μ½”λ“œ

λ‹€μŒμ€ κ°„λ‹¨ν•œ λ¦¬ν”Œλ ‰μ…˜ μ‚¬μš© μ˜ˆμ œμž…λ‹ˆλ‹€.

import java.lang.reflect.Method;

public class ReflectionExample {
    public static void main(String[] args) {
        try {
            // Class 객체λ₯Ό μ–»μŒ
            Class<?> clazz = Class.forName("mypackage.MyClass");
            
            // μΈμŠ€ν„΄μŠ€ 생성
            Object obj = clazz.getDeclaredConstructor().newInstance();

            // λ©”μ„œλ“œ 호좜
            Method method = clazz.getMethod("myMethod", String.class);
            method.invoke(obj, "Hello, Reflection!");

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

이 μ˜ˆμ œμ—μ„œλŠ” MyClass 클래슀의 myMethod λ©”μ„œλ“œλ₯Ό λŸ°νƒ€μž„μ— λ™μ μœΌλ‘œ ν˜ΈμΆœν•©λ‹ˆλ‹€. λ¦¬ν”Œλ ‰μ…˜ APIλ₯Ό μ‚¬μš©ν•˜λ©΄ 이처럼 컴파일 μ‹œμ μ— ν΄λž˜μŠ€λ‚˜ λ©”μ„œλ“œμ— λŒ€ν•œ 정보λ₯Ό μ•Œμ§€ λͺ»ν•΄λ„ λŸ°νƒ€μž„μ— 이λ₯Ό μ°Ύμ•„λ‚΄κ³  μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

λ¦¬ν”Œλ ‰μ…˜μ˜ μž₯단점

μž₯점:

  • μœ μ—°ν•˜κ³  동적인 μ½”λ“œ μž‘μ„±μ΄ κ°€λŠ₯함.
  • λŸ°νƒ€μž„μ— 클래슀 ꡬ쑰λ₯Ό μ‘°μ‚¬ν•˜κ³  ν™œμš©ν•  수 μžˆμ–΄ ν”„λ ˆμž„μ›Œν¬λ‚˜ 라이브러리 섀계에 ν•„μˆ˜μ μž„.

단점:

  • μ„±λŠ₯이 μ €ν•˜λ  수 있음.
  • μΊ‘μŠν™”λ₯Ό μœ„λ°˜ν•  수 μžˆμ–΄ 잘λͺ» μ‚¬μš©ν•  경우 λ³΄μ•ˆ 취약점이 생길 수 있음.

λ¦¬ν”Œλ ‰μ…˜μ€ κ°•λ ₯ν•˜μ§€λ§Œ λ³΅μž‘λ„μ™€ μ„±λŠ₯ μ €ν•˜κ°€ 수반될 수 μžˆμ–΄ ν•„μš”ν•œ κ²½μš°μ— μ‹ μ€‘ν•˜κ²Œ μ‚¬μš©ν•˜λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€.