Java 프레임워크 만들기 - JSP

자바 어노테이션 인젝션(주입) - Java Annotation Injection, 이클립스(Eclipse)

carrotweb 2021. 5. 10. 19:26
728x90
반응형

클래스 맴버 필드(변수)에 Annotation(어노테이션)를 적용하여 외부에서 초기화하는 방법(인젝션)에 대해 알아보겠습니다.

1. 이전 "TestClass.java"에 클래스 맴버 필드(변수)를 추가합니다.

private String name;

 

2. "test2" 프로젝트의 "Java Resources"에서 "src/main/java"의 "com.hom.project.test2.annotation"에서 오른쪽 버튼을 클릭하여 컨텍스트 메뉴 [New > Annotation]를 클릭합니다.

"New Annotation Type"창에서 "Name"에 "TestAnnStringInit"를 입력하고 "@Retention"은 "Runtime", "@Target"은 "Field"를 선택하고 "Finish"버튼을 클릭합니다.

문자열에 주입(인젝션)하기 위해 문자열인 "value"를 추가합니다. 기본값으로 ""(공백)를 설정합니다.

public String value() default "";

 

3. "TestClass.java"의 "name" 맴버 필드(변수)에 "@TestAnnStringInit"어노테이션을 적용합니다.

@TestAnnStringInit("외부에서 값을 주입했습니다.")
private String name;

어노테이션을 적용하면 "The value of the field TestClass.name is not used"라는 자바 문제(Java Problem)이 없어집니다.

새로운 방법으로 "name" 맴버 필드(변수)에 대한 "Getter/Setter"메서드를 추가하겠습니다.

이클립스 메뉴 [Source > Generate Getters and Setters...]를 선택합니다.

"Generate Getters and Setters"에서 "name" 맴버 필드(변수)를 선택하고 "Generate"버튼을 클릭합니다.

 

4. 테스트를 위해 "TestRootController.java"의 "test2"메소드에 추가합니다.

"TestClass" 클래스를 찾아서 인스턴스를 생성합니다.

Class<?> finedClass = Class.forName("com.home.project.test2.service.TestClass");
TestClass controllerInstance = (TestClass)finedClass.newInstance();

"TestClass" 클래스에서 선언된 맴버 필드(변수) 리스트를 가져옵니다.

Field[] fields = finedClass.getDeclaredFields();
for (Field field : fields) {
}

가져온 맴버 필드(변수)에서 "@TestAnnStringInit"어노테이션이 있고 타입이 "String"인지 확인합니다.

TestAnnStringInit testAnnStringInit = field.getAnnotation(TestAnnStringInit.class);
if (null != testAnnStringInit && String.class == field.getType()) {
}

맴버 필드(변수)에 접근할 수 있게 설정하고 "set"메소드를 통해 값을 주입(인젝션)합니다.

field.setAccessible(true);
String names = testAnnStringInit.value();
field.set(controllerInstance, names);

생성된 클래스 인스턴스에서 메소드를 통해 값을 가져옵니다.

System.out.println("name : " + controllerInstance.getName());

전체 소스입니다.

try {
	Class<?> finedClass = Class.forName("com.home.project.test2.service.TestClass");
	TestClass controllerInstance = (TestClass)finedClass.newInstance();
	Field[] fields = finedClass.getDeclaredFields();
	for (Field field : fields) {
		TestAnnStringInit testAnnStringInit = field.getAnnotation(TestAnnStringInit.class);
		if (null != testAnnStringInit && String.class == field.getType()) {
			field.setAccessible(true);
			String names = testAnnStringInit.value();
			field.set(controllerInstance, names);
		}
	}
	System.out.println("name : " + controllerInstance.getName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException e) {
	e.printStackTrace();
}

 

 

5. "Servers"탭에서 "tomcat8"를 선택하고 "start"버튼(start the server)을 클릭합니다.

웹 브라우저에서 "http://localhost:8080/test2/test2.do"를 입력합니다.

"Console"탭을 클릭하면 주입(인젝션)된 "name"값을 확인할 수 있습니다.

[Console]

name : 외부에서 값을 주입했습니다.

 

추가 테스트로 랜덤으로 이름을 주입(인젝션)해주는 어노테이션을 생성하겠습니다.

6. "test2" 프로젝트의 "Java Resources"에서 "src/main/java"의 "com.hom.project.test2.annotation"에서 오른쪽 버튼을 클릭하여 컨텍스트 메뉴 [New > Annotation]를 클릭하고 "name"은 "TestAnnRandomName"를 입력하고 "@Retention"은 "Runtime", "@Target"은 "Field"를 선택하고 "Finish"버튼을 클릭합니다.

랜뎜으로 주입(인젝션)하기 위해 문자열 배열인 "value"를 추가합니다. 기본값으로 {""}(공백배열)을 설정합니다.

public String[] value() default {""};

 

7. "TestClass.java"의 "name" 맴버 필드(변수)에 "@TestAnnStringInit"어노테이션을 적용합니다.

@TestAnnRandomName({"영희", "숙희", "정희"})
private String name;

 

8. 테스트를 위해 "TestRootController.java"의 "test2"메소드에 수정합니다.

"@TestAnnStringInit"어노테이션를 "@TestAnnRandomName"어노테이션으로 수정합니다.

TestAnnRandomName testAnnRandomName = field.getAnnotation(TestAnnRandomName.class);

"@TestAnnRandomName"어노테이션에서 문자열 배열을 가져와 랜덤으로 처리합니다.

String[] names = testAnnRandomName.value();
Random random = new Random();
int num = random.nextInt(names.length);
field.set(controllerInstance, names[num]);

생성된 클래스 인스턴스에서 메소드를 통해 랜덤으로 처리된 이름을 추가합니다.

modelAndView.addModel("name", controllerInstance.getName());

전체 소스입니다.

for (Field field : fields) {
	TestAnnRandomName testAnnRandomName = field.getAnnotation(TestAnnRandomName.class);
	if (null != testAnnRandomName && String.class == field.getType()) {
		field.setAccessible(true);
		String[] names = testAnnRandomName.value();
		Random random = new Random();
		int num = random.nextInt(names.length);
		field.set(controllerInstance, names[num]);
	}
}
modelAndView.addModel("name", controllerInstance.getName());

 

9. "Servers"탭에서 "tomcat8"를 선택하고 "start"버튼(start the server)을 클릭합니다.

웹 브라우저에서 "http://localhost:8080/test2/test2.do"를 입력합니다.

새로고침할 때마다 이름이 변경됩니다.

728x90
반응형