티스토리 뷰

728x90

프레임워크의 내부 구현체를 공부하다 보면 심심치 않게 나오는 단어가 Reflection이었고

많은 사람들이 리플렉션이 느리다고 하지만 딱히 속시원하게 설명해주는 글이 없어 따로 공부해보았다.

 

리플렉션이란

리플렉션은 런타임에 결정될 클래스 타입을 컴파일 시에 결정한 것처럼 행동할 수 있게 하는 API이다.

어떤 클래스가 들어오든 미리 리플렉션 해둔 클래스처럼 행동하게 만들 수 있다는 것이다. 다만 클래스 타입은 동적으로 그때 그때마다 결정된다. 리플렉션은 일종의 desired state를 명시하는 것이다. 

 

이 말만 들으면 마치 리플렉션이 Silver Bullet인 것처럼 느껴지지만 당연하게도 프로그래밍에 은탄환은 존재하지 않는다. 리플렉션의 단점을 알아보자.

 

단점

성능 상의 가장 큰 문제점은 컴파일러 최적화를 전혀 받지 못 한다는 것이다.

리플렉션은 동적으로 클래스를 생성하기 때문에 JVM 컴파일러가 최적화 할 수 있는 여지가 없다.

정확히는 JIT 컴파일러에서 최적화를 할 수 없는 것이다.

 

JVM 컴파일러에서 타입이 정해지지 않았기 때문에 JIT 컴파일러에서 해당 클래스에 대한 타입을 알고 있지 못 한다.

그래서 JIT 컴파일러에서 최적화가 되지 않고 매번 미리 명시된 클래스 타입이 맞는지, 생성자가 존재하는지, 생성자에 대한 validation 과정이 들어가야 한다.

 

이외에도 생성/호출하기 위해서 static 영역에서 클래스 정보에 대한 discovery 과정이 필요하고 모든 인자들이 박싱 언박싱을 거쳐야 하는 등의 성능 이슈를 만드는 여러 가지 문제점들이 있다.

 

성능 이슈 외에도 런타임에서의 접근 허용에 의한 보안상의 문제, private 메서드 접근 가능한 노출 문제 등이 있다.

 

그럼에도 불구하고

이런 성능 상의 오버헤드에도 불구하고 리플렉션을 사용하는 이유는 무엇일까?

간단하다. 어떤 클래스가 들어올지 모르는 상황에서 어떤 클래스가 들어오든 대처를 해야 하는 상황에서 쓰인다.

하지만 이런 경우가 흔하지 않다. 대부분의 개발자들은 이미 갖춰진 환경에서 클래스를 생성하고 호출하기 때문에 클래스 타입에 대해 확실하게 알고 있기 때문이다.

 

그렇기에 리플렉션은 대부분의 개발자들을 위한 환경 즉 프레임워크 혹은 라이브러리 등을 만드는 데에 주로 사용된다.

IDE 메서드명 자동 완성, 마셜링 라이브러리 (Jackson 등), 스프링 프레임워크 Bean 생성, ORM (하이버네이트 등), 테스트 코드, 스프링 AOP를 위해 사용되었던 JDK Dynamic Proxy (지금은 CGLIB으로 변경) 등과 같은 프레임워크나 라이브러리 심지어 IDE를 제작하는데 사용되고 있다. 

 

결론

사용하지 말자. 일반적인 프레임워크 위에서 동작하는 애플리케이션을 작성하는 개발자들이라면 사용할 이유가 없다.

사용하고 싶다면 리플렉션을 사용해야만 하는 누구나 인정할만한 이유가 있어야 한다. (프레임워크를 제작하거나 IDE를 제작하는 등의)

 

레퍼런스

https://docs.oracle.com/javase/tutorial/reflect/

 

Trail: The Reflection API (The Java™ Tutorials)

The Java Tutorials have been written for JDK 8. Examples and practices described in this page don't take advantage of improvements introduced in later releases and might use technology no longer available. See Java Language Changes for a summary of updated

docs.oracle.com

 

https://stackoverflow.com/questions/1392351/java-reflection-why-is-it-so-slow

 

Java Reflection: Why is it so slow?

I've always avoided Java reflection soley based on its reputation for slowness. I reached a point in the design of my current project where being able to use it would make my code much more readabl...

stackoverflow.com

 

https://tecoble.techcourse.co.kr/post/2020-07-16-reflection-api/

 

Reflection API 간단히 알아보자.

Spring Framework를 학습하다 보면 Java Reflection API를 자주 접하게 된다. 하지만 Reflection API…

tecoble.techcourse.co.kr

 

https://howtodoinjava.com/java/reflection/real-usage-examples-of-reflection-in-java/#:~:text=Spring%20framework%20uses%20dependency%20injection,for%20injecting%20these%20bean%20dependencies.

 

Java Reflection - Real Usage Examples

Reflection is one of those things like multi-threading where everyone with experience of it says "Don't use it unless you absolutely have to". Learn when to use reflection and where it has been used already.

howtodoinjava.com

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함