๐Ÿ“Œ Java Reflection (๋ฆฌํ”Œ๋ ‰์…˜) ๊ฐœ๋… ๋ฐ ํ™œ์šฉ

My Pale Blue Dotยท2025๋…„ 3์›” 19์ผ
0

JAVA

๋ชฉ๋ก ๋ณด๊ธฐ
28/35
post-thumbnail

๐Ÿ“… ๋‚ ์งœ

2025-03-19

๐Ÿ“ ํ•™์Šต ๋‚ด์šฉ

์ด๋ฒˆ ํ•™์Šต์—์„œ๋Š” Java Reflection (๋ฆฌํ”Œ๋ ‰์…˜) ๊ฐœ๋…๊ณผ ํ™œ์šฉ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
๋ฆฌํ”Œ๋ ‰์…˜์„ ํ™œ์šฉํ•˜๋ฉด ๋Ÿฐํƒ€์ž„์— ํด๋ž˜์Šค ์ •๋ณด๋ฅผ ๋™์ ์œผ๋กœ ํƒ์ƒ‰ํ•˜๊ณ  ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ,
์ด๋Š” Spring, Hibernate, JUnit(Mock ํ…Œ์ŠคํŠธ) ๋“ฑ์˜ ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ ์ž์ฃผ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.


1๏ธโƒฃ Reflection(๋ฆฌํ”Œ๋ ‰์…˜)์ด๋ž€?

Reflection(๋ฆฌํ”Œ๋ ‰์…˜)์ด๋ž€ Java ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰๋˜๋Š” ๋™์•ˆ ํด๋ž˜์Šค์˜ ์ •๋ณด๋ฅผ ๋™์ ์œผ๋กœ ํƒ์ƒ‰ํ•˜๊ณ  ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.
์ฆ‰, ์ปดํŒŒ์ผ ํƒ€์ž„์ด ์•„๋‹Œ ๋Ÿฐํƒ€์ž„์— ํด๋ž˜์Šค, ๋ฉ”์„œ๋“œ, ํ•„๋“œ ๋“ฑ์˜ ์ •๋ณด๋ฅผ ์กฐํšŒํ•˜๊ณ  ํ™œ์šฉํ•˜๋Š” ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค.

Reflection์˜ ์ฃผ์š” ํŠน์ง•

  • ํด๋ž˜์Šค ์ •๋ณด ์กฐํšŒ: ํด๋ž˜์Šค ์ด๋ฆ„, ์ƒ์„ฑ์ž, ๋ฉ”์„œ๋“œ, ํ•„๋“œ ์ •๋ณด ํ™•์ธ ๊ฐ€๋Šฅ
  • ๋™์  ๊ฐ์ฒด ์ƒ์„ฑ: ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๋™์ ์œผ๋กœ ์ƒ์„ฑ ๊ฐ€๋Šฅ
  • ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ: ํŠน์ • ๋ฉ”์„œ๋“œ๋ฅผ ์ง์ ‘ ์‹คํ–‰ ๊ฐ€๋Šฅ
  • ํ•„๋“œ ์กฐ์ž‘: ๊ฐ์ฒด์˜ ํ•„๋“œ ๊ฐ’์„ ๋™์ ์œผ๋กœ ์ฝ๊ฑฐ๋‚˜ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ

2๏ธโƒฃ Reflection์˜ ์ฃผ์š” ํ™œ์šฉ ์˜ˆ์‹œ

Reflection์€ Spring, Hibernate, JUnit ๋“ฑ์˜ ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ ํ•„์ˆ˜์ ์œผ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ์— ํ™œ์šฉ๋ฉ๋‹ˆ๋‹ค.

๐Ÿ”น 1. ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ์˜ ํ™œ์šฉ

  • Spring ํ”„๋ ˆ์ž„์›Œํฌ
    • @Autowired, @Bean ๋“ฑ์˜ ์–ด๋…ธํ…Œ์ด์…˜์„ ํ†ตํ•ด ์˜์กด์„ฑ ์ฃผ์ž…(DI)์„ ํ•  ๋•Œ ๋ฆฌํ”Œ๋ ‰์…˜์„ ์‚ฌ์šฉ
    • ApplicationContext์—์„œ ๋นˆ(Bean) ๊ฐ์ฒด๋ฅผ ๋™์ ์œผ๋กœ ํƒ์ƒ‰
  • Hibernate (ORM)
    • ํด๋ž˜์Šค์™€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ…Œ์ด๋ธ”์„ ๋งคํ•‘ํ•  ๋•Œ ์‚ฌ์šฉ
    • ์—”ํ‹ฐํ‹ฐ ๊ฐ์ฒด๋ฅผ ๋™์ ์œผ๋กœ ์ƒ์„ฑํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์—ฐ๊ฒฐ

๐Ÿ”น 2. Mock ํ…Œ์ŠคํŠธ

  • JUnit & Mockito
    • ๋‹จ์œ„ ํ…Œ์ŠคํŠธ์—์„œ Mock ๊ฐ์ฒด๋ฅผ ๋™์ ์œผ๋กœ ์ƒ์„ฑํ•˜์—ฌ ํ…Œ์ŠคํŠธ ์ˆ˜ํ–‰
    • ์˜ˆ์ œ: Mockito.when(mockObject.method()).thenReturn(value)

๐Ÿ”น 3. JSON/XML ๋ณ€ํ™˜

  • Jackson, Gson ๋“ฑ์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
    • ๊ฐ์ฒด๋ฅผ JSON์œผ๋กœ ๋ณ€ํ™˜ํ•  ๋•Œ, ํด๋ž˜์Šค์˜ ํ•„๋“œ ์ •๋ณด๋ฅผ ๋™์ ์œผ๋กœ ํƒ์ƒ‰
    • ์˜ˆ์ œ: ObjectMapper.readValue(json, MyClass.class)

๐Ÿ”น 4. IDE & ๋””๋ฒ„๊น… ๋„๊ตฌ

  • Eclipse, IntelliJ ๊ฐ™์€ ๊ฐœ๋ฐœ ๋„๊ตฌ์—์„œ ์ฝ”๋“œ ๋ถ„์„ ๊ธฐ๋Šฅ ์ œ๊ณต

3๏ธโƒฃ Reflection ๊ธฐ๋ณธ ์‚ฌ์šฉ๋ฒ• (C01BASIC.java)

์ด์ œ Reflection์„ ์‚ฌ์šฉํ•˜์—ฌ ํด๋ž˜์Šค ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

package Ch29_;

import java.lang.reflect.Constructor;
import java.lang.reflect.Method;

public class C01BASIC {
	public static void main(String[] args) throws Exception {
		// Class ๊ฐ์ฒด๋ฅผ ํ†ตํ•ด ํด๋ž˜์Šค ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ด
		Class<?> clazz = Class.forName("java.lang.String");

		// ๋ชจ๋“  ์ƒ์„ฑ์ž ์ถœ๋ ฅ
		Constructor<?>[] constructors = clazz.getDeclaredConstructors();
		for (Constructor<?> con : constructors) {
			System.out.println(con);
		}

		// ๋ชจ๋“  ๋ฉ”์„œ๋“œ ์ถœ๋ ฅ
		Method[] methods = clazz.getDeclaredMethods();
		for (Method m : methods) {
			System.out.println(m);
		}
	}
}

โœ… ์‹คํ–‰ ๊ฒฐ๊ณผ ์˜ˆ์‹œ

public java.lang.String()
public java.lang.String(byte[],java.nio.charset.Charset)
...
public int length()
public char charAt(int)
public boolean equals(java.lang.Object)
...

โžก String ํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž ๋ฐ ๋ฉ”์„œ๋“œ ๋ชฉ๋ก์„ ์ถœ๋ ฅํ•˜๋Š” ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.


4๏ธโƒฃ Reflection์„ ์ด์šฉํ•œ ๊ฐ์ฒด ์กฐ์ž‘ (C02BASIC.java)

์ด๋ฒˆ์—๋Š” Reflection์„ ์ด์šฉํ•˜์—ฌ ํŠน์ • ํด๋ž˜์Šค์˜ ํ•„๋“œ, ๋ฉ”์„œ๋“œ, ์ƒ์„ฑ์ž๋ฅผ ๋™์ ์œผ๋กœ ์กฐ์ž‘ํ•˜๋Š” ์˜ˆ์ œ๋ฅผ ์‚ดํŽด๋ด…๋‹ˆ๋‹ค.

โœ… Simple ํด๋ž˜์Šค

Reflection์„ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์œ„ํ•ด Simple ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

class Simple {
    String name;
    int age;
    String addr;

    // ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ƒ์„ฑ์ž
    public Simple() {}
    public Simple(String name) { this.name = name; }
    public Simple(String name, int age) { this.name = name; this.age = age; }
    public Simple(String name, int age, String addr) { this.name = name; this.age = age; this.addr = addr; }

    // Getter ๋ฐ Setter
    public String getName() { return name; }
    public void setName(String name) { this.name = name; }
    public int getAge() { return age; }
    public void setAge(int age) { this.age = age; }
    public String getAddr() { return addr; }
    public void setAddr(String addr) { this.addr = addr; }

    @Override
    public String toString() {
        return "Simple [name=" + name + ", age=" + age + ", addr=" + addr + "]";
    }
}

โœ… Reflection์„ ํ™œ์šฉํ•œ ์กฐ์ž‘ ์ฝ”๋“œ

package Ch29_;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class C02BASIC {
	public static void main(String[] args) throws Exception {
		// Simple ํด๋ž˜์Šค ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ค๊ธฐ
		Class<?> clazz = Class.forName("Ch29_.Simple");
		
		// ๊ฐ์ฒด ์ƒ์„ฑ
		Simple ob = new Simple();
		ob.setAge(10);

		// ๋ฆฌํ”Œ๋ ‰์…˜์„ ์ด์šฉํ•œ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ
		Method method = clazz.getDeclaredMethod("getAge");
		Object result = method.invoke(ob);
		System.out.println("getAge() ๊ฒฐ๊ณผ: " + result);
		
		// ๋ฆฌํ”Œ๋ ‰์…˜์„ ์ด์šฉํ•œ ์ƒ์„ฑ์ž ํ˜ธ์ถœ
		Constructor<?> constructor = clazz.getConstructor(String.class);
		Object obj = constructor.newInstance("ํ™๊ธธ๋™");
		System.out.println("์ƒ์„ฑ๋œ ๊ฐ์ฒด: " + obj);
		
		// ๋ฆฌํ”Œ๋ ‰์…˜์„ ์ด์šฉํ•œ ํ•„๋“œ ์กฐ์ž‘
		Field field = clazz.getDeclaredField("addr");
		field.set(ob, "๋Œ€๊ตฌ");
		System.out.println("์ˆ˜์ •๋œ ๊ฐ์ฒด: " + ob);
	}
}

โœ… ์‹คํ–‰ ๊ฒฐ๊ณผ ์˜ˆ์‹œ

getAge() ๊ฒฐ๊ณผ: 10
์ƒ์„ฑ๋œ ๊ฐ์ฒด: Simple [name=ํ™๊ธธ๋™, age=0, addr=null]
์ˆ˜์ •๋œ ๊ฐ์ฒด: Simple [name=null, age=10, addr=๋Œ€๊ตฌ]

โžก Reflection์„ ์ด์šฉํ•˜์—ฌ ํด๋ž˜์Šค์˜ ํ•„๋“œ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๊ณ ,
โžก ๋ฉ”์„œ๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉฐ,
โžก ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด ๊ฐ์ฒด๋ฅผ ๋™์ ์œผ๋กœ ์ƒ์„ฑํ•˜๋Š” ๊ณผ์ •์ž…๋‹ˆ๋‹ค.


๐Ÿ”ฅ ์ •๋ฆฌ

โœ… Reflection์„ ์‚ฌ์šฉํ•˜๋ฉด ๋Ÿฐํƒ€์ž„ ์ค‘์—๋„ ํด๋ž˜์Šค ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์™€ ์กฐ์ž‘ ๊ฐ€๋Šฅ
โœ… ํ•„๋“œ, ์ƒ์„ฑ์ž, ๋ฉ”์„œ๋“œ๋ฅผ ๋™์ ์œผ๋กœ ์กฐ์ž‘ ๊ฐ€๋Šฅ
โœ… ํ”„๋ ˆ์ž„์›Œํฌ(Spring, Hibernate)์—์„œ ํ™œ์šฉ๋จ
โœ… ๋‹จ์ : ์‹คํ–‰ ์†๋„๊ฐ€ ๋А๋ฆฌ๊ณ , ๋ณด์•ˆ ์ด์Šˆ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Œ


๐Ÿ“Œ Reflection ํ™œ์šฉ ์˜ˆ์‹œ

ํ™œ์šฉ ๋ถ„์•ผ์„ค๋ช…
Spring ํ”„๋ ˆ์ž„์›Œํฌ@Autowired ๋“ฑ ์˜์กด์„ฑ ์ฃผ์ž…(DI) ๊ตฌํ˜„
JUnit & Mockito๋‹จ์œ„ ํ…Œ์ŠคํŠธ์—์„œ Mock ๊ฐ์ฒด ์ƒ์„ฑ ์‹œ ํ™œ์šฉ
JSON ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ (Jackson ๋“ฑ)๊ฐ์ฒด์™€ JSON ๊ฐ„ ๋ณ€ํ™˜ ์‹œ ๋‚ด๋ถ€์ ์œผ๋กœ ์‚ฌ์šฉ๋จ
ORM ํ”„๋ ˆ์ž„์›Œํฌ (Hibernate ๋“ฑ)๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ…Œ์ด๋ธ”๊ณผ ๊ฐ์ฒด ๋งคํ•‘ ์‹œ ์‚ฌ์šฉ

๐Ÿ”— ์ฐธ๊ณ  ์ž๋ฃŒ

profile
Here, My Pale Blue.๐ŸŒ

0๊ฐœ์˜ ๋Œ“๊ธ€