JiwonDev

์‰ฝ๊ฒŒ ์ดํ•ดํ•˜๋Š” ์Šคํ”„๋ง AOP (~์ž‘์„ฑ์ค‘~)

by JiwonDev

https://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์˜ ์›๋ฆฌ์™€ ๋ฐ”์ดํŠธ์ฝ”๋“œ๋ฅผ ์ฝ์–ด๋ณด์‹œ๊ธธ ๋ฐ”๋ž˜์š”.

 

JVM์˜ ์›๋ฆฌ์™€ ๋ฐ”์ดํŠธ์ฝ”๋“œ

ํ•ด๋‹น ๊ธ€์€ https://www.inflearn.com/course/the-java-code-manipulation/ ๋ฅผ ๊ณต๋ถ€ํ•˜๊ณ  ์ •๋ฆฌํ•œ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค. #1 JVM ์šฉ์–ด ์ •๋ฆฌ 2021.06.30 - [๊ธฐ๋ณธ ์ง€์‹/Java ๊ธฐ๋ณธ์ง€์‹] - JVM(์ž๋ฐ”๊ฐ€์ƒ๋จธ์‹ )๊ณผ JRE, JDK ์ž๋ฐ” ๋ฐ”์ด..

jiwondev.tistory.com

 

  • 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) {
                        // ์ž˜๋ชป๋œ ์ ‘๊ทผ, ํ•ด๋‹น ๋ฉ”์„œ๋“œ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ๋“ฑ๋“ฑ..
                    }
                });
    }
}

๋ฆฌํ”Œ๋ ‰์…˜ API๋ฅผ ์ด์šฉํ•ด ์›ํ•˜๋Š” ๊ฐ์ฒด์˜ ๋ฐ”์ดํŠธ์ฝ”๋“œ๋ฅผ ์ฝ๊ณ  ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Object.class ์•ˆ์—๋Š” ํ•ด๋‹น ๊ฐ์ฒด์˜ [๋ฆฌํ”Œ๋ ‰์…˜ ๊ฐ์ฒด]๊ฐ€ ์žˆ์œผ๋ฉฐ Class<?> ํƒ€์ž…์ž…๋‹ˆ๋‹ค. ์•„๋ž˜์™€ ๊ฐ™์€ ๋ฉ”์„œ๋“œ๋“ค์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. 

 

~ ์Šคํ”„๋ง AOP๋ฅผ ์ง์ ‘ ์‚ฌ์šฉํ•ด๋ณด๊ณ  ์ž‘์„ฑํ•  ์˜ˆ์ •~

 

- ๋™์ ๋ฐ”์ธ๋”ฉ์˜ ํ•„์š”์„ฑ, ํ”„๋ก์‹œ

- ํ”„๋ก์‹œ๋ž€?

- ๋ฆฌํ”Œ๋ ‰์…˜์„ ์ด์šฉํ•œ ๋‹ค์ด๋‚˜๋ฏน ํ”„๋ก์‹œ (JDK refelct.proxy)

- ํ”„๋ก์‹œ ์ƒ์„ฑ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ CGLib (๋ฐ”์ดํŠธ์ฝ”๋“œ๋ฅผ ์กฐ์ž‘ํ•˜๋Š” ASM๋กœ ๋งŒ๋“ค์–ด์ง)

- CGlib์™€ JDK ๋น„๊ต, ์žฅ๋‹จ์ 

- AOP๋ž€ ๋ฌด์—‡์ธ๊ฐ€

- ์Šคํ”„๋ง AOP๋Š” ๋‹ค์ด๋‚˜๋ฏน ํ”„๋ก์‹œ๋ฅผ ์ด์šฉํ•ด ๋งŒ๋“  ๊ธฐ๋Šฅ์ด๋‹ค.

- AspectJ์™€ ์Šคํ”„๋ง AOP์˜ ์ฐจ์ด (์Šคํ”„๋ง AOP๋Š” ์ปจํ…Œ์ด๋„ˆ ๋นˆ์—๋งŒ ์ ์šฉ์‹œํ‚ฌ๋ ค๊ณ  ๋งŒ๋“ฌ. ๋ฉ”์„œ๋“œ๋งŒ ์กฐ์ž‘ํ•จ.)

- AspectJ, ์ง„์ •ํ•œ AOP ์†”๋ฃจ์…˜

- RTW, CTW, LTW ์˜ ์ฐจ์ด

 

- ์ž๋ฐ”์—์„œ ์ œ๊ณตํ•˜๋Š” ๋ฐ”์ดํŠธ์ฝ”๋“œ์กฐ์ž‘ ๋นŒ๋“œ ํˆด, ์–ด๋…ธํ…Œ์ด์…˜ ํ”„๋กœ์„ธ์„œ

- ์–ด๋…ธํ…Œ์ด์…˜์ด ๋‚˜์˜จ ์ด์œ ์™€ ํ•  ์ˆ˜ ์žˆ๋Š”์ผ

- lombok์€ ํŠน์ด์ผ€์ด์Šค. ์ปดํŒŒ์ผ๋Ÿฌ ๋ฉ”์„œ๋“œ ํ•ดํ‚น

 

๋ธ”๋กœ๊ทธ์˜ ์ •๋ณด

JiwonDev

JiwonDev

ํ™œ๋™ํ•˜๊ธฐ