주니어 자바 개발자를 위한 질문(reflection)

박재언·2023년 8월 23일
0
post-thumbnail

reflection이란 무엇인가요?

  • 리플랙션이란 구체적인 클래스 타입을 알지 못하더라도 그 클래스의 메서드, 타입, 변수들에 접근할 수 있도록 해주는 자바 API를 말한다. 컴파일 시간이 아닌 실행 시간에 동적으로 특정 클래스의 정보를 추출할수 있는 프로그래밍 기법이라 할 수 있다.

  • 리플렉션는 동적으로 클래스를 사용해야할 때 사용한다. 즉 작성 시점에는 어떤 클래스를 사용해야할지 모르지만 런타임 시점에서 가져와 실행해야하는 경우 필요하다.
    이러한 특성 덕분에 스프링에서 @Component, @Bean과 같은 어노테이션을 사용하여 동적으로 정보를 가져올 수 있다.

  • 리플렉션을 통해서는 Class, constructor, Method, Field의 정보를 가져올 수 있다.

자바 직렬화란 무엇인가요? 어떤 상황에서 필요한가요?

  • 자바 직렬화란 자바 시스템 내부에서 사용되는 객체 또는 데이터를 외부의 자바 시스템에서도 사용할 수 있도록 byte 형태로 데이터를 변환하는 기술과 바이트로 변환된 데이터를 다시 객체로 변환하는 기술(역직렬화)를 아울러서 말하는 것이다.

  • 자바 직렬화는 JVM의 메모리에만 상주되어잇는 객체 데이터를 그대로 영속화가 필요할 때 사용되며 시스템이 종료되더라도 없어지지 않고 영속화된 데이터이기 때문에 네트워크로 전송도 가능하다.
    구체적인 직렬화 사용 예시를 들자면 서블릿 세션(예시: 톰캣)에서 파일을 저장하거나 세션 클러스터링, DB에 저장 등에 세션 자체가 직렬화 되어 저장되어 전달된다.
    캐시를 사용함에 있어서도 데이터 객체를 저장소에 저장할 대 직렬화하여 데이터를 저장한다.

동적 프록시란 무엇인가요?

  • 동적 프록시란 런타임 시점에 프록시를 자동으로 만들어서 적용해주는 기술이다. 이는 프록시를 사용하기 위해서는 대상 클래스 수만큼의 프록시 클래스를 하나하나 만들어줘야하는 단점을 보안하기 위해 나온 것이다.
    자바의 대표적인 동적 프록시 기술은 JDK 동적 프록시와 CGLIB가 있다.
  • 프록시란?
    • 대리자라는 뜻으로, 클라이언트가 사용하려고 하는 실제 대상인 것처럼 위장해서 클라이언트의 요청을 받아주는 역할을 한다.
    • 클랑리언트는 프록시를 통해 서비스 객체 기능을 사용하기 때문에 서비스 객체의 SRP(단일 책임 원칙, Single Responsibility Principle)을 지향하는 코드 작성이 가능해진다.
  • JDK 동적 프록시
    • 인터페이스 기반으로 프록시를 생성한다.
    • 자바에서는 리플렉션을 사용하여 프록시를 생성한다. (JDK 동적 프록시 관련 클래스도 reflect 패키지에 존재한다.)
    • InvocationHandler 인터페이스를 구현하여 프록시 기능을 설정한다.
    • 단점으로는 구체 클래스에 대해서는 동적 프록시를 생성할 수 없는 한계가 있다.
  • CGLIB(Code Generator Libary)
    • 인터페이스를 포함하여 구체 클래스에도 동적 프록시를 생성할 수 있다.
    • 바이트코드를 조작하여 동적 프록시를 생성한다.
    • MethodInterceptor 인터페이스를 구현하여 프록시 기능을 설정한다.
    • 단점으로는 동적으로 생성을 위한 기본 생성자가 필수로 필요하다. (없을 시 예외 발생)
    • final 키워드가 붙은 클래스는 이를 상속할 수 없어 CGLIB을 적용할 수 없다. (예외 발생)
    • final 키워드가 붙은 메서드는 오버라이딩할 수 없어 CGLIB을 적용할 수 없다. (예외는 발생하지 않지만, 적용이 되지 않음)

동적 프록시는 어떻게 사용하나요?

  • reflection API의 newProxyInstance() 메서드를 사용하면, 런타임 시점에서 프록시 클래스를 만들어 준다.
public static Object newProxyInstance(ClassLoader loader,
                                      Class<?>[] interfaces,
                                      InvocationHandler h)

calssLoder: 프록시 클래스를 만들 클래스로더
class: 프록시 클래스가 구현할 인터페이스 목록
InvocationHandler: 메서드가 호출되었을때 실행될 핸들러


질문 출처: https://medium.com/@xjpp22/top-100-java-interview-questions-for-1-to-3-years-experienced-programmers-63ad74069cb6

0개의 댓글