본문 바로가기
Spring/Spring

[inflearn / spring 입문(완강)] AOP 개념

by SIXXXX_ 2022. 2. 24.
728x90

상황

만약에 모든 메소드의 호출시간을 측정하고 싶다는 요청이 온다면?

 

 

MemberController 클래스에 가서 

System.currentTimeMillis();

try~finally를 통해 시간을 재준다.

이는 굉장히 비효율, 유지보수가 어렵기 때문에!

 

이런 공통의 기능들(ex. 메소드 호출시간재기)을

공통관심사항(cross-cutting concern)

이라 한다.

그리고 기존의 findMember()의 return memberRepository.findAll();이라던지 그런 주요 코드들을

핵심관심사항(core concern)

이라 한다.

 

또다른 예시로  회원가입 시간, 회원조회 시간을 측정하고 싶다면

어떻게 할건가?

 

문제

  • 회원가입, 회원 조회에 시간을 측정하는 기능은 핵심 관심 사항이 아니다.
  • 시간을 측정하는 로직은 공통 관심 사항이다.
  • 시간을 측정하는 로직과 핵심 비즈니스의 로직이 섞여서 유지보수가 어렵다.
  • 시간을 측정하는 로직을 별도의 공통 로직으로 만들기 매우 어렵다.
  • 시간을 측정하는 로직을 변경할 때 모든 로직을 찾아가면서 변경해야 한다.

 

이러한 문제점들로 AOP를 써서 핵심 로직과 분리해서 유지보수가 쉽게 만든다.

 

AOP(Aspect Oriented Programming)

우리가 원하는 공통관심사항을 원하는 곳에 적용시키기 위한 방법 aop

 

cross-cutting concern(공통 관심 사항)과 core concern(핵심 관심 사항)을 분리한다.

공통관심사항과 핵심관심사항을 각각 모듈화 한다고도 말한다.

 

 

 

새로운 TimeTraceAop라는 클래스 생성(공통 관심 사항 분리)

로직 작성 후 @Aspect 어노테이션을 달아준다. : AOP사용

그리고 @Component 어노테이션은 스프링 컨테이너에 등록,

component 하는 두가지 방법이 있는데

 

1. 공통관심사항 클래스에 달기(위의 코드)

2. Config클래스에 달기(밑의 코드)

config class에 처리

 

이후

aop를 어디에 적용시킬 것인지를 등록하면 된다. :@Around

@Around 어노테이션 ("execution(범위지정)")

 

AOP적용 : @Around("execution(*프로젝트명.프로젝트..*(전체)(..))")

 

AOP 적용 후

해결

 

  • 회원가입, 회원 조회등 핵심 관심사항과 시간을 측정하는 공통 관심 사항을 분리한다.
  • 시간을 측정하는 로직을 별도의 공통 로직으로 만들었다.
  • 핵심 관심 사항을 깔끔하게 유지할 수 있다.
  • 변경이 필요하면 이 로직만 변경하면 된다.
  • 원하는 적용 대상을 선택할 수 있다.

 

Proxy 기반 AOP

 

AOP 적용 후의 의존관계를 살펴보면

 

첫번째 memberService에서 joinPoint.proceed()시 Proxy

 

전체 Proxy

 

Proxy기반 AOP 구현 : 가짜 클래스를 하나 더 만든다고 생각하면 된다.

 

 

 

 

AOP 용어

 

1. Target

  •  부가기능을 부여할 대상 (핵심기능을 담고 있는 모듈)

 

2. Aspect

  • 부가기능 모듈을 Aspect라고 부른다. (핵심기능에 부가되어 의미를 갖는 모듈)
  • 부가될 기능을 정의한 Advice와 Advice를 어디에 적용할지를 결정하는 PointCut을 함께 갖고 있다.
  • 어플리케이션의 핵심적인 기능에서, 부가적인 기능을 분리해서 Aspect라는 모듈로 만들어서 설계하고 개발하는 방법

 

3. Advice 

  • 실질적으로 부가기능을 담은 구현체
  • 타겟 오브젝트에 종속되지 않기 때문에, 부가기능에만 집중할 수 있음
  • Aspect가 무엇을 언제 할지를 정의

 

4. PointCut

  • 부가기능이 적용될 대상(Method)을 선정하는 방법
  • Advice를 적용할 JoinPoint를 선별하는 기능을 정의한 모듈

 

5. JoinPoint

  •  Advice가 적용될 수 있는 위치
  •  Spring에서는 메소드 조인포인트만 제공한다.
  •  타겟 객체가 구현한 모든 메소드는 조인 포인트가 된다.

 

6. Proxy

  • Target을 감싸서 Target의 요청을 대신 받아주는 랩핑 오브젝트.
  • 클라이언트에서 Target을 호출하게되면, 타겟이 아닌 타겟을 감싸고 있는 Proxy가 호출되어, 타겟메소드 실행 전에 선처리, 후처리를 실행한다.

 

 

 

 

 

 

 

inflearn 김영한님의 spring 입문 완강,

느낀점

 

더보기
더보기

proxy와 bean(component)에 대한 개념이 부족, 빈약하다. 조금 더 공부하길 

그리고 이것을 끝으로 스프링 입문 강의는 끝났다.

완강을 했다니 매우매우 뿌듯했다.

맛보기 강의로도 깨우친게 많다..열심히 하자..

스프링 공부를 조금 더 깊이하기 앞서 자바공부를 더 열심히 해야겠다는 생각이 들었다.

앞으로는 자바쪽에 초점을 맞춰서 공부할 예정+물론 스프링 공부도 할 예정!

바쁘다 바빠!

 

 

REFERENCE