ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Spring] 동적 프록시 기술 - 리플렉션
    Spring 2022. 6. 16. 21:52

    이전 프록시 패턴과 데코레이터 페턴을 통해 공부했듯이

    프록시를 활용한다면 기존 코드를 변경하지 않고 새로운 기능을 추가할 수 있었다.

    하지만 프록시를 적용하기 위해 해당 기능을 적용할 클래스의 개수만큼 프록시 클래스를 생성해야하고

    생성된 프록시 클래스가 같은 기능을 가지고 있다면 그 모습이 같았다.

     

    따라서 같은 기능을 실행하는 프록시 클래스 클래스의 경우 동적으로 대상이 결정된다면

    위의 문제들을 해결할 수 있을 것 같다.

    그리고 이러한 동적 프록시 기술은 JDK 동적 프록시 기술이나 CGLIB와 같은 프록시 생성 기술을 통해

    만들어 낼 수 있다.

     

    자바 리플렉션 이란?

    log.info("반복되는 코드1");
    /* 반복되지 않는 코드 */
    log.info("반복되는 코드2");

    만약 위처럼 각 메서드, 클래스에서 반복되는 코드 사이에

    반복되지 않는 코드가 껴있다면 해당 부분만 동적으로 변경하여 중복 코드를 제거할 수 있다.

    이때 리플렉션을 이용하면 클래스나 메서드의 메타정보를 활용하여 동적으로 코드를 변경할 수 있다.

     

    (람다 등을 활용해서 공통화 하는 것은 물론 가능하긴 하다. - 람다 실행 어라운드 패턴 참고)

     

    // 1. 클래스 정보를 가져온다.
    Class clazz = Class.forName("패키지.클래스");
    
    // 2. 메서드 정보를 가져온다.
    Method method = clazz.getMethod("메서드 이름");
    
    // 3. 메서드를 실행할 때에는 invoke 메서드를 호출한다.
    ClassSample sample = new ClassSample();
    //해당 객체의 메서드 이름에 해당하는 메서드를 실행함
    Object result = method.invoke(sample);

     

    정적인 코드를 리플렉션을 활용하면 클래스, 메서드의 메타정보를 통해 추상화하고

    공통 로직을 만들어 낼 수 있다.

     

    하지만 리플렉션은 런타임에 동작하기 때문에 컴파일 시점에는 오류를 잡을 수 없다.

     

     

     

    [참고 : 인프런 - 스프링 핵심 원리 - 고급편]

Designed by Tistory.