스프링 어노테이션을 공부하면서 어노테이션이 어떤 방식으로 동작하는지 원리가 궁금해졌습니다.
해당 원리들을 알아가는 단계에서 자바의 리플렉션 API가 활용되는 것을 알게 되었습니다.
리플렉션의 개념에 대한 정리가 필요할 것 같아 해당 게시글을 작성하게 되었습니다.
Reflection이란?
구체적인 클래스 타입을 알지 못해도 클래스의 메소드, 타입 변수들에 접근을 할 수 있게 해주는 자바 API
Reflection is a feature in the Java programming language.
It allows an executing Java program to examine or "introspect" upon itself,
and manipulate internal properties of the program.
For example, it's possible for a Java class to obtain the names
of all its members and display them.
reflection 은 자바의 특징이다. 실행중인 자바프로그램 내부를 검사하고
내부의 속성을 수정할 수 있도록 한다.
예를 들어, 어떤 자바클래스가 가진 모든 멤버의 이름을 얻거나 보여줄 수 있다.
By Glen McCluskey
January 1998
그런데 저는 관련 설명을 보고 구체적인 클래스 타입은 알지 못해도 클래스 정보에 접근이 가능하다는
말이 이해가 되지 않았습니다. 본인이 작성한 코드인데 클래스 타입을 알지 못하는 경우가 있나? 라는 생각이
들었습니다. 그렇다면 언제 어떻게 리플렉션이 사용 되는 걸까요?
Reflection은 언제 사용 되나?
동적으로 클래스를 사용할 떄 사용됩니다.
작성 시점에는 어떤 클래스를 사용할지 모르지만, 런타임 시점에서 클래스를 가져와 실행해야 하는 경우
필요합니다. 대표적인 예시로는 스프링 프레임워크의 어노테이션이 있습니다. 어노테이션은 리플렉션을
이용하여 프로그램 실행 도중 동적으로 클래스 정보를 가져옵니다.
자바는 기본적으로 정적 언어입니다. 컴파일 시점에 타입을 결정하게 됩니다.
여기서 타입이란 한글로 자료형을 뜻합니다. int형, short형, boolean형, 객체 형 등이 있죠.
자바를 예로 들면
String a = "1"; // 컴파일 성공
int b = "1" // 컴파일 실패
a는 문자 타입으로 "1"을 받아들일 수 있지만 b는 int타입으로 "1"을 받아들일 수 없어 컴파일 시점에
에러를 발생시킵니다. 타입 에러로 인한 문제를 런타임으로 넘어가기 이전인 컴파일 시점에
발견할 수 있어서 안정성이 높은 특징이 있습니다.
반면 파이썬이나 자바스크립트 같은 언어들을 동적언어입니다. 언어의 자료형을 컴파일 시점에 결정하는 것이 아닌 런타임시에 결정합니다. 그래서 아래와 같은 코드가 가능합니다.
var a = 1;
var b = "1"
다시 리플렉션으로 돌아와서, 자바는 위와 같이 정적인 언어라 컴파일 시점에 해당 타입을 알지 못하면 쓰지
못하는 문제가 발생합니다. 본인이 실제 작성하는 코드에서는 이런 문제가 없지만,
프레임워크나 라이브러리에서는 사용하는 사람이 어떤 클래스를 만들지 몰라 이런 문제가 발생하게 됩니다.
이를 해결해주기 위해 리플렉션을 사용합니다.
우리가 스프링 프레임워크라고 가정한다면 프레임워크 사용자가 작성한 코드를 컴파일 시점에는 알지 못합니다.
런타임 시점에 @Controller와 같은 어노테이션이 붙은 클래스를 타입을 모르지만 리플렉션 API를 활용하여
인스턴스를 만들 수 있고 해당되는 메서드들을 활용할 수 있는 것입니다.
구체적인 리플렉션 사용 방법은 다음 게시글에 다루도록 하겠습니다.
'Spring' 카테고리의 다른 글
스프링 검증 BindingResult에 대하여 (0) | 2022.12.28 |
---|---|
스프링 빈 스코프란? (0) | 2022.12.23 |
스프링부트에서의 API예외 처리 방법 (1) | 2022.12.02 |
스프링과 스프링부트 무슨 차이가 있을까? (0) | 2022.11.25 |
DI 인젝션이 필요한 이유는? (0) | 2022.11.19 |