πŸ–₯️ Web Development Study/Back-End

[Back-end] μŠ€ν”„λ§ μž…λ¬Έ :: AOP

ibelieveinme 2025. 1. 29. 23:05
728x90

*AOP(Aspect Oriented Programming)

: 곡톡 관심 사항(cross-cutting concern)κ³Ό 핡심 관심 사항(core concern)을 λΆ„λ¦¬ν•˜λŠ” 것.

 

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

νšŒμ› κ°€μž… μ‹œκ°„, νšŒμ› 쑰회 μ‹œκ°„μ„ μΈ‘μ •ν•˜κ³  싢을 λ•Œ


1. νšŒμ› κ°€μž…, νšŒμ› 쑰회 μ‹œκ°„ μΈ‘μ •ν•˜κΈ°(일일이)

import com.yoonsung.firstproject.domain.Member;
import com.yoonsung.firstproject.repository.MemberRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Optional;

@Service
public class MemberService {

    private final MemberRepository memberRepository;

    @Autowired
    public MemberService(MemberRepository memberRepository){
        this.memberRepository = memberRepository;
    }

    // νšŒμ›κ°€μž…
    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.print("join Time: " + 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.print("findId Time: " + timeMs + "ms");
        }
    }

   ...
}

ν•¨μˆ˜ ν•˜λ‚˜ν•˜λ‚˜μ— try finally 문으둜 μ‹œκ°„ μΈ‘μ •ν•˜κΈ°.

ν•΅μ‹¬μ½”λ“œμ™€ 곡톡 μ½”λ“œκ°€ μ„žμ΄κ³  쀑볡 μ½”λ“œκ°€ 많이 λ°œμƒν•œλ‹€.

 

 

2. κ°œμ„ :: 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(* hello.hellospring..*(..))")
    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 + "ms");
        }
    }
}

λ©”μ†Œλ“œ ν˜ΈμΆœν•  λ•Œλ§ˆλ‹€ jointPoint κ°€ intercept ν•΄μ„œ ν˜ΈμΆœλœλ‹€.

Spring bean 에 λ“±λ‘ν•΄μ£Όκ±°λ‚˜ Component μŠ€μΊ”μœΌλ‘œ λ§Œλ“€κΈ°. Spring bean이 더 κ°€μ‹œμ μΈ ν‘œν˜„μ΄λΌ μ„ ν˜Έλœλ‹€.

 

 

 

728x90