πŸ“š CS [ComputerScience]/πŸ“š CS λ©΄μ ‘

πŸ“š [CSλ©΄μ ‘] μ›Ή λ©΄μ ‘ 질문 [5] [Spring AOP]

Dbswnstjd 2024. 2. 1. 17:16

1.  Spring AOP λž€?

AOPλŠ” Aspect Oriented Programming 의 μ•½μžλ‘œ 관점 지ν–₯ ν”„λ‘œκ·Έλž˜λ°μœΌλ‘œ λΆˆλ¦°λ‹€. 관점 지ν–₯은 μ‰½κ²Œ λ§ν•΄μ„œ μ–΄λ–€ λ‘œμ§μ„ κΈ°μ€€μœΌλ‘œ 핡심적인 관점, 뢀가적인 κ΄€μ μœΌλ‘œ λ‚˜λˆ„μ–΄μ„œ 보고 κ·Έ 관점을 κΈ°μ€€μœΌλ‘œ 각각 λͺ¨λ“ˆν™”ν•˜κ² λ‹€λŠ” 것이닀. 

AOP

μ˜ˆλ‘œλ“€μ–΄ 핡심적인 관점은 κ²°κ΅­ μš°λ¦¬κ°€ μ μš©ν•˜κ³ μž ν•˜λŠ” 핡심 λΉ„μ¦ˆλ‹ˆμŠ€ 둜직이 λœλ‹€. λ˜ν•œ 뢀가적인 관점은 핡심 λ‘œμ§μ„ μ‹€ν–‰ν•˜κΈ° μœ„ν•΄μ„œ ν–‰ν•΄μ§€λŠ” λ°μ΄ν„°λ² μ΄μŠ€ μ—°κ²°, λ‘œκΉ…, 파일 μž…μΆœλ ₯ 등을 예둜 λ“€ 수 μžˆλ‹€.

 

AOPμ—μ„œ 각 관점을 κΈ°μ€€μœΌλ‘œ λ‘œμ§μ„ λͺ¨λ“ˆν™”ν•œλ‹€λŠ” 것은 μ½”λ“œλ“€μ„ λΆ€λΆ„μ μœΌλ‘œ λ‚˜λˆ„μ–΄μ„œ λͺ¨λ“ˆν™”ν•˜κ² λ‹€λŠ” μ˜λ―Έλ‹€. μ΄λ•Œ, μ†ŒμŠ€ μ½”λ“œμƒμ—μ„œ λ‹€λ₯Έ 뢀뢄에 계속 λ°˜λ³΅ν•΄μ„œ μ“°λŠ” μ½”λ“œλ“€μ„ λ°œκ²¬ν•  수 μžˆλŠ” 데 이것을 흩어진 관심사 (Crosscutting Concerns)라 λΆ€λ₯Έλ‹€. 

 

2.  AOP μ£Όμš” κ°œλ…

  • Aspect : μœ„μ—μ„œ μ„€λͺ…ν•œ 흩어진 관심사λ₯Ό λͺ¨λ“ˆν™” ν•œ 것. 주둜 λΆ€κ°€κΈ°λŠ₯을 λͺ¨λ“ˆν™”
  • Target : Aspectλ₯Ό μ μš©ν•˜λŠ” κ³³ (클래슀, λ©”μ„œλ“œ ..)
  • Advice : μ‹€μ§ˆμ μœΌλ‘œ μ–΄λ–€ 일을 ν•΄μ•Όν•  지에 λŒ€ν•œ 것, μ‹€μ§ˆμ μΈ λΆ€κ°€κΈ°λŠ₯을 담은 κ΅¬ν˜„μ²΄
  • JoinPoint : Adviceκ°€ 적용될 μœ„μΉ˜, 끼어듀 수 μžˆλŠ” 지점. λ©”μ„œλ“œ μ§„μž… 지점, μƒμ„±μž 호좜 μ‹œμ , ν•„λ“œμ—μ„œ 값을 κΊΌλ‚΄μ˜¬ λ•Œ λ“± λ‹€μ–‘ν•œ μ‹œμ μ— μ μš©κ°€λŠ₯
  • PointCut : JoinPoint의 μƒμ„Έν•œ μŠ€νŽ™μ„ μ •μ˜ν•œ 것. 'Aλž€ λ©”μ„œλ“œμ˜ μ§„μž… μ‹œμ μ— ν˜ΈμΆœν•  것'κ³Ό 같이 λ”μš± ꡬ체적으둜 Adviceκ°€ 싀행될 지점을 μ •ν•  수 있음

3.  Spring  AOP νŠΉμ§•

  • ν”„λ‘μ‹œ νŒ¨ν„΄ 기반의 AOP κ΅¬ν˜„μ²΄, ν”„λ‘μ‹œ 객체λ₯Ό μ“°λŠ” μ΄μœ λŠ” μ ‘κ·Ό μ œμ–΄ 및 λΆ€κ°€κΈ°λŠ₯을 μΆ”κ°€ν•˜κΈ° μœ„ν•΄
  • μŠ€ν”„λ§ λΉˆμ—λ§Œ AOP 적용 κ°€λŠ₯
  • λͺ¨λ“  AOP κΈ°λŠ₯을 μ œκ³΅ν•˜λŠ” 것이 μ•„λ‹Œ μŠ€ν”„λ§ IoC와 μ—°λ™ν•˜μ—¬ μ—”ν„°ν”„λΌμ΄μ¦ˆ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ κ°€μž₯ ν”ν•œ 문제(μ€‘λ³΅μ½”λ“œ, ν”„λ‘μ‹œ 클래슀 μž‘μ„±μ˜ λ²ˆκ±°λ‘œμ›€, 객체듀 κ°„ 관계 λ³΅μž‘λ„ 증가 ..)에 λŒ€ν•œ 해결책을 μ§€μ›ν•˜λŠ” 것이 λͺ©μ 

3.  Spring AOP 적용

μŠ€ν”„λ§ AOPλ₯Ό μ‚¬μš©ν•˜κΈ° μœ„ν•΄ μ•„λž˜μ™€ 같은 μ˜μ‘΄μ„±μ„ μΆ”κ°€ν•΄μ•Ό ν•œλ‹€.

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
</dependency>

 

@Component
@Aspect
class PerfAspect {
    @Around("execution(* com.aop..*.EventService.*(..))")
    public Object logPerf(ProceedingJoinPoint pjp) throws Throwable{
    	long begin = System.currentTimeMillis(); 
        Object retVal = pjp.proceed(); // λ©”μ„œλ“œ 호좜 자체λ₯Ό 감쌈 
        System.out.println(System.currentTimeMillis() - begin); 
        return retVal;
    }
}