βœ… Spring_

πŸ”₯ [Spring AOP] AdviceλŠ” μ–Έμ œ μ‹€ν–‰λ˜κ³  μ–΄λ–»κ²Œ μ“°μ΄λŠ”κ°€? (Before, After, Around, Returning, Throwing μ „λΆ€ 정리)

CodeLoge 2025. 4. 23. 21:57

πŸ“Œ μ™œ AOPλ₯Ό μ•Œμ•„μ•Ό ν•˜λŠ”κ°€?

μ„œλΉ„μŠ€μ˜ 둜그λ₯Ό 찍고, μ„±λŠ₯을 λΆ„μ„ν•˜κ³ , μ˜ˆμ™Έλ₯Ό μ²˜λ¦¬ν•˜λ €λ©΄ ν•΅μ‹¬ λ‘œμ§μ„ κ±΄λ“œλ¦¬μ§€ μ•Šκ³ λ„ μ²˜λ¦¬ν•  수 μžˆλŠ” 기술이 ν•„μš” → λ°”λ‘œ 그게 AOP
AOPλ₯Ό 잘 μ“°λ©΄ 쀑볡 λ‘œμ§μ€ 쀄고, μœ μ§€λ³΄μˆ˜λŠ” μ‰¬μ›Œμ§€κ³ , μ½”λ“œμ˜ 관심사가 κΉ”λ”ν•˜κ²Œ 뢄리됨

 

βš™οΈ AOP 적용 ꡬ쑰 μš”μ•½

 

 Pointcut : 어디에 (ex. νŠΉμ • λ©”μ„œλ“œ)

 Advice : 무엇을 ν• μ§€ (ex. 둜그 찍기, μ‹œκ°„ μΈ‘μ • λ“±)

 JoinPoint / ProceedingJoinPoint : μ‹€μ œ λŒ€μƒ λ©”μ„œλ“œμ™€ κ·Έ μΈμžμ— μ ‘κ·Όν•˜κΈ° μœ„ν•œ λ°”μΈλ“œ λ³€μˆ˜

 Weaving : λŸ°νƒ€μž„ μ‹œ μ‹€μ œλ‘œ AOPκ°€ μ μš©λ˜λŠ” μ‹œμ 

 

πŸ” Advice μ’…λ₯˜λ³„ 핡심 정리

 

βœ… Before

• λ©”μ„œλ“œ μ§„μž… 직전에 μ‹€ν–‰

 JoinPoint μ‚¬μš©

 μ˜ˆμ‹œ : System.out.println(jp.getSignature().getName()) → λ©”μ„œλ“œ 이름 확인

 λŒ€ν‘œ μš©λ„ : "이제 XX μ„œλΉ„μŠ€ μ‹œμž‘ν•©λ‹ˆλ‹€" 둜그 찍기

βœ… After

 λ©”μ„œλ“œ μ’…λ£Œ 직후 (성곡/μ˜ˆμ™Έ μƒκ΄€μ—†μŒ)

 λ©”μ„œλ“œκ°€ 뭘 λ°›μ•˜λŠ”μ§€ 확인 κ°€λŠ₯ (jp.getArgs())

 λŒ€ν‘œ μš©λ„ : μ–΄λ–€ μΈμžκ°€ λ“€μ–΄μ™”λŠ”μ§€ 확인

βœ… Returning

 λ©”μ„œλ“œκ°€ μ •μƒμ μœΌλ‘œ μ’…λ£Œλ˜κ³  κ°’ λ°˜ν™˜λ˜μ—ˆμ„ λ•Œ μ‹€ν–‰

 λ°˜ν™˜ 객체에 따라 둜직 λΆ„κΈ° κ°€λŠ₯

if(returnObj instanceof BoardVO){...}
else if(returnObj instanceof MemberVO){...}

 λŒ€ν‘œ μš©λ„: “κ΄€λ¦¬μž λ‘œκ·ΈμΈν–ˆμŠ΅λ‹ˆλ‹€” 같은 상황 ꡬ뢄

 

βœ… Throwing

 μ˜ˆμ™Έ λ°œμƒ μ‹œμ μ—λ§Œ μ‹€ν–‰

 μ˜ˆμ™Έ 둜그 남기기

 ThrowingAdvice ν΄λž˜μŠ€μ— μ˜ˆμ™Έ 처리 둜직 μž‘μ„±

βœ… Around

 λ©”μ„œλ“œ μ‹€ν–‰ μ „ν›„ 전체λ₯Ό 감쌈

 ProceedingJoinPoint μ‚¬μš©

 μ„±λŠ₯ μΈ‘μ •, μ‹œκ°„ 기둝 λ“± 전체 흐름 좔적에 μ‚¬μš©

StopWatch sw = new StopWatch();
sw.start();
Object result = pjp.proceed();
sw.stop();
System.out.println(sw.getTotalTimeMillis());

 

πŸ’₯ μ‹€μˆ˜ λ°©μ§€ 포인트

 Returning → Throwing은 순차적으둜 μ μš©λ˜μ§€ μ•ŠμŒ

 μ˜ˆμ™Έκ°€ λ°œμƒν•˜λ©΄ Returning은 μ‹€ν–‰λ˜μ§€ μ•ŠμŒ

 μ΄λŸ΄ 땐 Aroundκ°€ λ‹΅ (전체λ₯Ό Try-Catch-Finally ꡬ쑰둜 감쌈)

 μ›ν•˜λŠ” Adviceκ°€ μ•ˆ 먹힐 땐 ApplicationContext μ„€μ •νŒŒμΌ ν™•인

 static λ©”μ„œλ“œμ—λŠ” AOP 적용 λΆˆκ°€ (객체화 μ „μ œ)

 

πŸ€” κ³ μ°°

 κ³΅ν†΅λ‘œμ§μ΄ λŠ˜μ–΄λ‚ μˆ˜λ‘ Advice 클래슀λ₯Ό 쀄일 수 μžˆλŠ” ꡬ쑰 κ³ λ―Ό

 AOP의 μ‹€μ œ λ™μž‘ μ‹œμ μ„ μ •ν™•νžˆ μ΄ν•΄ν•˜κ³  써야 μ œλŒ€λ‘œ 먹힘

 

🧠 마무리 μš”μ•½

 

Advice μ’…λ₯˜ μ–Έμ œ 싀행됨 주둜 μ“°λŠ” 상황
Before λ©”μ„œλ“œ μ‹€ν–‰ μ „ μ‹œμž‘ 둜그 찍기
After λ©”μ„œλ“œ μ‹€ν–‰ ν›„ (무쑰건) 인자 좜λ ₯ λ“±
Returning 정상 리턴 μ‹œ κ²°κ³Ό 기반 λΆ„κΈ° 처리
Throwing μ˜ˆμ™Έ λ°œμƒ μ‹œ μ—λŸ¬ λ‘œκΉ… 및 처리
Around 전체 감쌈 μ‹œκ°„ μΈ‘μ •, 흐름 μ œμ–΄