πŸ“• Backend

Spring μž…λ¬Έ / 7. AOP

Dongwoongkim 2023. 1. 19. 18:46

1. AOPκ°€ ν•„μš”ν•œ 상황

EX) λͺ¨λ“  λ©”μ†Œλ“œμ˜ 호좜 μ‹œκ°„μ„ μΈ‘μ •ν•˜κ³  싢을 λ•Œ

package hello.hellospring.service;
 @Transactional
  public class MemberService {
    /**
* νšŒμ›κ°€μž…
*/
    public Long join(Member member) {
        long start = System.currentTimeMillis();
try {
validateDuplicateMember(member); //쀑볡 νšŒμ› 검증
            memberRepository.save(member);
            return member.getId();
        } finally {
            long finish = System.currentTimeMillis();
            long timeMs = finish - start;
            System.out.println("join " + timeMs + "ms");
} }
/**
*전체 νšŒμ› 쑰회
*/
    public List<Member> findMembers() {
        long start = System.currentTimeMillis();
        try {
            return memberRepository.findAll();
        } finally {
            long finish = System.currentTimeMillis();
            long timeMs = finish - start;
            System.out.println("findMembers " + timeMs + "ms");
} }
}

문제

  • νšŒμ›κ°€μž…, νšŒμ› μ‘°νšŒμ— μ‹œκ°„μ„ μΈ‘μ •ν•˜λŠ” κΈ°λŠ₯은 핡심 관심 사항이 μ•„λ‹ˆλ‹€.
  • μ‹œκ°„μ„ μΈ‘μ •ν•˜λŠ” λ‘œμ§μ€ 곡톡 관심 사항이닀.
  • μ‹œκ°„μ„ μΈ‘μ •ν•˜λŠ” 둜직과 핡심 λΉ„μ¦ˆλ‹ˆμŠ€μ˜ 둜직이 μ„žμ—¬μ„œ μœ μ§€λ³΄μˆ˜κ°€ μ–΄λ ΅λ‹€.
  • μ‹œκ°„μ„ μΈ‘μ •ν•˜λŠ” λ‘œμ§μ„ λ³„λ„μ˜ 곡톡 둜직으둜 λ§Œλ“€κΈ° 맀우 μ–΄λ ΅λ‹€.
  • μ‹œκ°„μ„ μΈ‘μ •ν•˜λŠ” λ‘œμ§μ„ λ³€κ²½ν•  λ•Œ λͺ¨λ“  λ‘œμ§μ„ μ°Ύμ•„κ°€λ©΄μ„œ λ³€κ²½ν•΄μ•Ό ν•œλ‹€.

 

2. AOP 적용

AOP: Aspect Oriented Programming

관점 μ§€ν–₯ ν”„λ‘œκ·Έλž˜λ°.

곡톡 관심 사항 vs 핡심 관심 사항 뢄리

 

 

 

package kdo6301.spring0.aop;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;

@Aspect
@Component
public class TimeTraceAop {

    // 적용 λ²”μœ„
    @Around("execution(* kdo6301.spring0..*(..))")
    public Object execute(ProceedingJoinPoint joinPoint) throws Throwable
    {
        long start = System.currentTimeMillis();
        System.out.println("START : " + joinPoint.toString());
        try
        {
            return joinPoint.proceed();
        } finally {
            long finish = System.currentTimeMillis();
            long timeMs = finish-start;
            System.out.println("END : " + joinPoint.toString() + " " + timeMs);
        }
    }
}

@Around μ–΄λ…Έν…Œμ΄μ…˜μ„ 톡해 μ μš©λ²”μœ„λ₯Ό μ„€μ •ν•  수 μžˆλ‹€.