ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ

๐Ÿ’กAOP

๐Ÿ’ปAOP๊ฐ€ ํ•„์š”ํ•œ ์ƒํ™ฉ

    public Long join(Member member) {
        //๊ฐ™์€ ์ด๋ฆ„์ด ์žˆ๋Š” ์ค‘๋ณต ํšŒ์›X
//        Optional<Member> result = memberRepository.findByName(member.getName());
//        result.ifPresent(m -> {
//            throw new IllegalStateException("์ด๋ฏธ ์กด์žฌํ•˜๋Š” ํšŒ์›์ž…๋‹ˆ๋‹ค.");
//        });

        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);
        }
    }

ํšŒ์›๊ฐ€์ž…์„ ํ•˜๋Š” ๋ฐ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„์„ ์ถœ๋ ฅํ•ด์ฃผ๋Š” ์ฝ”๋“œ๋ฅผ ์œ„์™€๊ฐ™์ด ์ž‘์„ฑํ•˜๊ณ ,

Test ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ๋ช‡ ms๊ฐ€ ๊ฑธ๋ฆฌ๋Š”์ง€ ์†Œ์š”์‹œ๊ฐ„์ด ๋‚˜์˜จ๋‹ค.

 

๐Ÿ’ป์‹œ๊ฐ„ ์ธก์ • ๋ฌธ์ œ์ 

 

๐Ÿ’กAOP ์ ์šฉ

AOP: Aspect Oriented Programming

๊ณตํ†ต ๊ด€์‹ฌ ์‚ฌํ•ญ๊ณผ ํ•ต์‹ฌ ๊ด€์‹ฌ ์‚ฌํ•ญ์„ ๋ถ„๋ฆฌํ•œ๋‹ค. 

package hello.hellospring.aop;

import org.aopalliance.intercept.Joinpoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;

@Aspect
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");
        }
    }
}

 

aop๋ผ๋Š” ํŒจํ‚ค์ง€๋ฅผ ๋งŒ๋“ค๊ณ , ๊ทธ ์•ˆ์— TimeTraceAop class๋ฅผ ๋งŒ๋“ค์–ด ์œ„์™€ ๊ฐ™์€ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด์ฃผ์—ˆ๋‹ค.

@Bean
public TimeTraceAop timeTraceAop(){
    return new TimeTraceAop();
}

 

aop๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด spring bean์œผ๋กœ ๋“ฑ๋กํ•ด์ฃผ์—ˆ๋‹ค.

 

๐Ÿ’ป์‹œ๊ฐ„ ์ธก์ • AOP ์‹คํ–‰

์‹คํ–‰ํ•˜๋ฉด ์œ„์™€ ๊ฐ™์ด ๋ฉ”์„œ๋“œ๋งˆ๋‹ค ์‹คํ–‰ ์‹œ๊ฐ„์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

 

 

๐Ÿ’ป AOP ๋™์ž‘ ๋ฐฉ์‹ ์„ค๋ช…

AOP๋ฅผ ์ ์šฉํ•˜๋ฉด ๊ฐ€์งœ memberService ํ”„๋ก์‹œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์ด๋ฅผ ์Šคํ”„๋ง ๋นˆ์œผ๋กœ ๋“ฑ๋กํ•œ๋‹ค. ๊ฐ€์งœ memberService ํ”„๋ก์‹œ๋Š” ์‹ค์ œ memberService์˜ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ์„ ๊ฐ€๋กœ์ฑ„์–ด ์ถ”๊ฐ€ ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•œ ๋’ค, joinPoint.proceed()๋ฅผ ํ†ตํ•ด ์›๋ณธ memberService ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค. ์ด๋กœ ์ธํ•ด memberController๊ฐ€ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์€ ์‹ค์ œ memberService๊ฐ€ ์•„๋‹Œ ๊ฐ€์งœ memberService์ด๋ฉฐ, AOP๋ฅผ ํ†ตํ•ด ์ถ”๊ฐ€์ ์ธ ๋™์ž‘์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.