티스토리 뷰

728x90
반응형

1. Reflection

  • 힙 영역(메모리)에 로드되어 있는 클래스 타입의 객체를 통해 필드, 메소드, 생성자를 접근 제어자(private, public 등)와 상관없이 접근할 수 있도록 지원하는 API이다.
    • 이미 로드되어 있는 클래스 타입의 객체(User)를 가져오는 방법은 세 가지가 있다.
      • Class.class
      • Instance.getClass()
      • Class.forName()
// 1
Class<User> clazz1 = User.class;


// 2
User user = new User("userid", "kim");
Class<? extends User> clazz2 = user.getClass();

// 3
Class<?> clazz3 = Class.forName("org.example.User");
  •  JVM의 클래스 로더는 클래스 파일에 대한 로딩이 끝나면 클래스 타입의 객체를 생성하고, 메모리 힙 영역에 저장한다.
  • 컴파일 시점이 아닌 런타임 시점에 동적으로 특정 클래스의 정보를 추출해낼 수 있는 프로그래밍 기법이다.
  • 주로 프레임워크 또는 라이브러리 개발 시 사용된다.
  • Reflection 사용하는 프레임워크/라이브러리
    • Test 프레임워크 (ex. JUnit)
    • JSON Serialization/Deserialization 라이브러리 (ex. Jackson)
    • Spring 프레임워크 (ex. DI)

 

2. Reflection 실습 

@Controller 애노테이션이 설정돼 있는 모든 클래스를 찾아서 출력한다.

(1) 의존성 추가

implementation('org.reflection:reflections:0.10.2')

(2) 구현 참고사항

  • @Trarget({ElemetnType.TYPE}) : class에 어노테이션을 붙이고 싶기 때문에 대상을 TYPE이라 지정한다.
  • @Retention(REtentionsPilicy.RUNTIME) : 런타임 기간이 유지기간임을 선언한다.
  • 임의의 Controller 클래스를 생성하고 어노테이션으로 @Controller를 붙여준다.
  • ReflactionTest : beans에 모든 Controller 클래스를 모아 담을 수 있다.
Public class ReflactionTest {
    @Test
    void controllerScan() {
    	Reflections reflections = new Reflections("org.example"); // 스캔 대상 위치
        
        Set<Class<?>> beans = new HashSet<>();
        beans.addAll(reflections.getTypesAnnotatedWith(Controller.class));
    }
}

 

3. 구현한 MVC와 Spring MVC 비교

  • Spring MVC 프레임워크를 간단하게 구현한 실습을 여태까지 진행하였다.
  • SpringFramework에 구현된 DispatcherServlet과 비교해보면 전반적으로 실습한 코드와 유사하게 구현된 것을 볼 수 있다.
  • 실습 자체가 Spring MVC 에서 제공하는 플로우를 따라 구현하는 것이었기에 MVC 프레임워크를 이해하는데 도움이 될 것 같다.

 


 

본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성하였습니다.

https://bit.ly/43z0P6S

 

 

#패스트캠퍼스 #포트폴리오 #직장인자기계발 #환급챌린지 #포트폴리오챌린지 #패스트캠퍼스후기 #초격차패키지 #오공완

728x90
반응형
댓글