์ฝ๊ฒ ์ดํดํ๋ ์คํ๋ง AOP (~์์ฑ์ค~)
by JiwonDevhttps://jiwondev.tistory.com/151 ๋ฅผ ์ดํดํ๊ธฐ ์ฝ๊ฒ ํ์ด์ ์์ฑํ๋ ๊ธ์ ๋๋ค.
์ ์์ค๋ถํฐ ์์ํด์ ์คํ๋ง AOP๊ฐ ์ด๋ป๊ฒ ๋ง๋ค์ด์ง ์ ์๋์ง๋ฅผ ์ค๋ช ํฉ๋๋ค.
์ด๋ฏธ ์๊ณ ์๋ ๋ด์ฉ์ด ์๋ค๋ฉด ์ ๋นํ ๋๊ธฐ๋ฉด์ ๋ณด๋ ๊ฒ์ ์ถ์ฒ๋๋ฆฝ๋๋ค.
# ๋์ ์ธ์ด์ ์ ์ ์ธ์ด
@ ์ธํฐํ๋ฆฌํฐ๋ ์์ค์ฝ๋๋ฅผ ํ๋จ์, ๋ฌธ์ฅ๋จ์๋ก ๊ธฐ๊ณ์ด๋ก ๋ฒ์ญํด ๋ฐ๋ก ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ ค ์คํํฉ๋๋ค.
:: Python, JS ์ฒ๋ผ ์ธํฐํ๋ฆฌํฐ๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ์๋ ํ์ , ํํ๋ฅผ ๋ฏธ๋ฆฌ ์ ํ์ง ์๊ณ ์์ค์ฝ๋(.py .js)๋ฅผ ์ฝ์ด๋ค์ด๋ฉฐ ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ผ๊ฐ๋ ์๊ฐ ๊ฒฐ์ ๋์ฃ . ๊ทธ๋์ ์๋ฃํ์ ๋ฐ๋ก ์ง์ ํ์ง ์์๋ ๊ด์ฐฎ์ต๋๋ค. ํด๋น ๋ณ์๋ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ๋ ์ค์ ๋ฉ๋ชจ๋ฆฌ์ ์ด๋ป๊ฒ ์ ์ฅํ ์ง ์ ํ๋ฉด ๋๋๊น์. ์ด๋ฅผ ๋์ ๋ฐ์ธ๋ฉ์ ์ฌ์ฉํ๋ ์ธ์ด ๋ผ๊ณ ํํํฉ๋๋ค.
@ ์ปดํ์ผ๋ฌ๋ ์์ค์ฝ๋ ์ ์ฒด๋ฅผ ์ฝ์ด๋ค์ฌ ํ์ ๊ณผ ํํ๋ฅผ ์ง์ ํ๊ณ , ์ต์ ํ๋ ๊ธฐ๊ณ์ด๋ก ๋ง๋ญ๋๋ค.
:: C, CPP ์ฒ๋ผ ์ปดํ์ผ๋ฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์ปดํ์ผ ์์ ์ ๊ฐ์ฒด์ ํ์ , ๋ฉ์๋์ ํํ๊ฐ ์ ๋ถ ๊ณ ์ ๋ฉ๋๋ค. ์์ ์ธํฐํ๋ฆฌํฐ์ ๋ค๋ฅด๊ฒ '์์ค์ฝ๋'๋ฅผ ๊ทธ๋ ๊ทธ๋ ๋ฒ์ญํด์ ์ฌ์ฉํ๋ ๊ฒ์ด ์๋๋ผ, ์์ ๊ธฐ๊ณ์ด๋ก ๋ ํ๋ก๊ทธ๋จ(.exe)๋ฅผ ๋ง๋ค์ด์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ด์ฃ . ๊ทธ๋์ ํ๋ก๊ทธ๋จ ์ฝ๋์ ๋ฉ์๋์ ํํ๋ ๋ฐ์ดํฐ์ ์ข ๋ฅ๋ฅผ ์ ๋ถ ํ์คํ๊ฒ ์ ํด์ค์ผํฉ๋๋ค. ์ด๋ฅผ ์ ์ ์ธ ๋ฐ์ธ๋ฉ์ ์ฌ์ฉํ๋ ์ธ์ด ๋ผ๊ณ ํํํฉ๋๋ค.
@ ๊ทธ๋ ๋ค๋ฉด ์ ์ฐํ๊ฒ ์ฌ์ฉํ ์ ์๋ ์ธํฐํ๋ฆฌํฐ - ๋์ ๋ฐ์ธ๋ฉ์ด ๋ฌด์กฐ๊ฑด ์ข์๊ฑธ๊น์?
:: ์๋จ. ๊ทธ๋ ์ง ์์ต๋๋ค. ์ปดํ์ผ๋ฌ์ฒ๋ผ ํ๋ก๊ทธ๋จ์ด ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ผ๊ฐ๊ธฐ์ ๋ฉ์๋์ ํํ๋ ๋ฐ์ดํฐ์ ์ข ๋ฅ๋ฅผ ์ ํด์ฃผ๋ฉด ์ปดํ์ผ ์์ ์ ํ๋ก๊ทธ๋จ์ด ์คํ๋ ๋ ์ด๋ ํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ง ๋ฏธ๋ฆฌ ์์ธก์ด ๊ฐ๋ฅํฉ๋๋ค. ๋ํ ์ฌ์ฉํ ๋ฉ๋ชจ๋ฆฌ ํฌ๊ธฐ๋ฅผ ๋ฏธ๋ฆฌ ์์ ์๊ณ ๊ฐ๋ฐ์๊ฐ ์์ฑํ ์ฝ๋๋ฅผ ์ปดํ์ผ๋ฌ๊ฐ ๋ ์ต์ ํ์์ผ ์ฑ๋ฅ์ ํฅ์ ์ํฌ ์ ์๋ ์ฌ์ง๋ฅผ ๋ง๋ค์ด ์ค๋๋ค.
@ ํ์ง๋ง ์ปดํ์ผ๋ฌ - ์ ์ ๋ฐ์ธ๋ฉ๋ ๋จ์ ์ด ์์ต๋๋ค.
:: ์ฐ์ , [์ธํฐํ๋ฆฌํฐ - ๋์ ๋ฐ์ธ๋ฉ]์ ๊ฒฝ์ฐ์๋ ํ๋ก๊ทธ๋จ ๋ฐฐํฌ๋ฅผ ์์ค์ฝ๋(ํ
์คํธ)๋ก ํ ์ ์์ต๋๋ค. ๊ทธ๋์ ์ด์์ฒด์ ๊ฐ ๋ฐ๋์ด๋ ์คํํ๋ ์์ ์ ๋ฒ์ญ์ ํ๋๊ฑฐ๋ผ ํฐ ๋ฌธ์ ๊ฐ ์๊ณ ๋คํธ์ํฌ๋ก ์ ์กํ๊ธฐ๋ ์ฝ์ต๋๋ค.
[์ปดํ์ผ๋ฌ - ์ ์ ๋ฐ์ธ๋ฉ]์ ๊ฒฝ์ฐ์๋ ๋ฐฐํฌ๋ฅผ ๊ธฐ๊ณ์ด(.exe)๋ก ํ๊ธฐ ๋๋ฌธ์ ํน์ ์ด์์ฒด์ ์๋ง ์ฌ์ฉํ ์ ์๋ ์ฝ๋๊ฐ ๋ง๋ค์ด์ง๋๋ค. ๊ทธ๋ฌ๋ฉด ์์ค์ฝ๋๋ฅผ ์ ๋ฌํ๊ณ ์ปดํ์ผ๋ฌ๋ฅผ ์ด์์ฒด์ ๋ง๋ค ์ค์นํ๋ฉด ๋์ง ์๋๊ตฌ์? ์๋จ. ์ปดํ์ผ๋ฌ๋ ๋ณต์กํ๊ณ ๋ฌด๊ฑฐ์ด ํ๋ก๊ทธ๋จ์
๋๋ค. ์ธํฐํ๋ฆฌํฐ์ฒ๋ผ ๋ฐ๋ก๋ฐ๋ก ์ฝ์ด์ ๋ฒ์ญํ๋๊ฒ ์๋๋ผ, ์ ์ฒด๋ฅผ ๋ค ์ฝ์ด ์ต์ ํํ๊ธฐ ๋๋ฌธ์ ์ปดํ์ผ ์๊ฐ๋ ์ค๋๊ฑธ๋ฆฌ๊ณ ์ปดํ์ผ๋ฌ๋ฅผ ๋ฐฐํฌ ํ๊ฒฝ๋ง๋ค ๊ฐ์ง๊ณ ์๊ธฐ์๋ ๋ถ๋ด์ค๋ฝ์ฃ . ๋ง์ฝ ๊ทธ๋ ๊ฒ ํ๋ค๋ฉด ํ๋ก๊ทธ๋จ ํ๋ ์คํํ๋๋ฐ 30๋ถ์ฉ ๊ฑธ๋ฆด์ง๋ ๋ชจ๋ฆ
๋๋ค.
# ์๋ฐ์ ๋ฐ์ดํธ์ฝ๋
๊ทธ๋ ๋ค๋ฉด ์๋ฐ๋ ์ธํฐํ๋ฆฌํฐ๋ฅผ ์ฌ์ฉํ๋ ๋์ ์ธ์ด์ผ๊น์? ์ปดํ์ผ๋ฌ๋ฅผ ์ฌ์ฉํ๋ ์ ์ ์ธ์ด์ผ๊น์? ์ ๋ต์ ๋ ๋ค ์ ๋๋ค.์๋ฐ๋ฅผ ๋ง๋ ๊ฐ๋ฐ์๋ค์ ๋ค์๊ณผ ๊ฐ์ ์ฅ์ ๋ค์ ๋ ๋ค ๊ฐ์ง๊ณ ์ถ์์ต๋๋ค.
- ์ปดํ์ผ๋ฌ์ ์ฅ์
- ์ ์ ์ธ ๋ฐ์ด๋ฉ์ ์ฌ์ฉํด์ ์ปดํ์ผ ์์ ์ ์ค๋ฅ๋ฅผ ์ก์ ๋ผ ์ ์๋ค.
- ์ ์ฒด ํ๋ก๊ทธ๋จ ์ฝ๋๋ฅผ ์ฝ์ด๋ค์ฌ ํ๋ก๊ทธ๋จ์ ์ฑ๋ฅ์ ์ต์ ํ ์ํฌ ์ ์๋ค. - ์ธํฐํ๋ฆฌํฐ์ ์ฅ์
- ์ธํฐํ๋ฆฌํฐ๋ ์ปดํ์ผ๋ฌ์ ๋นํด ๊ฐ๋ณ๊ณ ๋ฒ์ญ ์๋๊ฐ ๋น ๋ฅด๋ค.
- ๋ฐฐํฌ ์์ฒด๋ฅผ ์์ค์ฝ๋(ํ ์คํธ)๋ก ์งํํ์ฌ ๋คํธ์ํฌ ๋น์ฉ์ด ์ ๊ฒ๋ ๋ค. ๋ฐฐํฌํ๊ธฐ ์ฝ๋ค.
- ์ฆ, ์ด์์ฒด์ ๋ง๋ค ๊ฐ์ ์์ค์ฝ๋๋ฅผ ์ฌ์ฉํ ์ ์๋ค. ๋ฐ๋ก ๋ง๋ค์ง ์์๋ ๋๋ค.
@ ๊ทธ๋์ ์๋ฐ ๊ฐ๋ฐ์๋ค์ ์์ฃผ ์ฌ๋ฐ๋ ์๊ฐ์ ํ๊ฒ ๋ฉ๋๋ค.
์์ค์ฝ๋๋ฅผ ์ปดํ์ผ ํด์ ๋ฐ๋ก ๊ธฐ๊ณ์ด๋ก ๋ง๋ค์ง ๋ง๊ณ , ์ธํฐํ๋ฆฌํฐ ์ฝ๋๋ก ๋ง๋ค๋ฉด ์ด๋? ๊ทธ๋ผ ์ ์ ์ธ ๋ฐ์ด๋ฉ์ ํตํ ์ค๋ฅ ๊ฒ์ถ + ์ฑ๋ฅ ์ต์ ํ๋ฅผ ์ฑ๊ธฐ๋ฉด์ ์ด์์ฒด์ ์์ ์ธํฐํ๋ฆฌํฐ๋ฅผ ์ด์ฉํด ํด์ํ๋ฉด ๋์์!
๋ค, ๊ทธ๋ ๊ฒ ๋ฑ์ฅํ ๊ฒ์ด ๋ฐ๋ก Java์ฝ๋๋ฅผ ์ปดํ์ผ ํ ๋ฐ์ดํธ์ฝ๋(.class) ์ ๋๋ค. ํ๋ก๊ทธ๋จ์ ๋ฐฐํฌํ ๋ ๊ธฐ๊ณ์ด(.exe)๊ฐ ์๋ ๋ฐ์ดํธ์ฝ๋๋ฅผ ๋ฐฐํฌํ๊ฒ ๋๋ฉฐ, ๋ฐ์ดํธ์ฝ๋๋ ์ฝ์ด๋ค์ฌ์ก์ ๋ ๊ธฐ๊ณ์ด๋ก ๋ฒ์ญ๋์ด ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ผ๊ฐ๋ ์ธํฐํ๋ฆฌํฐ ๋ฐฉ์์ผ๋ก ๋์ํ๊ฒ ๋ฉ๋๋ค. ๊ฐ๋ฐ์๋ ์๋ฐ์ฝ๋๋ฅผ ์ปดํ์ผํ์ฌ ์ฌ์ฉํ๊ณ ๋ฐฐํฌํ ๋ ๊ฐ ์ด์์ฒด์ ์ ์ค์น๋ [JVM์ ์ธํฐํ๋ฆฌํฐ]๋ก ์ฝ๋๋ฅผ ๊ทธ๋ ๊ทธ๋ ๋ฒ์ญํด์ ์ฌ์ฉํ๋๊ฑฐ์ฃ .
# JVM๊ณผ ๋ฐ์ดํธ์ฝ๋์ ๋ํ ์ดํด
๋ฐ์ดํธ์ฝ๋๋ ์๋นํ ์ ์ฐํ ์ธ์ด์ ๋๋ค. ๊ผญ Java๋ก ์์ฑํ์ง ์์๋ ์ ์ฉ ์ปดํ์ผ๋ฌ๋ง ๋ง๋ค๋ฉด ๋ฐ์ดํธ์ฝ๋๋ก ๋ณํํ ์ ์์ต๋๋ค. ํ์ง๋ง ์ด๋ฌํ ๋ฐฉ์๋ ์ปดํ์ผ๋ฌ์ ๊ธฐ๊ณ์ด์์ค ์ต์ ํ์ ๋นํด์๋ ์ฑ๋ฅ์ด ๋งค์ฐ ๋๋ ธ์ต๋๋ค. ์ค์ ๋ก C์ธ์ด๋ณด๋ค ์ฑ๋ฅ์ด ๋๋ฌด ์์ข๋ค๊ณ ๋นํ๋ ๋ง์ด ๋ฐ์์ฃ .
๊ทธ๋์ ์ธํฐํ๋ฆฌํฐ์ ์ฑ๋ฅ์ ์ธ ๋จ์ ์ ํด๊ฒฐํ๊ธฐ ์ํด ์๋ฐ๋ [JIT ์ปดํ์ผ๋ฌ]๋ผ๋ ๊ฐ๋ ์ ์ฌ์ฉํฉ๋๋ค. JVM์์์ ์์ฃผ ์ฌ์ฉ๋๋ ๋ฐ์ดํธ์ฝ๋๋ง ์ ํ์ ์ผ๋ก ๊ธฐ๊ณ์ด๋ก ์บ์ฑํด๋๊ณ ์ฌ์ฌ์ฉ ํ๋ ๋ฐฉ๋ฒ์ด์ฃ . ์ด๋ ์์ธํ๊ฒ ๋ค์ด๊ฐ๋ฉด ๋ด์ฉ์ด ๋๋ฌด ๋ง์ผ๋ฏ๋ก, 2021.08.16 - [๊ธฐ๋ณธ ์ง์/Java ๊ธฐ๋ณธ์ง์] - JVM์ ์๋ฆฌ์ ๋ฐ์ดํธ์ฝ๋๋ฅผ ์ฝ์ด๋ณด์๊ธธ ๋ฐ๋์.
- Java ์ธ์ด๋ ์ปดํ์ผ๋ฌ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํธ์ฝ๋๋ก ๋ณ์ญ๋ฉ๋๋ค. ๊ทธ๋์ ์ ์ ์ธ ๋ฐ์ด๋ฉ์ ์ฌ์ฉํ๊ธฐ์ ํ๋ฒ ํํ๊ฐ ์ ํด์ง ๋ฉ์๋, ํ๋ ๊ฐ๋ค์ ์คํ์์ ์ ๋ง์๋๋ก ๋ณ๊ฒฝ์ด ๋ถ๊ฐ๋ฅํฉ๋๋ค.
- ํ์ง๋ง ๋ฐ์ดํธ์ฝ๋๋ ๊ฐ๋ฅํฉ๋๋ค. ์ธํฐํ๋ฆฌํฐ์ ๋์ผํ ๋ฐฉ์์ผ๋ก ๋์ํ๊ณ , ๊ฒฐ๊ตญ ๋ฐ์ดํธ์ฝ๋๋ ์ฝํ์ง๋ ์์ ์ ๊ธฐ๊ณ์ด๋ก ๋ฒ์ญ๋๊ณ ๋ฉ๋ชจ๋ฆฌ์ ๋ฑ๋ก๋๊ธฐ ๋๋ฌธ์ ๋ด๊ฐ [int a] ๋ผ๊ณ ์ ํ์ด๋ ์คํ์์ ์ [double a]๋ก ํํ๋ฅผ ๋ฐ๊ฟ ์ ์๋ค๋ ๋ง์ด์ฃ .
# ๋ฐ์ดํธ์ฝ๋๋ฅผ ๋ด ๋ง์๋๋ก ์กฐ์ ํ ์ ์๋์?
๊ฒฐ๊ตญ์๋ ๋ฐ์ดํธ์ฝ๋๋ JVM์ด ์ฝ์ด๋ค์ฌ ์คํํ๊ธฐ ์ ๊น์ง ํ์ผ๋ก ์ด๋ฃจ์ด์ง '๋ฐ์ดํฐ' ์ ๋๋ค. ์ ์ ํ ๋๊ตฌ๊ฐ ์๋ค๋ฉด ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด๋ค์ด๊ณ ์ํ๋๋ฐ๋ก ์กฐ์ํ ์ ์์ต๋๋ค. ์ค์ ๋ก [์ํ์น์ BCEL], [Objectweb์ ASM]๋ฑ์ ๋๊ตฌ๋ค์ ์ด์ฉํ๋ฉด ์๋์ ๊ฐ์ ์์ ์ ํ ์ ์์ต๋๋ค.
- ๋ถ์ : ๋ฐ์ดํธ์ฝ๋๋ฅผ ์ฝ์ด๋ค์ฌ ์ ์ฌ์ ์ธ ๋ฒ๊ทธ๋ฅผ ์ฐพ๊ฑฐ๋ ๋์ปดํ์ผ(์ญ๊ณตํ)์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
- ์์ฑ : ๊ธฐ์กด์ ์๋ฐ์ฝ๋๋ก ์๋ก์ด ๋ฐ์ดํธ์ฝ๋๋ฅผ ์์ฑํด๋ผ ์ ์์ต๋๋ค.
- ๋ณ๊ฒฝ : ๋ฐ์ดํธ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ์ฌ ํ๋ก๊ทธ๋จ์ ์ต์ ํํ๊ฑฐ๋ AOP๋ฅผ ๊ตฌํํด ์ฑ๋ฅ ๋ชจ๋ํฐ๋ง, ๋๋ฒ๊น ์ฝ๋๋ฅผ ์ถ๊ฐํฉ๋๋ค.
์ค์ ๋ก ASM ๊ฐ์ ๊ฒ๋ค์ ํ์ฉํ์ฌ JIT ์ปดํ์ผ๋ฌ๋ AspectJ ๊ฐ์ ๋ฐ์ดํธ์ฝ๋ ์กฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ง๋ค์๋ต๋๋ค.
@ ์ด, ๊ทธ๋ฌ๋ฉด ์๋ฐ์์ค ์ฝ๋๋ฅผ ์กฐ์ํ ์๋ ์๊ฒ ๋ค์?
์ด๊ฑด ์ด๋ฏธ ์์์ ๋ต๋ณ์ ํ์ต๋๋ค. ๋น์ฐํ ๊ฐ๋ฅ์ ํ์ง๋ง ์ปดํ์ผ๋ฌ๋ ๋ฒ์ญ์๋๊ฐ ๋๋ฆฌ๊ณ ํ๋ก๊ทธ๋จ์ด ๋ฌด๊ฑฐ์์ ์ค์ฌ์ฉ์ด ์ด๋ ต์ต๋๋ค.
# ์๋ฐ์งํ (JVM)์์ ์ ๊ณตํ๋ ๊ณต์์ ์ธ ๋ฐ์ดํธ์ฝ๋ ์กฐ์๊ธฐ๋ฅ์ ์๋์?
๊ณต์์ ์ผ๋ก ์ ๊ณตํ๋ ์๋ฐ ๋ฆฌํ๋ ์ API (Refelction API)์ ์๋ฐ ์ปดํ์ผ๋ฌ์ ๋ด์ฅ๋ ์ด๋ ธํ ์ด์ ํ๋ก์ธ์๊ฐ ์์ต๋๋ค.
@ ๋ฆฌํ๋ ์ ๊ธฐ์ ์ด ๋ฑ์ฅํ ์ด์
์์์ ๋งํ๋ ๊ฒ์ฒ๋ผ ๋ฐ์ดํธ์ฝ๋๋ฅผ ์กฐ์ํ๋ ๊ฑด ๊ฐ๋ฅํ์ง๋ง, [์๋ฐ์ฝ๋๋ก ์์ฑ๋ ๊ฐ์ฒด]์์ ๋ด๊ฐ ์ํ๋ ๋ถ๋ถ์ ๋ฐ์ดํธ์ฝ๋์์ ์ฐพ์ ์ฝ๊ณ ์์ ํ๊ธฐ๋ ๋งค์ฐ ์ด๋ ต์ต๋๋ค. ์ปดํ์ผ ๋ ๋ฐ์ดํธ์ฝ๋์์ ๋ด๊ฐ ์ํ๋ ๊ฐ์ฒด์ ๊ตฌ์กฐ์ ๋ฉ์๋, ํ๋ ์ ๋ณด๋ฅผ ์ฐพ๋๊ฑด ๋ง์ด ์๋์ฃ .
๊ทธ๋์ ์๋ฐ์์๋ ๋ฆฌํ๋ ์ API๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฆฌํ๋ ์ ์ด๋ ๊ฑฐ์ธ, ํฌ์ํ๋ค๋ ์๋ฏธ๋ก [ํด๋์ค์ ์ ๋ณด๋ฅผ ๋ด๋ ๊ฐ์ฒด]๋ฅผ ๋ฆฌํ๋ ์ ๊ฐ์ฒด๋ผ๊ณ ๋งํฉ๋๋ค. ์ค์ ๋ก ์๋ฐ์ ๋ชจ๋ ๊ฐ์ฒด๋ [ํด๋์ค์ ์ ๋ณด๋ฅผ ๋ด๋ ๊ฐ์ฒด, ์ฆ ๋ฆฌํ๋ ์ ๊ฐ์ฒด]๋ฅผ ๊ธฐ๋ณธ์ ์ผ๋ก ๊ฐ์ง๊ณ ์์ต๋๋ค.
// ๋ฆฌํ๋ ์
๊ฐ์ฒด ๋ฐํ (ํด๋์ค ๋ฉค๋ฒ)
Class reflection1 = Object.class
Book book = new Book();// Object.getClass()๋ก ๋ฆฌํ๋ ์
๊ฐ์ฒด ๋ฐํ
Class<? extends Book> reflection2 = book.getClass();
์๋์ ๊ฐ์ด ๋ฌธ์์ด์ ์ด์ฉํด์ ๋ด๊ฐ ์ํ๋ ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ ์๋๊ฒ๋, ๋ฆฌํ๋ ์ ๊ฐ์ฒด๋ฅผ ์ด์ฉํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
Class myObjectClass = Class.forName("me.package.className"); // ํด๋์ค๋ฅผ ์์ฑ ํ ๋ฐํ
Class.forName("oracle.jdbc.driver.OracleDriver");
// ์ฐธ๊ณ :: Class.forName() ๋ฉ์๋ ์ ์. ๋ฌธ์์ด์ ์ด์ฉํด์ ํด๋น ๋ฆฌํ๋ ์
๊ฐ์ฒด๋ฅผ ์ฐพ์.
public static Class<?> forName(String className)
throws ClassNotFoundException {...}
@ JDK ๋ฆฌํ๋ ์ API
์๋ฐ์์๋ JVM์ด ๋ฐ์ดํธ์ฝ๋๋ฅผ ์ฝ๋ค๊ฐ [ํน์ ๊ฐ์ฒด์ ์ฝ๋๋ฅผ ์ฝ์ด๋ค์๊ฑฐ๋ ์กฐ๊ฑด์ด ๋ฐ์ํ์ ๋] JVM์ ์ธํฐ๋ฝํธ๋ฅผ ๊ฑธ์ด ๋ด๊ฐ ์ํ๋ ์ฝ๋๊ฐ ์คํ๋๋๋ก ๋ง๋ค ์ ์์ต๋๋ค. ์ด๋ฅผ ๊ฐ๋ฐ์๊ฐ ์ํ๋๋ฐ๋ก ๊ฐ๋ฅํ๊ฒ ์๋ฐ ์ฝ๋๋ฅผ ์ด์ฉํ API๋ฅผ ์ ๊ณตํด์ฃผ๋๋ฐ, ์ด๊ฒ์ด ๋ฐ๋ก JDK Reflcetion API (java.lang.reflect) ์ ๋๋ค.
public class App {
public static void main(String[] args) {
Class<User> userClass = User.class;
User user = new User("test", "name", "1234"); // ํ
์คํธ์ฉ ์ธ์คํด์ค
Arrays.stream(userClass.getDeclaredFields())
.forEach(filed -> {// User.class์ ์ ์๋ ํ๋๋ฅผ ๋ชจ๋ ๊ฐ์ ธ์์
try {
filed.setAccessible(true); // private ์ ๊ทผ์ ์ด์ ๋ฌด์
// filed.get(์ธ์คํด์ค)๋ก ํด๋น ์ธ์คํด์ค์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด์ ๋ฐํํจ.
// ๋ง์ฝ .get(null)์ ํ๋ค๋ฉด static์ธ ํด๋์ค ๋ฐ์ดํฐ๋ฅผ ๋ฐํํจ.
System.out.println(filed + " " + filed.get(user));
} catch (IllegalAccessException e) {
// ์๋ชป๋ ์ ๊ทผ, ํด๋น ๋ฉ์๋๊ฐ ์๋ ๊ฒฝ์ฐ๋ฑ๋ฑ..
}
});
}
}
Object.class ์์๋ ํด๋น ๊ฐ์ฒด์ [๋ฆฌํ๋ ์ ๊ฐ์ฒด]๊ฐ ์์ผ๋ฉฐ Class<?> ํ์ ์ ๋๋ค. ์๋์ ๊ฐ์ ๋ฉ์๋๋ค์ ์ ๊ณตํฉ๋๋ค.
~ ์คํ๋ง AOP๋ฅผ ์ง์ ์ฌ์ฉํด๋ณด๊ณ ์์ฑํ ์์ ~
- ๋์ ๋ฐ์ธ๋ฉ์ ํ์์ฑ, ํ๋ก์
- ํ๋ก์๋?
- ๋ฆฌํ๋ ์ ์ ์ด์ฉํ ๋ค์ด๋๋ฏน ํ๋ก์ (JDK refelct.proxy)
- ํ๋ก์ ์์ฑ ๋ผ์ด๋ธ๋ฌ๋ฆฌ CGLib (๋ฐ์ดํธ์ฝ๋๋ฅผ ์กฐ์ํ๋ ASM๋ก ๋ง๋ค์ด์ง)
- CGlib์ JDK ๋น๊ต, ์ฅ๋จ์
- AOP๋ ๋ฌด์์ธ๊ฐ
- ์คํ๋ง AOP๋ ๋ค์ด๋๋ฏน ํ๋ก์๋ฅผ ์ด์ฉํด ๋ง๋ ๊ธฐ๋ฅ์ด๋ค.
- AspectJ์ ์คํ๋ง AOP์ ์ฐจ์ด (์คํ๋ง AOP๋ ์ปจํ ์ด๋ ๋น์๋ง ์ ์ฉ์ํฌ๋ ค๊ณ ๋ง๋ฌ. ๋ฉ์๋๋ง ์กฐ์ํจ.)
- AspectJ, ์ง์ ํ AOP ์๋ฃจ์
- RTW, CTW, LTW ์ ์ฐจ์ด
- ์๋ฐ์์ ์ ๊ณตํ๋ ๋ฐ์ดํธ์ฝ๋์กฐ์ ๋น๋ ํด, ์ด๋ ธํ ์ด์ ํ๋ก์ธ์
- ์ด๋ ธํ ์ด์ ์ด ๋์จ ์ด์ ์ ํ ์ ์๋์ผ
- lombok์ ํน์ด์ผ์ด์ค. ์ปดํ์ผ๋ฌ ๋ฉ์๋ ํดํน
'๐ฑ Spring Framework > Spring Core' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
DB์ @Transactional์ ์ฌ์ฉํ ๋ ์์ฃผ ๋์ค๋ ์ค์ (0) | 2021.08.18 |
---|---|
@Transactional ์ ๋์์๋ฆฌ, ํธ๋์ญ์ ๋งค๋์ (5) | 2021.08.18 |
ํ ๋น์์คํ๋ง#2 ์ฑ๊ธํค ๋ ์ง์คํธ๋ฆฌ์ ์ค๋ธ์ ํธ ์ค์ฝํ (0) | 2021.08.14 |
ํ ๋น์ ์คํ๋ง#1 ์ค๋ธ์ ํธ์ ์์กด๊ด๊ณ (0) | 2021.08.14 |
#11 ๋น ์ค์ฝํ(+Provider, ํ๋ก์ ๋ชจ๋) (0) | 2021.08.03 |
๋ธ๋ก๊ทธ์ ์ ๋ณด
JiwonDev
JiwonDev