인프런/스프링 입문

끝) AOP

backend dev 2022. 11. 30.

AOP(Aspect Oriented Programming)

 

관점 지향 프로그래밍 

개념,예시

https://engkimbs.tistory.com/746

 

[Spring] 스프링 AOP (Spring AOP) 총정리 : 개념, 프록시 기반 AOP, @AOP

| 스프링 AOP ( Aspect Oriented Programming ) AOP는 Aspect Oriented Programming의 약자로 관점 지향 프로그래밍이라고 불린다. 관점 지향은 쉽게 말해 어떤 로직을 기준으로 핵심적인 관점, 부가적인 관점으로

engkimbs.tistory.com

메소드의 호출시간을 측정하고 싶다면?

 

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

    }
}

대부분 System.currentTimeMillis()를 이용하여 걸리는 시간을 측정할 것이다.

이렇게 일일이 모든 메소드에 시간측정코드를 넣기는 힘들것이다.(메소드화 하기도 힘들어서)

여기서 시간측정하는 부분은 핵심비지니스 로직이 아니며 (시간 측정 로직은 공통 관심사항이다.)

try안에 들어있는 코드들이 핵심 비지니스 로직이 될것이다.(=핵심관심사항)

이렇게 하나하나 다 시간 측정로직을 붙이는 노가다가 될것이다.
모든 메소드에 시간측정로직을 추가하려고할때 생기는 문제점들

 

 

 

AOP적용

하지만 AOP를 적용한다면?

원하는곳에 적용가능

TimeTraceAop.java

@Aspect //AOP는 해당 어노테이션을 붙여줘야한다.
@Component //이렇게해서 해당 클래스를 스프링 빈 등록할수있다.(컴포넌트 어노테이션을 쓰면 컴포넌트스캔에 걸리게되서 스프링빈등록됨)
// 또는 SpringConfig에 빈등록해서 사용가능.
public class TimeTraceAop {
    @Around("execution(* hello.hellospring..*(..))") //어디다가 적용할것인지를 적는곳,해당 예시는 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");
        }
    }
}

이렇게 작성후 서버를 켜서 회원목록을 클릭해보면

어디서 어떤 메소드를 실행했는지, 끝났을때 시간은 얼마걸렸는지 다 뜨게된다.

나중에 돌아가는방식을 수정하고싶다면 Proceedingjoinpoint 관련 공부를 진행하면된다

 

맨처음 작성한 시간측정 로직을 모든 메소드에 추가하지않아도 되므로 

핵심 관심 사항의 코드를 깔끔하게 유지할 수 있다.

 

스프링의 AOP 동작 방식

AOP 적용 전 의존관계

멤버 컨트롤러가 멤버 서비스를 의존하고 있고

멤버컨트롤러가 메소드를 호출하면 멤버서비스에서 메소드 호출함.

의존성주입으로 의존관계형성, 멤버컨트롤러의 create에서 멤버서비스의 join을 호출

AOP 적용 후 의존관계

가정) 멤버서비스가 AOP에 적용 대상에 포함된다.

 

그렇다면 스프링은 가짜 멤버서비스를 만든다. (프록시라는)

스프링빈을 등록할때 가짜 멤버서비스(스프링빈)을 세워놓고  joinPoint.proceed()를 실행시 그때 진짜 스프링빈(실제 멤버서비스)를 호출 해준다.  (가짜 멤버서비스는 실제 멤버서비스를 의존하는 관계)

멤버컨트롤러가 호출하는것은 프록시 기술로 인한 가짜 멤버서비스이다.

프록시라는 기술은 다른 강좌에서 한다.

 

진짜 가짜멤버서비스가 스프링빈에 등록되는건지 확인해보자

컨트롤러가 올라갈떄 스프링빈에 등록된 멤버서비스를 주입할텐데 어떤게 들어가는지 체크해보자

멤버 서비스라고 깔끔하게 끝나는게 아니라 Enhance~~와 같은 문자들이 더 붙어있다. (가짜 멤버서비스라는뜻)

 

 AOP 적용 전 전체그림

AOP 적용 후 전체 그림

가짜는 실제를 의존하고 ( 화살표)

의존성 주입할떄 필요한 스프링빈은 가짜를 의존하게 되고  joinPoint.proceed()를 실행시 그때 진짜 스프링빈(실제 멤버서비스)를 호출 해준다.

[프록시 방식의 AOP]

 

 

의존성주입이 가능하므로 이런기술이 가능하다.

 

이번 강좌에서 배운 부분

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%EC%9E%85%EB%AC%B8-%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8/dashboard

 

[무료] 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술 - 인프런 | 강의

스프링 입문자가 예제를 만들어가면서 스프링 웹 애플리케이션 개발 전반을 빠르게 학습할 수 있습니다., - 강의 소개 | 인프런...

www.inflearn.com

 

댓글