[Spring] Spring Advice๋กœ ์ปค์Šคํ…€ ์–ด๋“œ๋ฐ”์ด์Šค ๋งŒ๋“ค๊ธฐ

๋ฐ˜์‘ํ˜•

์ด๋ฒˆ ํฌ์ŠคํŠธ๋ถ€ํ„ฐ๋Š” Spring AOP ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ด์šฉํ•˜์—ฌ ์‹ค์ œ Advice๋ฅผ ๋งŒ๋“ค์–ด๋ณด๊ณ , ์œ„๋น™ํ•˜๋Š” ์‹œ๊ฐ„์„ ๊ฐ€์ ธ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. 

 

 

 

Advice Interface

Advice์— ๋Œ€ํ•ด ๋‹ค์‹œ ๋ณต์Šตํ•ด๋ณด์ž๋ฉด Advice๋Š” ํŠน์ • ์กฐ์ธํฌ์ธํŠธ ์ฆ‰, ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋˜๋Š” ์‹œ์ ์— ์‹คํ–‰ํ•  ์ฝ”๋“œ๋ฅผ ์ •์˜ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ProxyFactory ํด๋ž˜์Šค์—์„œ addAdvice ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•ด ์–ด๋“œ๋ฐ”์ด์Šค๋ฅผ ์ง์ ‘ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ Advisor ๊ตฌํ˜„์ฒด๋ฅผ addAdvice์— ์ „๋‹ฌํ•˜์—ฌ ๊ฐ„์ ‘์ ์œผ๋กœ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์—ˆ์ฃ .

 

๋‘ ๋ฐฉ๋ฒ•์— ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค๋ฉด ์–ด๋“œ๋ฐ”์ด์Šค์™€ ๋‹ฌ๋ฆฌ Advisor๋Š” ๊ด€๋ จ PointCut๊ณผ ํ•จ๊ป˜ ์–ด๋“œ๋ฐ”์ด์Šค๋ฅผ ์ „๋‹ฌํ•œ๋‹ค๋Š” ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. PointCut์€ ์‹ค์ œ ์–ด๋“œ๋ฐ”์ด์Šค๋ฅผ ์–ธ์ œ ์‹คํ–‰ํ• ์ง€๋ฅผ ์ •ํ•˜๋Š” AOP ์šฉ์–ด๋กœ ์–ด๋“œ๋ฐ”์ด์Šค๋ฅผ ์‹คํ–‰ํ•  ์ง€์ ์„ ์ƒ์„ธํ•˜๊ฒŒ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

 

์œ„ ์ด๋ฏธ์ง€๋Š” Spring Advice์˜ ๊ณ„์ธต ๊ตฌ์กฐ๋ฅผ ๋‚˜ํƒ€๋‚ธ ๊ฒƒ์ž…๋‹ˆ๋‹ค. Spring Advice์˜ ๊ณ„์ธต ๊ตฌ์กฐ๋Š” ํ‘œ์ค€ AOP ์–ผ๋ผ์ด์–ธ์Šค ์ธํ„ฐํŽ˜์ด์Šค์™€ ๋™์ผํ•œ ๊ตฌ์กฐ๋กœ ๋˜์–ด ์žˆ์œผ๋ฉฐ ProxyFactory ํด๋ž˜์Šค๋ฅผ ์ˆ˜์ •ํ•˜์ง€ ์•Š๋”๋ผ๋„ ์ƒˆ๋กœ์šด ์–ด๋“œ๋ฐ”์ด์Šค ํƒ€์ž…์„ ์‰ฝ๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๊ตฌ์กฐ๋กœ ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

 

Before Advice

Before Advice๋Š” ์ด๋ฆ„ ๊ทธ๋Œ€๋กœ Target ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋˜๊ธฐ ์ „์— ๋ฐœ์ƒํ•  ์ด๋ฒคํŠธ ์–ด๋“œ๋ฐ”์ด์Šค๋ฅผ Before Advice๋ผ ํ•ฉ๋‹ˆ๋‹ค. Spring Advice์—์„œ๋Š” ์ด๋ฅผ MethodBeforeAdvice๋กœ ์ •์˜ํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋„๋ก ๊ถŒ์žฅํ•˜๋Š”๋ฐ์š”.

 

์˜ˆ๋ฅผ ๋“ค๋ฉด, ์šฐ๋ฆฌ๊ฐ€ ํŠน์ • ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ํ˜ธ์ถœ์„ ํ•˜๋Š” ๋Œ€์ƒ(Caller)์ด ์ถฉ๋ถ„ํ•œ ๊ถŒํ•œ์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค๋ฉด ์ด Advice๊ฐ€ ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

๋จผ์ € ์‚ฌ์šฉ์ž๋ฅผ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ๋Š” UserInfo ๋ผ๋Š” ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์–ด์ค๋‹ˆ๋‹ค.

 

ํ˜„์žฌ ๋กœ๊ทธ์ธ ํ•œ ์‚ฌ์šฉ์ž์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  ๊ด€๋ฆฌํ•˜๋Š” SecurityManager ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์–ด์ค๋‹ˆ๋‹ค.

 

Advice๋ฅผ ์ ์šฉํ•  Target ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์–ด์ค๋‹ˆ๋‹ค. ๋กœ๊ทธ์ธ ํ•œ ์‚ฌ์šฉ์ž์—๊ฒŒ๋งŒ ๋ฉ”์‹œ์ง€๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ๋ฉ”์„œ๋“œ์ธ print๋ฅผ ๋งŒ๋“ค์–ด๋ดค์Šต๋‹ˆ๋‹ค.

 

Target ํด๋ž˜์Šค์— ์ ์šฉํ•  Advice๋ฅผ ๋งŒ๋“ค์–ด์ค๋‹ˆ๋‹ค. ์ด ๋•Œ ์ธ์ฆ ์ •๋ณด๋ฅผ ์•Œ ์ˆ˜ ์—†๋Š” ์œ ์ €์— ๋Œ€ํ•œ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

 

๋งˆ์ง€๋ง‰์œผ๋กœ ์–ด๋“œ๋ฐ”์ด์Šค๊ฐ€ ์ž˜ ๋™์ž‘ํ•˜๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด Bean ๊ฐ์ฒด๋ฅผ ProxyFactory ํด๋ž˜์Šค๋ฅผ ์ด์šฉํ•ด ํ”„๋ก์‹œ ๊ฐ์ฒด๋กœ ๋งŒ๋“ค๊ณ , Advice๋ฅผ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค. 

 

๊ทธ๋Ÿฌ๋ฉด ์œ„์™€ ๊ฐ™์ด UserInfo๊ฐ€ ์žˆ์„ ๋•Œ์™€ ์—†์„ ๋•Œ ์ •ํ™•ํ•˜๊ฒŒ ์ž˜ ๋‚˜์˜ค๊ณ  ์žˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

๊ทธ๋Ÿฐ๋ฐ, SecurityManager ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค๊ณ  TargetBean ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ๋˜ ๋‹ค๋ฅธ SecurityManager ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๋‘ ์‹œ๋‚˜๋ฆฌ์˜ค ๋ชจ๋‘UserInfo ๋ฐ์ดํ„ฐ๊ฐ€ ์•„์˜ˆ NULL์ด ๋˜์–ด ์žˆ์–ด์•ผ ํ•˜๋Š” ๊ฑฐ ์•„๋‹Œ๊ฐ€์š”?

 

ํ”ํžˆ ๋งŽ์ด๋“ค ์ƒ๊ฐํ•˜๋Š” ์งˆ๋ฌธ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์šฐ๋ฆฌ๊ฐ€ ์—ฌ๊ธฐ์„œ ์ฃผ์˜๊นŠ๊ฒŒ ๋ด์•ผํ•  ๊ฒƒ์€ SecurityManager ํด๋ž˜์Šค๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” UserInfo๋Š” ThreadLocal์ด๋ผ๋Š” ์ ์ž…๋‹ˆ๋‹ค. ThreadLocal์€ ํ•˜๋‚˜์˜ ์Šค๋ ˆ๋“œ์—์„œ ์‹คํ–‰๋˜๋Š” ์ฝ”๋“œ๊ฐ€ ๋™์ผํ•œ ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๋Š”๋ฐ, ์ด ๋•Œ๋Š” new ์—ฐ์‚ฐ์ž๋ฅผ ์ด์šฉํ•ด ์ƒˆ๋กœ์šด ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•œ๋‹ค ํ•˜๋”๋ผ๋„ ๊ฐ™์€ ์Šค๋ ˆ๋“œ์—์„œ ์ด๋ค„์ง€๋Š” ์ฝ”๋“œ๋Š” ํ•ญ์ƒ ๋™์ผํ•œ ๊ฐ์ฒด๋กœ ์‹คํ–‰๋œ๋‹ค๋Š” ํŠน์ง•์ด ์žˆ์Šต๋‹ˆ๋‹ค.

 

์ด์— ๋Œ€ํ‘œ์ ์ธ ์˜ˆ์‹œ๊ฐ€ ๋ฐ”๋กœ Spring Security์—์„œ ์ œ๊ณตํ•˜๋Š” ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด(Principal)์ž…๋‹ˆ๋‹ค.

 

์ด ์™ธ์—๋„ BeforeAdvice๋Š” ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์š”์ฒญํ•œ ์ธ์ˆ˜ ๋“ฑ์˜ ์ˆ˜์ •์ด๋‚˜ ๋ฐ์ดํ„ฐ ์ •์ œ์—๋„ ์œ ์šฉํ•˜๊ฒŒ ์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

 

AfterReturning Advice

AfterReturning Advice๋Š” JoinPoint์—์„œ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ์˜ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ–ˆ์„ ๋•Œ๋งŒ ๋™์ž‘ํ•˜๋Š” ์–ด๋“œ๋ฐ”์ด์Šค์ž…๋‹ˆ๋‹ค. Before Advice์™€ ๋‹ฌ๋ฆฌ ๋ฉ”์„œ๋“œ๊ฐ€ ์ด๋ฏธ ์‹คํ–‰ํ•˜๊ณ  ๋‚œ ๋’ค ๋ฐœ์ƒํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ธ์ˆ˜๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ์ž‘์—… ๋“ฑ์€ ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

 

์ด ์–ด๋“œ๋ฐ”์ด์Šค๋ฅผ ๊ฐ€์žฅ ์œ ์šฉํ•˜๊ฒŒ ์“ธ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์—๋Š” Target ๋กœ์ง์˜ ๊ฒฐ๊ด๊ฐ’์— ๋Œ€ํ•œ ๊ฒ€์ฆ์— ์‚ฌ์šฉํ•ด ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ์•”ํ˜ธํ™” ํ‚ค ์ƒ์„ฑ์„ ํ•˜๋Š” ๋กœ์ง์ด ์žˆ์„ ๋•Œ ํ•ด๋‹น ์•”ํ˜ธํ™” ํ‚ค ๊ธธ์ด๊ฐ€ ์งง์œผ๋ฉด ํ•ด๋‹น ํ‚ค๊ฐ€ ์ทจ์•ฝํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๋ ค์ฃผ๋Š” ๊ฒƒ์ด์ฃ .

 

๊ฐ„๋‹จํ•˜๊ฒŒ 3 seed๋ฅผ ์ฃผ๊ณ  1์ด ๋‚˜์™”์„ ๋•Œ ์•ฝํ•œ ํ‚ค๋ฅผ ์ถœ๋ ฅํ•ด์ฃผ๋Š” Target ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์–ด์ค๋‹ˆ๋‹ค.

 

์ด๋ฅผ ๊ฒ€์‚ฌํ•˜๋Š” Advice๋ฅผ ๋งŒ๋“ค์–ด์ค๋‹ˆ๋‹ค. AfterAdvice๋ฅผ ๋งŒ๋“ค ๋•Œ๋Š” Target ํด๋ž˜์Šค์— ํ•ด๋‹นํ•˜๋Š” ๋ฉ”์„œ๋“œ๊ฐ€ ์•ฝ์†๋œ ๊ฒƒ์ธ์ง€๋ฅผ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ณณ์— Advice๋ฅผ ๋„ฃ๊ณ  ํ”„๋ก์‹œ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์—ˆ์„ ๊ฒฝ์šฐ ์—‰๋šฑํ•œ ๊ฐ’์„ ๋Œ€์กฐํ•˜์—ฌ ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

 

์ด 10๋ฒˆ์„ ์‹œ๋„ํ•˜์—ฌ ์–ด๋“œ๋ฐ”์ด์Šค๊ฐ€ ์ œ๋Œ€๋กœ ๋™์ž‘ํ•˜๋Š”์ง€ ํ™•์ธํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 

๋ณด๋‹ค์‹œํ”ผ 1์ด ๋‚˜์™”์„ ๋•Œ๋Š” ๋ณด์•ˆ์— ์ทจ์•ฝํ•œ ํ‚ค๋ฅผ ์ถœ๋ ฅํ•˜๋Š” SecurityException์„ ๋ฐœ์ƒํ•˜๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ STRONG_KEY๊ฐ€ ์ž˜ ์ถœ๋ ฅ๋˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

 

AroundAdvice (MethodInterceptor)

Spring AOP์—์„œ Around๋Š” ๋ฉ”์„œ๋“œ๊ฐ€ ์‹คํ–‰๋˜๋Š” ๋™์•ˆ ๋ฐœ์ƒํ•˜๋Š” ์–ด๋“œ๋ฐ”์ด์Šค์ž…๋‹ˆ๋‹ค. Before + After๋ฅผ ์กฐํ•ฉํ•œ ์–ด๋“œ๋ฐ”์ด์Šค์™€ ๋น„์Šทํ•œ๋ฐ, ๋‹ค๋ฅธ ์ ์ด ์žˆ๋‹ค๋ฉด ๋ฐ˜ํ™˜ ๊ฐ’์„ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค. ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ํŠน์ • ์กฐ๊ฑด์„ ํ†ตํ•ด ์‹ค์ œ ๊ฐ์ฒด์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์‹คํ–‰ํ•˜์ง€ ์•Š ๋„๋ก ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์ฆ‰, Around ์–ด๋“œ๋ฐ”์ด์Šค๊ฐ€ ์‹ค์ œ ๊ฐ์ฒด ๋ฉ”์„œ๋“œ๋ฅผ ์ขŒ์ง€์šฐ์ง€ํ•˜๋ฉฐ ์ „์ฒด ๊ตฌํ˜„์„ ์ƒˆ๋กœ์šด ์ฝ”๋“œ๋กœ ๋ฐ”๊ฟ”๋ฒ„๋ฆฌ๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ Spring ์ปดํฌ๋„ŒํŠธ ๋Œ€๋ถ€๋ถ„์ด ๋ฐ”๋กœ ์ด Around Advice๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๋ฐ์š”. ํŠนํžˆ ์›๊ฒฉ ํ”„๋ก์‹œ ์ง€์› ๊ธฐ๋Šฅ์ด๋‚˜ ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ ๊ธฐ๋Šฅ๋“ค์ด ์—ฌ๊ธฐ์— ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

 

์—ฌ๊ธฐ์— ๋Œ€ํ‘œ์ ์ธ ์˜ˆ์‹œ๋Š” ํ˜ธ์ถœํ•œ ๋ฉ”์„œ๋“œ์˜ ์„ฑ๋Šฅ์„ ์ธก์ •ํ•  ์ˆ˜ ์žˆ๋Š” ํ”„๋กœํŒŒ์ผ๋ง์ด ์žˆ์Šต๋‹ˆ๋‹ค.

 

WorkerBean์— ์–ด๋–ค ํŠน์ •ํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•˜๊ณ  Spring Framework์—์„œ ์ œ๊ณตํ•˜๋Š” StopWatch ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•ด ๋ฉ”์„œ๋“œ๊ฐ€ ์‹คํ–‰๋œ ์‹œ๊ฐ„์„ ์ธก์ •ํ•˜๋Š” ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.

 

์‹ค์ œ๋กœ main ํ•จ์ˆ˜์˜ ์ฝ”๋“œ์—๋Š” Results๋งŒ ์ถœ๋ ฅํ•˜๋„๋ก ํ–ˆ์ง€๋งŒ ProfilingInterceptor์— ์˜ํ•ด ์‹คํ–‰ ์‹œ๊ฐ„๊ณผ Target ๊ฐ์ฒด์˜ ์ •๋ณด๋ฅผ ์ถœ๋ ฅํ•ด์ฃผ๋Š” ๋ถ€๋ถ„๊นŒ์ง€ ์‹คํ–‰ ๊ฒฐ๊ณผ๋กœ ๋‚˜์˜ค๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

 

ThrowAdvice

๋งˆ์ง€๋ง‰์œผ๋กœ ThrowAdvice๋Š” ํ•ญ์ƒ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” JoinPoint ์ดํ›„์— ์‹คํ–‰๋œ๋‹ค๋Š” ์ ์—์„œ AfterReturningAdvice์™€ ์œ ์‚ฌํ•˜์ง€๋งŒ ๋ฉ”์„œ๋“œ๊ฐ€ ์˜ˆ์™ธ๋ฅผ ๋˜์งˆ ๋•Œ๋งŒ ์‹คํ–‰๋˜๋Š” ์–ด๋“œ๋ฐ”์ด์Šค์ž…๋‹ˆ๋‹ค.

 

ThrowAdvice๋Š” AfterRetruningAdvice์™€ ๊ฐ™์ด AfterAdvice๋ฅผ ์ƒ์†๋ฐ›๊ณ  ์žˆ์–ด ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰์„ ๊ฑฐ์˜ ์ œ์–ดํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋‹ค๋งŒ ์˜ˆ์™ธ๋Š” ํ™•์‹คํ•˜๊ฒŒ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ํ”„๋กœ๊ทธ๋žจ์—์„œ ๋ฐœ์ƒํ•œ ์˜ˆ์™ธ๋ฅผ ๋ฌด์‹œํ•˜๊ณ  ์˜ˆ์™ธ์˜ ํƒ€์ž…๋งŒ์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์˜ˆ๋ฅผ ๋“ค๋ฉด ๋ช…ํ™•ํ•˜๊ฒŒ ์ •์˜๋˜์ง€ ์•Š์€ ๋ฐฐ์—ด ์˜ˆ์™ธ๋ฅผ ๋˜์ง€๊ณ  ์žˆ๋Š” API๊ฐ€ ์žˆ๋‹ค๊ณ  ํ–ˆ์„ ๋•Œ, ThrowAdvice๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ•ด๋‹น API์˜ ๋ชจ๋“  ํด๋ž˜์Šค์— ์–ด๋“œ๋ฐ”์ด์Šค๋ฅผ ์ ์šฉํ•ด ์˜ˆ์™ธ ๊ณ„์ธต ๊ตฌ์กฐ๋ฅผ ์ข€ ๋” ๋ช…ํ™•ํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๊ธฐ ์‰ฝ๊ฒŒ ๋‹ค์‹œ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์Šค๋กœ์šฐ ์–ด๋“œ๋ฐ”์ด์Šค๊ฐ€ ๋‹ค๋ฅธ ์–ด๋“œ๋ฐ”์ด์Šค์™€ ์ฐจ์ด์ ์ด ์žˆ๋‹ค๋ฉด ํ•„์ˆ˜๋กœ ๊ตฌํ˜„ํ•ด์•ผ ํ•  ๋ฉ”์„œ๋“œ๊ฐ€ ์—†๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ฒ˜์Œ ์ด ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

ThrowAdvice๊ฐ€ ์ฒซ ๋ฒˆ์งธ๋กœ ์ฐพ๋Š” ๊ฒƒ์€ ๋ฐ”๋กœ ํ•˜๋‚˜ ์ด์ƒ์˜ afterThrowing() public ๋ฉ”์„œ๋“œ์ž…๋‹ˆ๋‹ค. ์ด ๋ฉ”์„œ๋“œ๋Š” ์˜๋ฏธ ์žˆ๋Š” ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์—†์–ด ๋ฐ˜ํ™˜ ํƒ€์ž…์œผ๋กœ void๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹์ง€๋งŒ, ๋ฉ”์„œ๋“œ์˜ ๋ฐ˜ํ™˜ ํƒ€์ž…์€ ์‚ฌ์‹ค ์ค‘์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

 

์ฒซ ๋ฒˆ์งธ afterThrowing ๋ฉ”์„œ๋“œ๋ฅผ ๋ณด๋ฉด Java์˜ ๋ชจ๋“  Exception ํƒ€์ž…์„ ์ธ์ˆ˜๋กœ ์ง€์ •ํ–ˆ๋Š”๋ฐ, ์ด๊ฒƒ์€ ๋ชจ๋“  ์˜ˆ์™ธ ์ผ€์ด์Šค์— ํ•ด๋‹น ๋ฉ”์„œ๋“œ๋ฅผ ์ ์šฉํ•˜๊ฒ ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ๋ฉ”์„œ๋“œ์˜ ๊ฐ€์žฅ ํฐ ์šฐ์„  ์ˆœ์œ„๋Š” ์˜ˆ์™ธ ํƒ€์ž…์„ ์ธ์ž๋กœ ๋ฐ›๋Š” afterThrowing ๋ฉ”์„œ๋“œ๊ฐ€ ์—†์„ ๋•Œ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.

 

๋‘ ๋ฒˆ์จฐ afterThrowing ๋ฉ”์„œ๋“œ๋ฅผ ๋ณด๋ฉด ์˜ˆ์™ธ๋ฅผ ๋˜์ง„ ๋ฉ”์„œ๋“œ(method), ๋ฉ”์„œ๋“œ์— ์ „๋‹ฌ๋œ ์ธ์ˆ˜(args), ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ๋Œ€์ƒ(target), ์žก์•„๋‚ผ ์˜ˆ์™ธ ํƒ€์ž…(ex)์˜ 4๊ฐ€์ง€ ์ธ์ˆ˜๋ฅผ ์„ ์–ธํ–ˆ์Šต๋‹ˆ๋‹ค. ์œ„์—์„œ ๋งํ•œ๋Œ€๋กœ ์ง€์ •๋œ ์˜ˆ์™ธ ํƒ€์ž…์„ ์ธ์ž๋กœ ๋ฐ›๋Š” afterThrowing ๋ฉ”์„œ๋“œ์ด๊ธฐ ๋•Œ๋ฌธ์— IllegalArgumentException์˜ ๊ฒฝ์šฐ์—๋Š” ์ฒซ ๋ฒˆ์จฐ ๋ฉ”์„œ๋“œ๊ฐ€ ์•„๋‹Œ ๋‘ ๋ฒˆ์จฐ ๋ฉ”์„œ๋“œ๊ฐ€ ์‹คํ–‰๋˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. 

 

์ด ์–ด๋“œ๋ฐ”์ด์Šค๋ฅผ ๊ฐ€์žฅ ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์—๋Š” ๋ฐ”๋กœ Exception Logging์ธ๋ฐ์š”. ์ „์ฒด Exception ํƒ€์ž…๋งŒ์„ ์ฃผ๊ณ , loggingํ•˜๋Š” ๋กœ์ง์„ ๋„ฃ๋Š”๋‹ค๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ Exception Logging์„ ํ•œ ๊ณณ์—์„œ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ๋ฅผ ๋ณ„๋„๋กœ ์ˆ˜์ •ํ•˜์ง€ ์•Š๊ณ ๋„ Logging ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์–ด ๋งค์šฐ ์œ ์šฉํ•˜์ง€์š”.

 

 

 

๋งˆ์น˜๋ฉฐ...

Spring์—์„œ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋Š” ์–ด๋“œ๋ฐ”์ด์Šค๋ฅผ ์•Œ์•„๋ณด๊ณ , ๊ฐ„๋‹จํžˆ ์‚ฌ์šฉ๋ฒ•๊ณผ ํŒ์— ๋Œ€ํ•ด ์•Œ์•„๋ดค์Šต๋‹ˆ๋‹ค. ์–ด๋“œ๋ฐ”์ด์Šค์˜ ์ข…๋ฅ˜๋ฅผ ์„ ํƒํ•  ๋•Œ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์š”๊ตฌ ์‚ฌํ•ญ์— ๋”ฐ๋ผ ์–ด๋“œ๋ฐ”์ด์Šค ํƒ€์ž…์„ ์„ ํƒํ•  ์ˆ˜๋„ ์žˆ๊ฒ ์ง€๋งŒ ์ž์‹ ์˜ ํ•„์š”์— ๋”ฐ๋ผ์„œ๋„ ๋งž์ถ”๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ๋‹จ์—ฐ ์š”๊ตฌ์‚ฌํ•ญ ์ถฉ์กฑ๋งŒ์ด ์•„๋‹Œ ์„œ๋น„์Šค์˜ ์œ ์ง€๋ณด์ˆ˜ ์ฐจ์›์—์„œ๋„ ์“ฐ์ผ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

 

์ •๋ฆฌํ•˜์ž๋ฉด BeforeAdvice๋งŒ์œผ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ๊ตณ์ด AroundAdvice๋ฅผ ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋ฌผ๋ก  ์ฐจํ›„๋ฅผ ๋Œ€๋น„ํ•˜๊ธฐ ์œ„ํ•ด AroundAdvice๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค๊ฐ€ ์‰ฝ๊ฒŒ AfterAdvice๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•  ์ˆ˜ ์žˆ๊ฒ ์ง€๋งŒ ์ฝ”๋“œ ๋ฆฌ๋”ฉ์„ ํ•˜๋Š” ๋‹ค์Œ ์‚ฌ๋žŒ์„ ์œ„ํ•ด ์ด ์ฝ”๋“œ๊ฐ€ ์–ด๋–ค ์—ญํ• ์ธ์ง€ ๋งน๋ชฉ์ ์œผ๋กœ ์•Œ ์ˆ˜ ์žˆ๋„๋ก ํ•„์š” ์ด์ƒ์˜ ์ฝ”๋“œ ๊ตฌํ˜„์€ ์ž์ œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

๊ฐ€๋ น ์˜ˆ๋ฅผ ๋“ค๋ฉด BeforeAdvice์—์„œ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ ํšŸ์ˆ˜๋ฅผ ์„ธ๊ณ ์ž ํ•  ๋•Œ BeforeAdvice๋งŒ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด Couter ์ฝ”๋“œ๋งŒ ์ž‘์„ฑํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ AroundAdvice๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ํ˜ธ์ถœ์ž์—๊ฒŒ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•˜๋Š”๋ฐ, ๊ฒฐ๊ตญ ์ด๋Ÿฌํ•œ ํ•„์š” ์ด์ƒ์˜ ์ฝ”๋“œ๋Š” ๋ถˆํ•„์š”ํ•œ ์˜ค๋ฅ˜๋‚˜ ๋ฒ„๊ทธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ์›์ธ์ด ๋  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

 

๋”ฐ๋ฆฌ์„œ ์–ด๋“œ๋ฐ”์ด์Šค๋Š” ์š”๊ตฌ์‚ฌํ•ญ๊ณผ ํ•„์š”์— ๋งž์ถฐ ์ ๋‹นํžˆ ์“ฐ๋˜ ๊ทธ ์ด์ƒ์€ ์‚ฌ์šฉ์„ ์ž์ œํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

 

๋ฐ˜์‘ํ˜•
TAGS.

Tistory Comments