Post

AOP, Spring AOP

AOP, Spring AOP

πŸ“Œ AOPλž€?

AOP(Aspect-Oriented Programming) 은 μ—¬λŸ¬ λͺ¨λ“ˆμ—μ„œ λ°˜λ³΅λ˜λŠ” 곡톡 κΈ°λŠ₯을 ν•˜λ‚˜μ˜ λͺ¨λ“ˆλ‘œ λΆ„λ¦¬ν•˜μ—¬ μž¬μ‚¬μš©μ΄ κ°€λŠ₯ν•œ λͺ¨λ“ˆλ‘œ λ§Œλ“œλŠ” ν”„λ‘œκ·Έλž˜λ° νŒ¨λŸ¬λ‹€μž„μ„ λ§ν•œλ‹€. 관점 μ§€ν–₯ ν”„λ‘œκ·Έλž˜λ°μ΄λΌκ³  λΆ€λ₯Έλ‹€.

λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ„ μž‘μ„±ν•˜λ‹€ 보면, μ—¬λŸ¬ λͺ¨λ“ˆμ— 걸쳐 κ³΅ν†΅μœΌλ‘œ ν•„μš”ν•œ κΈ°λŠ₯듀이 μ€‘λ³΅μœΌλ‘œ κ΅¬ν˜„λ˜λŠ” κ²½μš°κ°€ λ§Žλ‹€. μ΄λ ‡κ²Œ μ½”λ“œμ˜ 쀑볡성이 μ¦κ°€ν•˜λ©΄ μœ μ§€λ³΄μˆ˜ μ‹œ 큰 어렀움이 μžˆλ‹€. AOPλ₯Ό 톡해 λ‘œμ§μ„ Core Concern (핡심 κΈ°λŠ₯)κ³Ό Cross-cutting Concerns (λΆ€κ°€ κΈ°λŠ₯)으둜 λΆ„λ¦¬ν•˜μ—¬ μ½”λ“œμ˜ μž¬μ‚¬μš©μ„±κ³Ό μœ μ—°μ„±μ„ 높인닀.

πŸ“Œ μš©μ–΄

  • Join Point

쑰인 ν¬μΈνŠΈλŠ” AOPλ₯Ό μ μš©ν•  수 μžˆλŠ” 지점이닀. λ©”μ„œλ“œ μ‹€ν–‰, μƒμ„±μž 호좜, ν•„λ“œ κ°’ μ ‘κ·Ό λ“±μ˜ 지점이 될 수 μžˆλ‹€. Spring AOP λŠ” ν”„λ‘μ‹œ 방식을 μ‚¬μš©ν•˜λ―€λ‘œ 쑰인 ν¬μΈνŠΈλŠ” 항상 λ©”μ„œλ“œ μ‹€ν–‰ μ‹œμ μœΌλ‘œ μ œν•œλœλ‹€. ν”„λ‘μ‹œ νŠΉμ„± 상 λ©”μ„œλ“œ ν˜ΈμΆœμ„ κ°€λ‘œμ±Œ μˆ˜λŠ” μžˆμ§€λ§Œ μƒμ„±μž ν˜ΈμΆœμ΄λ‚˜ ν•„λ“œ κ°’ 변경을 κ°€λ‘œμ±Œ μˆ˜λŠ” μ—†κΈ° λ•Œλ¬Έμ΄λ‹€.

  • Advice

νŠΉμ • 쑰인 ν¬μΈνŠΈμ—μ„œ μ‹€ν–‰λ˜λŠ” μ½”λ“œλ‘œ μ‹€μ œ λΆ€κ°€ κΈ°λŠ₯을 담은 κ΅¬ν˜„μ²΄μ΄λ‹€. μ–Έμ œ, μ–΄λ–€ μž‘μ—…μ„ μˆ˜ν–‰ν• μ§€ κ²°μ •ν•œλ‹€. μ–΄λ“œλ°”μ΄μŠ€λŠ” μ—¬λŸ¬ μ’…λ₯˜κ°€ μžˆλŠ”λ°, Before 은 λ©”μ„œλ“œ μ‹€ν–‰ μ „, After λŠ” λ©”μ„œλ“œ μ‹€ν–‰ ν›„ λ™μž‘ν•œλ‹€. After-returning 은 λ©”μ„œλ“œκ°€ 정상 μ‹€ν–‰ ν›„, After-throwing 은 μ˜ˆμ™Έκ°€ λ°œμƒν•œ ν›„ λ™μž‘ν•œλ‹€. Around λͺ¨λ“  μ‹œμ μ—μ„œ λ™μž‘ν•œλ‹€.

  • Target

νƒ€κ²Ÿμ€ λΆ€κ°€ κΈ°λŠ₯을 λΆ€μ—¬ν•  λŒ€μƒμ΄λ‹€. 즉, μ–΄λ“œλ°”μ΄μŠ€λ₯Ό λ°›λŠ” 객체둜, 포인트컷으둜 μ–΄λŠ νƒ€κ²Ÿμ— λ“€μ–΄κ°ˆμ§€ κ²°μ •λœλ‹€.

  • Pointcut

ν¬μΈνŠΈμ»·μ€ μ–΄λ“œλ°”μ΄μŠ€λ₯Ό μ μš©ν•  νƒ€κ²Ÿμ˜ λ©”μ„œλ“œλ₯Ό κ²°μ •ν•˜λŠ” 방법이닀.

  • Aspect

μ• μŠ€νŽ™νŠΈλŠ” AOP의 κΈ°λ³Έ λͺ¨λ“ˆλ‘œ, μ–΄λ“œλ°”μ΄μŠ€μ™€ ν¬μΈνŠΈμ»·μ„ ν•©μΉœ κ°œλ…μ΄λ‹€.

  • Weaving

μœ„λΉ™μ€ ν¬μΈνŠΈμ»·μ— μ˜ν•΄ κ²°μ •λœ νƒ€κ²Ÿμ˜ 쑰인 ν¬μΈνŠΈμ— μ–΄λ“œλ°”μ΄μŠ€λ₯Ό μ‚½μž…ν•˜λŠ” 과정이닀. μœ„λΉ™μ„ 톡해 νƒ€κ²Ÿμ˜ μ½”λ“œμ— 영ν–₯을 μ£Όμ§€ μ•ŠμœΌλ©΄μ„œ μ–΄λ“œλ°”μ΄μŠ€λ₯Ό μΆ”κ°€ν•  수 μžˆλ‹€. μœ„λΉ™ μ‹œμ μ— 따라 컴파일 νƒ€μž„ μœ„λΉ™, λ‘œλ“œ νƒ€μž„ μœ„λΉ™, λŸ°νƒ€μž„ μœ„λΉ™μ΄ μ‘΄μž¬ν•œλ‹€.

  • Advisor

μ–΄λ“œλ°”μ΄μ €λŠ” ν•˜λ‚˜μ˜ μ–΄λ“œλ°”μ΄μŠ€μ™€ ν•˜λ‚˜μ˜ 포인트컷으둜 κ΅¬μ„±λ˜λ©° μŠ€ν”„λ§ AOPμ—μ„œλ§Œ μ‚¬μš©λ˜λŠ” μš©μ–΄μ΄λ‹€.

  • AOP Proxy

AOP ν”„λ‘μ‹œλŠ” AOPλ₯Ό κ΅¬ν˜„ν•˜κΈ° μœ„ν•œ ν”„λ‘μ‹œ 객체둜 μŠ€ν”„λ§ AOPμ—μ„œλŠ” JDK ν”„λ‘μ‹œ λ˜λŠ” CGLIB ν”„λ‘μ‹œλ₯Ό μ‚¬μš©ν•œλ‹€. JDK ν”„λ‘μ‹œλŠ” μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•œ ν΄λž˜μŠ€μ—, CGLIB ν”„λ‘μ‹œλŠ” 일반 ν΄λž˜μŠ€μ— μ μš©λœλ‹€.

πŸ“Œ Spring AOP κ΅¬ν˜„ 방법

μ–΄λ…Έν…Œμ΄μ…˜μ„ 톡해 AOPλ₯Ό κ΅¬ν˜„ν•΄λ³΄μž.

1
implementation 'org.springframework.boot:spring-boot-starter-aop'

Spring AOP μ˜μ‘΄μ„±μ„ μΆ”κ°€ν•œλ‹€.

1
2
3
4
5
@Configuration
@EnableAspectJAutoProxy
public class AppConfig {
    // ...
}

AOPλ₯Ό ν™œμ„±ν™”ν•˜κΈ° μœ„ν•΄ @EnableAspectJAutoProxy λ₯Ό μΆ”κ°€ν•œλ‹€.

1
2
3
4
5
6
7
8
9
10
11
12
13
@Aspect
@Component
public class LoggingAspect {
    
    @Pointcut("execution(* com.example.service.*.*(..))")
    private void serviceLayer() {}
    
    @Before("serviceLayer()")
    public void beforeAdvice(JoinPoint joinPoint) {
        // ...
    }
}

@Aspect μ–΄λ…Έν…Œμ΄μ…˜μ„ 톡해 Aspectλ₯Ό μ •μ˜ν•œλ‹€. 포인터컷은 @Pointcut μ–΄λ…Έν…Œμ΄μ…˜μœΌλ‘œ μ •μ˜ν•˜λ©°, μ–΄λ“œλ°”μ΄μŠ€λŠ” μœ ν˜•μ— λ”°λ₯Έ μ–΄λ…Έν…Œμ΄μ…˜μœΌλ‘œ μ •μ˜ν•œλ‹€.

πŸ“Œ μ°Έκ³ 

https://dev-coco.tistory.com/81

https://engkimbs.tistory.com/entry/%EC%8A%A4%ED%94%84%EB%A7%81AOP

https://sharonprogress.tistory.com/195

This post is licensed under CC BY 4.0 by the author.