[Spring] AOP(03) - Advice Type


Advice Type

aop에 μ‚¬μš©λ˜λŠ” advice의 μ’…λ₯˜μ™€ μ„€λͺ…에 λŒ€ν•œ ν¬μŠ€νŠΈμ΄λ‹€.

Adviceμ„€μ •
@Beforetarget λ©”μ„œλ“œκ°€ μ‹€ν–‰λ˜κΈ° 전에 μ‹€ν–‰λœλ‹€.
@Aftertarget λ©”μ„œλ“œκ°€ μ‹€ν–‰λœ 후에 μ‹€ν–‰λœλ‹€.
@AfterReturningtarget λ©”μ„œλ“œκ°€ μ •μƒμ μœΌλ‘œ μ’…λ£Œλ˜μ—ˆμ„ λ•Œ μ‹€ν–‰λœλ‹€.
@AfterThrowing- target λ©”μ„œλ“œμ—μ„œ throwing(μ—λŸ¬)이 λ°œμƒν–ˆμ„ λ•Œ μ‹€ν–‰λœλ‹€.
- μ—λŸ¬κ°€ λ°œμƒν•˜λŠ” μ¦‰μ‹œ μ‹€ν–‰λœλ‹€.
@Around- λ©”μ„œλ“œλ₯Ό κ°μ‹ΈλŠ” ν–‰μœ„λ‘œ μ‹€ν–‰ μ•ž, λ’€ λͺ¨λ‘ 영ν–₯을 λ―ΈμΉ  수 μžˆλ‹€.
- Advice 쀑 κ°€μž₯ κ°•λ ₯ν•˜λ‹€.
  • advice μ‹€ν–‰ μˆœμ„œ
    • Before -> AfterThrowing -> AfterReturning -> After



@Around

around μ–΄λ“œλ°”μ΄μŠ€ λ©”μ„œλ“œμ˜ κ΅¬μ‘°λŠ” λ‹€μŒκ³Ό 같이 κ΅¬μ„±λœλ‹€.

(1) Before μ‹€ν–‰ λΆ€λΆ„

try {
    (2) target λ©”μ„œλ“œ μ‹€ν–‰ λΆ€λΆ„

    (3) AfterReturning μ‹€ν–‰ λΆ€λΆ„

} catch () {

    (4) AfterThrowing μ‹€ν–‰ λΆ€λΆ„
} 

(5) After μ‹€ν–‰ λΆ€λΆ„

Around μ–΄λ“œλ°”μ΄μŠ€λ₯Ό μ‚¬μš©ν•  κ²½μš°μ— JoinPointλŒ€μ‹  proceed()κ°€ μ‘΄μž¬ν•˜λŠ” ProceedingJoinPoint을 μ‚¬μš©ν•œλ‹€.

target λ©”μ„œλ“œ λΆ€λΆ„μ—μ„œ ν•΄λ‹Ή λ©”μ„œλ“œλ₯Ό μ‹€ν–‰ν•  κ²½μš°μ—” λ‹€μŒκ³Ό 같이 μž‘μ„±ν•˜λ©΄ λœλ‹€.

@Around
public void aroundAdvice(ProceedingJoinPoint pjp) {
    // before λΆ€λΆ„

    try {
        // target λ©”μ„œλ“œ μ‹€ν–‰
        pjp.proceed(pjp.getArgs());
    }
}

aspectλ₯Ό μ‹€ν–‰ν•  λ•Œ λ§€κ°œλ³€μˆ˜λ₯Ό μ²˜λ¦¬ν•˜κ±°λ‚˜ μˆ˜μ •ν•  μ΄μœ κ°€ μ—†λ‹€λ©΄ joinpointλ₯Ό λ§€κ°œλ³€μˆ˜λ‘œ λ„£μ§€ μ•Šμ•„λ„ λœλ‹€.

// λ‘˜μ€ 같은 역할을 ν•œλ‹€.
pjp.proceed(pjp.getArgs());
pjp.proceed();