1. Reflection의 필요 이유
Reflection을 공부하기 전에 왜 Reflection이 필요한지 알아보자
2. 새 프로젝트 생성
새 Java 프로젝트를 만들어서 예시를 만든다.

3. 필요한 상황
현재 A회사, B회사가 협업을 하려고 한다. A회사에서 만든 프로그램이 B회사가 구매를 하였다. B회사에서 프로그램을 사용하다가 ‘우리 회사에 필요한 메소드가 필요하겠어!’ 라며 해당 메소드를 추가 해 달라고 A회사에게 전화를 하고, A회사는 그 메소드에 맞게 프로그램을 수정해 주어야 한다.

하지만 처음 한 번은 괜찮겠지만, B회사가 프로그램을 사용하면서 계속해서 수정 요청을 한다. 그리고 B회사에게만 판매를 한 것이 아니고, C,D,E,F 등등 100개 이상의 회사에게 팔았다고 가정해보자. 그러면 A회사는 100개 이상의 모든 회사에 전화를 받고, 수정사항에 맞게 프로그램을 수정해 주어야 한다. 이렇게 되면 유지보수가 매우 귀찮고, 번거롭고, 실수가 있을 수도 있다.
리플렉션(Reflection이란 무엇인가
리플렉션(Reflection)은 자바에서 클래스, 인터페이스, 메소드 등에 대한 정보를 런타임에 동적으로 접근하고 조작할 수 있는 기능이다. 자바의 리플렉션을 사용하여 Class 객체에서 메타 데이터를 가져올 수 있다.
메타데이터를 가져온다는 것은 클래스에 구현된 모든코드 또는 멧드 내부에 구현된 모든 코드를 확인하는 것이 아닌, 특정 정보인 메타데이터를 조회하여 가져오는 것이다.
메타데이터의 종류
- 클래스 정보 (
Class.forName("com.example.MyClass")
)
- 메서드 정보 (
class.getMethods()
)
- 필드 정보 (
class.getFields()
)
- 애너테이션 정보 (
class.getAnnotations()
)
Reflection의 핵심 코드
Method[] methods = con.getClass().getMethods();
Method[]
는java.lang.reflect
에 선언된 메소드를 저장할 수 있는 객체 배열이다.
변수명.getClass()
는 변수명의 해당하는 메타데이터를 조회한다.
.getMethods()
조회한 클래스에 선언된 모든 메소드를 호출한다.
위 코드는
con
변수에 모든 메소드가 Method[]
에 저장이 된다Reflection 구현하기
for (Method method : methods) {
if (method.getName().equals(pathToMethodName(path))) {
method.invoke(con)
}
}
for each
문으로Method[]
를 반복하여 돈다.
method.getName()
을 검색하여pathToMethodName(path)
의 요청 값을equals
로 비교한다.
- 비교하여 두 값이 똑같다면
method.invoke(con)
이 실행
리플렉션을 이용하면 대량의 데이터를 작업 할 시에 모든 메서드를 탐색하기 때문에 속도가 느리다.
이 단점을 보완을 하기 위해서 어노테이션(Annotation)을 활용 하면된다.
어노테이션(Annotation)이란?
JVM만 이해 할 수 있는 약속이라고도 할 수 있다. 어노테이션은 간단하게 말하면 깃발이다. 내가 호출하고 싶은 메소드에만 깃발을 설치 해놓으면 모든 메소드를 확인하지 않고, 깃발이 설치되어있는 메소드만 확인하면 되기 때문이다. 위에 리플렉션의 속도가 느린 단점을 보완 할 수 있다.
Annotation 문법

어노테이션 만들기
// RequestMapping 어노테이션 정의하는 문법
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface RequestMapping {
String uri ();
}
@Retention(RetentionPolicy.RUNTIME)
은 해당 어노테이션이 런타임에도 사라지지 않고 유지되게 해주며, 리플렉션이 이를 활용 할 수 잇게 된다.
@Target(ElementType.METHOD)
이 어노테이션을 이용해서 어노테이션의 타입을 결정한다. 메소드타입으로 결정하면, 메소드 전용 어노테이션이 된다. 메소드 전용 어노테이션이기 때문에 메소드 위에 붙여 사용한다.
String URI();
이것은 RequestMapping어노테이션의 속성값이 된다. 따라서 어노테이션이 사용될때 속성값 역시 받아올 수 있다.
package controller
public class BankController {
@RequestMapping(uri = "/insert")
public void insert(){
System.out.println("controller : insert");
dao.insert("1234", 1000);
}
- 직접 만든 어노테이션을 사용하기 위해서는 같은 패키지 안에 있어야 한다.
@RequestMapping (uri = “/insert”)
해당 어노테이션을 필요한 메소드 위에 넣는다. 런타임에 사라지지 않고 유지되며 리플렉션에서 식별이 가능하다.
uri
에 정의된 대로/insert
입력값을 받으면 내부 코드가 실행된다.
리플렉션과 어노테이션을 이용하면 납품회사에 수정 전화를 하지 않아도 되고, 납품회사도 프로그램을 수정할 필요 없이 어노테이션의 사용 방법만 알려주면 된다.

Share article