[JAVA] getDeclaredFields ํ™œ์šฉํ•˜์—ฌ VO ๊ฐ์ฒด์— ํ•œ๋ฒˆ์— ์ด์šฉํ•˜๊ธฐ

2022. 3. 11. 17:36ใ†๊ฐœ๋… ์ •๋ฆฌ ์ž‘์—…์‹ค/Java

728x90
๋ฐ˜์‘ํ˜•

 

๐Ÿš€ ๋ฆฌํ”Œ๋ ‰์…˜(Reflection) ์‚ฌ์šฉ


๋ฆฌํ”Œ๋ ‰์…˜์€ ๊ตฌ์ฒด์ ์ธ ํด๋ž˜์Šค ํƒ€์ž…์„ ์•Œ์ง€ ๋ชปํ•ด๋„, ๊ทธ ํด๋ž˜์Šค์˜ ๋ฉ”์†Œ๋“œ, ํƒ€์ž…, ๋ณ€์ˆ˜๋“ค์„ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๋Š” ์ž๋ฐ” API์ธ ๊ฒƒ์ด์—์š”.

๊ทธ๋ ‡๋‹ค๋ฉด ๊ตฌ์ฒด์ ์ธ ํด๋ž˜์Šค ํƒ€์ž…์„ ์•Œ์ง€ ๋ชปํ•œ๋‹ค๋ผ๋Š” ์˜๋ฏธ๋Š” ๋ฌด์—‡์ธ ๊ฒƒ์ผ๊นŒ์š”? ๊ทธ๋ฆฌ๊ณ  ๊ตฌ์ฒด์ ์ธ ํด๋ž˜์Šค ํƒ€์ž…์„ ์•Œ์ง€ ๋ชปํ•˜๋ฉด ๊ทธ ํด๋ž˜์Šค์˜ ๋ฉ”์†Œ๋“œ, ํƒ€์ž…, ๋ณ€์ˆ˜๋“ค์— ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋Š” ๊ฒƒ ์ผ๊นŒ์š”?

 

 

์œ„์˜ ์‚ฌ์ง„๊ณผ ๊ฐ™์ด VO๋ฅผ ๋ชจ๋“  Class์˜ ์กฐ์ƒ Class์ธ Object๋กœ ๋‹ด์„ ์ˆ˜๋Š” ์žˆ์ง€๋งŒ, ์šฐ๋ฆฌ๊ฐ€ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋Š” Class๋Š” Object๊ฐ€ ์ œ๊ณตํ•˜๋Š” Class ๋ฐ–์— ์—†๋Š” ๊ฒƒ์ด์—์š”. ์ด ๋‚ด์šฉ์€ Java์˜ ๋‹คํ˜•์„ฑ๊ณผ ๊ด€๋ จ์ด ๊นŠ์€ ๋‚ด์šฉ์ธ ๊ฒƒ์ด์—์š”. ์ด๋ ‡๊ฒŒ ๊ฐ์ฒด์˜ ๊ตฌ์ฒด์ ์ธ Class๋ฅผ ์•Œ์ง€ ๋ชปํ•œ๋‹ค๋ฉด Class์˜ Method์™€ ๋ณ€์ˆ˜๋ฅผ ์ด์šฉํ•  ์ˆ˜ ์—†๋Š” ๊ฒƒ์ด์—์š”.

 

 

์ด๋ ‡๊ฒŒ Object๋ฅผ ํ˜•๋ณ€ํ™˜์„ ํ•ด์„œ ์ด์šฉํ•œ๋‹ค๊ณ  ํ•˜๋ฉด ํ•ด๋‹น ๊ฐ์ฒด์˜ Method ๋“ฑ์„ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด์—์š”.

๊ทธ๋ ‡๋‹ค๋ฉด ํ•œ๊ฐ€์ง€ ์˜๋ฌธ์ด ๋“œ๋Š” ๊ฒƒ์ด์—์š”. ๋‚ด๊ฐ€ ๊ฐœ๋ฐœ ํ•ด ๋†“๊ณ , ์‚ฌ์šฉํ•  Class name, Type์„ ๋ชจ๋ฅผ ์ˆ˜๊ฐ€ ์žˆ์„๊นŒ์š”?

JDBC๋กœ ์˜ˆ๋ฅผ ๋“ค์ž๋ฉด JVM์ด ๋™์ž‘์„ ์‹œ์ž‘ํ•˜๊ณ , Code๊ฐ€ ์‹คํ–‰ ๋˜๊ธฐ ์ „๊นŒ์ง€ ์–ด๋–ค JDBC Driver๊ฐ€ ์‚ฌ์šฉ๋ ์ง€ ์•Œ ์ˆ˜๊ฐ€ ์—†๋Š” ๊ฒƒ์ด์—์š”. JAVA๋งŒ ์ด์šฉํ•ด์„œ DB์— ์ ‘๊ทผํ•˜๋ ค๊ณ  ํ•  ๋•Œ, ํ•ญ์ƒ ๋ณด์ด๋Š” Code ๋ณด์‹  ์  ์žˆ์œผ์‹ค๊นŒ์š”?
๋ฐ”๋กœ `Class.forName("oracle.jdbc.driver.OracleDriver");` ์ด๊ฒƒ์„ ์ด์šฉํ•˜์—ฌ Run Time ์‹œ ๋™์ ์œผ๋กœ Class์— ๋กœ๋”ฉํ•˜๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด์—์š”.

์ด๊ฒŒ ๊ฐ€๋Šฅํ•œ ์ด์œ ๋Š” JAVA Class File์€ Byte Code๋กœ Compile ๋˜์–ด static ์˜์—ญ์— ์œ„์น˜ํ•˜๋Š๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด์—์š”. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— Class Name๋งŒ ์•Œ๊ณ  ์žˆ์œผ๋ฉด ์–ธ์ œ๋“  ์ด ์˜์—ญ์— ์ ‘๊ทผํ•˜์—ฌ Class์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋‹ต๋‹ˆ๋‹ค!

Reflection์€ ์‹คํ–‰์ค‘์ธ ์ž๋ฐ” ํ”„๋กœ๊ทธ๋žจ ๋‚ด๋ถ€๋ฅผ ๊ฒ€์‚ฌํ•˜๊ณ , ๋‚ด๋ถ€์˜ ์†์„ฑ์„ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด์—์š”. reflection์ด ๊ตฌ์ฒด์ ์œผ๋กœ ์“ฐ์ด๋Š” ๊ณณ์ด Builder Tool์„ ์ด์šฉํ•ด์„œ ์†Œํ”„ํŠธ์›จ์–ด Component๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด๋ž๋‹ˆ๋‹ค. Tool์€ reflection์„ ์ด์šฉํ•˜์—ฌ ๋™์ ์œผ๋กœ Loading๋˜๋Š” JAVA Component(Class)์˜ ์†์„ฑ์„ ๊ฐ€์ ธ ์˜ฌ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด์—์š”.

๋˜ํ•œ Project Run Time์— Class ๊ตฌ์กฐ๋ฅผ Coding์œผ๋กœ ํŒŒ์•…์ด ๊ฐ€๋Šฅํ•˜๋‹ˆ ์ž๋™ Mapping ํ•ด์ฃผ๋Š” ๊ธฐ๋Šฅ๋“ค์€ ๋ชจ๋‘ Reflection์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ๋ณด๋ฉด ๋˜๋Š” ๊ฒƒ์ด์—์š”. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์„ฑ๋Šฅ๋ฉด์—์„œ ์ข‹ใ…ˆ์ง€ ์•Š๊ณ , ๋‚จ๋ฐœ ์‹œ์— ๋””๋ฒ„๊น…์ด๋‚˜, ๊ฐ€๋…์„ฑ์—์„œ ๊ทน์•…์˜ ํ™˜๊ฒฝ์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด์—์š”. ์‹ค์ œ๋กœ Spring Framwork์—์„œ๋„ Auto Mapping๊ณผ ์—ฌ๋Ÿฌ ๊ธฐ๋Šฅ์„ ์“ฐ๊ธฐ ์œ„ํ•ด ์ด ์นœ๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์ด์—์š”.

 

 

 

 

๐Ÿš€ getDeclaredFields๋กœ Property ์ •๋ณด ๊ฐ€์ ธ์˜ค๊ธฐ

ํŠน์ • ๊ฐ์ฒด์˜ Class๋กœ ์ ‘๊ทผ ์‹œ (getClass() ์ด์šฉ) ๋‚ด๋ถ€์˜ ํ”„๋กœํผํ‹ฐ๋“ค์˜ ์ด๋ฆ„์„ getDeclaredFields๋ฅผ ์ด์šฉํ•˜์—ฌ Field์˜ ๋ฐฐ์—ด ํ˜•ํƒœ๋กœ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋„ค์š”.

์˜ˆ๋ฅผ ํ•˜๋‚˜ ๋“ค์–ด ๋ณผ๊ฒŒ์š”. ์•„๋ž˜ ์ฒ˜๋Ÿผ `DevInquryVO`๋ผ๋Š” Class๊ฐ€ ์žˆ๊ณ , ์ด Class์˜ ๊ฐ์ฒด๋ฅผ devVO๋ผ๊ณ  ํ•  ๊ฒƒ์ด์—์š”.

 

์œ„์˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์€ ๋ฐฉ๋ฒ•์„ ์ด์šฉํ•˜๊ฒŒ ๋˜๋ฉด fields ๋‚ด๋ถ€์— devVO์˜ ํ”„๋กœํผํ‹ฐ์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ๋‹ด๊ธฐ๋Š” ๊ฒƒ์ด์—์š”.

์ฃผ๋‹ˆํ•˜๋ž‘์€ ์ด๋ฅผ ํ•œ๋ฒˆ ์ด์šฉํ•ด ๋ณด๋ฉด์„œ ํ”„๋กœํผํ‹ฐ์— ๊ฐ’์„ ๋„ฃ์–ด ๋ณด๋ ค๊ณ  ํ–ˆ๋˜ ๊ฒƒ์ด์—์š”.

 

 

๋ฐ˜์‘ํ˜•

์œ„์™€ ๊ฐ™์ด ๋ฐ˜๋ณต๋ฌธ์„ ์ด์šฉํ•ด์„œ Array์˜ ์ „์ฒด๋ฅผ ํ™•์ธ ํ•ด ๋ณด๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•ด ์ง€๋Š” ๊ฒƒ์ด์—์š”.

๊ทธ๋Ÿฐ ๋’ค devVO์˜ ๋‚ด๋ถ€ ํ”„๋กœํผํ‹ฐ๋ฅผ Field Class๋ฅผ ์ด์šฉํ•ด์„œ ๊ฐ’์„ ์ด์šฉํ•˜๋ ค๊ณ  ํ•˜๋Š” ๊ฒƒ์ด์—์š”.

๊ทธ๋Ÿผ 77๋ฒˆ์งธ ์ค„์€ ์–ด๋–ค ๊ฒƒ์ผ๊นŒ์š”? `setAccessible()`์€ Field, Method์— ์ ‘๊ทผ์ œ์–ด ์ง€์‹œ์ž์— ์˜ํ•œ ์ œ์–ด๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด ์ฃผ๋Š” Method์ธ ๊ฒƒ์ด์—์š”. ์ผ๋ฐ˜์ ์œผ๋กœ private ์ธ์Šคํ„ด์Šค(Member) ๋ณ€์ˆ˜๋‚˜, Method๋Š” ํ•ด๋‹น Class์˜ ์™ธ๋ถ€์—์„œ ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋Š” ๊ฒƒ์ด์—์š”. ๋งŒ์•ฝ ์ด๋ ‡๊ฒŒ private๋กœ ๋˜์–ด ์žˆ๋Š” ๊ฒƒ์— ์ ‘๊ทผํ•˜๋ ค๊ณ  ํ•˜๋ฉด Exception์ด ํ„ฐ์ ธ ๋ฒ„๋ฆด ๊ฒƒ์ด์—์š”. 

์ด ๋•Œ, `setAccessible(true)`๋ฅผ ์ด์šฉํ•˜๊ฒŒ ๋˜๋ฉด ๋ฌธ์ œ ์—†์ด ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด์—์š”.

๊ฒฐ๊ตญ field ๊ฐ์ฒด์— ๋งˆ์Œ ๊ป ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ ํ–ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ์ข‹์€ ๊ฒƒ์ด์—์š”.

๊ทธ๋ž˜์•ผ ๋‹ค์Œ ์ค„์— getter๋ฅผ ํ†ตํ•ด ์ถœ๋ ฅ์„ ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹Œ๊นŒ์š”!

 

 

System.out.println์„ ์ด์šฉํ•˜์ง€ ์•Š๊ณ , System.err.println์„ ์ด์šฉํ•œ ๊ฒƒ์€ ๋ฐ”๋กœ ์œ„์— ์‚ฌ์ง„์ฒ˜๋Ÿผ ๋นจ๊ฐ›๊ฒŒ ๊ฐ•์กฐํ•˜์—ฌ ์ถœ๋ ฅ๋˜๊ฒŒ ํ•˜๊ณ  ์‹ถ์—ˆ๊ธฐ ๋•Œ๋ฌธ์ธ ๊ฒƒ์ด์—์š”!

 

 

 

    ๐Ÿ”ฝ  Reflection ์‚ฌ์šฉ ์‹œ ๊ณ ๋ฏผ ์‚ฌํ•ญ

1) Reflection์„ ์ด์šฉํ•œ Code๋Š” ์„ฑ๋Šฅ Issue๊ฐ€ ๋ฐœ์ƒ.
  - ์ ์ ˆํ•˜๊ฒŒ ์ž˜ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ์„ฑ๋Šฅ ํ–ฅ์ƒ์„ ๊ธฐ๋Œ€ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด์—์š”.

2) Reflection์„ ์ด์šฉํ•˜์—ฌ ๊ฐœ๋ฐœํ•œ ํ”„๋กœ๊ทธ๋žจ์€ Error๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ์‰ฝ๊ณ , ๋””๋ฒ„๊น…์ด ์–ด๋ ต๋‹ค.
  - Reflection์€ ์ปดํŒŒ์ผ ์‹œ Type Checking์„ ํ•  ์ˆ˜ ์—†๋Š” ๊ฒƒ์ด์—์š”. ๋”ฐ๋ผ์„œ ๋Ÿฐํƒ€์ž„ ์‹œ ์ž˜๋ชป ๋œ ๋งค๊ฐœ ๋ณ€์ˆ˜๋กœ
    ์ธํ•ด ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ์‰ฌ์šด ๊ฒƒ์ด์—์š”. ํ•˜์ง€๋งŒ, ์ ์ ˆํžˆ ์‚ฌ์šฉ๋œ ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ Message๋ฅผ ์ด์šฉํ•ด
    ์ถฉ๋ถ„ํžˆ ๋””๋ฒ„๊น…์ด ์‰ฌ์šด ํ™˜๊ฒฝ์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•˜๋Š” ๊ฒƒ์ด์—์š”.

3) Reflection์„ ์ด์šฉํ•œ Code๋Š” ๋ณต์žกํ•˜๋‹ค.
  - ์ผ๋ฐ˜์ ์œผ๋กœ ๊ฐ์ฒด ์ƒ์„ฑ, Method ํ˜ธ์ถœ Code์— ๋น„๊ตํ•˜๋ฉด ๋ณต์žกํ•œ ๊ฒƒ์ด ์‚ฌ์‹ค์ธ ๊ฒƒ์ด์—์š”. ํ•˜์ง€๋งŒ, Class
    Type ๋น„๊ต๋ฅผ ํ•  ๋•Œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” Code์˜ ๊ฒฝ์šฐ, ๋Œ€๋Ÿ‰์˜ ์กฐ๊ฑด๋ฌธ(if / else)์„ ๋งŒ๋“ค์–ด์•ผ ๋  ์ˆ˜ ์žˆ๊ธฐ
    ๋•Œ๋ฌธ์— ๊ทธ๊ฒƒ ๋ณด๋‹ค Reflection์„ ์ด์šฉํ•˜์—ฌ ์žฌ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“ ๋‹ค๋ฉด ์˜คํžˆ๋ ค Code๋ฅผ ๋‹จ์ˆœํ™”
    ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด์—์š”.

 

 

 

 

 

 

 

 

728x90
๋ฐ˜์‘ํ˜•