TIL

자바 Reflection , 스프링 DI

하얀잔디 2024. 1. 4. 14:01

Reflection은 구체적인 클래스를 몰라도 그 클래스의 메서드, 타입, 변수들에 접근할 수 있는 자바 API

 

 

JVM이 실행되면 사용자가 작성한 자바코드가 컴파일러를 거쳐 바이트 코드로 변환되어 static 영역에 저장되는데, Reflection API는 해당영역에서 값을 가져옴.

 

 정확히는 JVM의 메모리 영역에서 가져온다.

 어플리케이션을 실행하면 작성한 자바 코드 컴파일러에 의해 .class 형태의 바이트 코드로 변환되고, 이 정보들은 클래스 로더를 통해 JVM 메모리 영역에 저장된다. 그리고 클래스 정보를 통해 객체가 생성된다면 이는 JVM 힙 영역에 저장된다. 즉, JVM의 메모리영역에서 클래스의 정보를 가져올 수 있다.

 

 다시! 리플렉션이란, 어플리케이션이 실행되어 JVM 메모리 영역에 클래스 정보들이 저장된 시점인 '런타임' 시에 이 영역에 접근하여 클래스의 정보를 분석, 수정하는 작업을 하는 API 바로 자바 리플렉션이다!

 

 

 근데 이런 기능들을 대체 어디서 사용할까?

대부분의 프레임워크나 라이브러리에서도 리플렉션 기능을 사용한다.

프레임워크나 라이브러리에서는 들어오는 클래스의 정보를 모르기 때문이다.

 코드를 작성한 개발자는 당연히 내가 작성한 클래스의 정보를 알 수 있지만, 프레임워크 입장에서 보면 모르는게 당연하다. 이때 리플렉션을 통해 런타임 시 클래스의 정보를 얻고 이를 기반으로 하여 프레임워크나 라이브러리가 지원하는 기능을 수행하는 것이다.

 

스프링의 주요 기능인 DI도 리플렉션의 원리가 들어있다.

 

 

단점 ) 

1) 일반 메서드 호출보다 성능이 떨어짐.

-> 동적으로 클래스를 생성하기 때문에 JVM 컴파일러가 최적화 할 수 없음 -> 컴파일 시에는 타입이 정해지지 않았기 때문에.

 

2) 컴파일 시 타입 체크가 불가능함.

 

3) 추상화를 파괴함.

 모든 클래스의 정보를 알 수 있어서, private 접근제어자를 사용해도 접근 가능 -> 추상화 파괴.

 

아래를 참고해보자!! 

https://tlatmsrud.tistory.com/112

 

[JAVA] Reflection / 개념 / 예제 / 단점 / DI 프레임워크 구현

1. 개요 다이나믹 프록시를 공부하던 중 리플렉션이라는 개념이 두둥등장하였다. 간단하게 개념만 짚고 넘어가려했으나, Spring DI의 동작원리와 밀접하고, 프레임워크를 이해하는데 중요한 개념

tlatmsrud.tistory.com

 

'TIL' 카테고리의 다른 글

kafka lag  (1) 2024.01.04
kafka 개념 (파티셔너)  (1) 2024.01.04
ThreadLocal 이란.  (1) 2024.01.03
for vs .forEach() vs stream.forEach()  (0) 2023.12.29
STOMP 채팅 (TODO)  (0) 2023.11.28