[자바와 객체 지향 그리고 스프링] 07. AOP: 관점지향 프로그램(2)

코린이서현이·2024년 1월 28일
0

😗 들어가면서

AOP를 더 자세히 알아보자.
또한 AOP를 잘 이해하기 위해서 AOP에서 사용하는 용어에 대해서 알아보자.

📌 AOP의 용어로 이해하는 AOP

용어역할
Aspect관점, 측면, 양상PointcutAdvice의 집합 - 어디에,언제,무엇을?
Advice조언, 충고언제,무엇을?
JoinPoint결합점연결 가능한 지점
Pointcut자르는 점Aspect 적용 위치 지정자
WeavingAdvice를 핵심 로직 코드에 적용하는 것을 말한다.

Pointcut - 어디에

PointcutJoinpoint중 실제 Advice가 적용되는 위치를 나타낸다.
스프링에서는 정규 표현식이나 AspectJ의 문법을 이용해서 정의할 수 있다.

표현방법

{접근제한자패턴} 리턴타입 {패키지.클래스} 메서드이름(파라미터) {throws 예외패턴} 
//{}은 생략가능하다. 

예시 - execution은 포인트컷 지시자이다.

  @Before("execution(public void aop002.Boy.runSomething ())")
  @Before("execution(* runSomething ())")   
  	//접근제한자 상관없이, 리턴타입 상관없이, 모든패키지. 모든 클래스의
  	//에러상관없이 이름이 runSomeThing이라면 Pointcut으로 지정해라

JoinPoint

Advice를 적용할 수 있는 지점을 말한다. 다른 AOP에서는 메서드 호출, 필드 값 변경에도 적용할 수 있으나 스프링 AOP에서는 빈의 메서드 호출에 대해서만 지원한다. (스프링은 프록시를 이용해서 AOP를 구현하기 때문이다.

JoinPoint 파라미터를 이용하면 실행 시점에 실제 호출된 메서드, 메서드의 객체, 파라미터를 확인할 수 있다.

...
  public void before(JoinPoint joinPoint){
    System.out.println(joinPoint);
	System.out.println("얼굴 인식 확인: 문 개방");
...
execution(void aop002.Person.runSomething())
얼굴 인식 확인: 문 개방
컴퓨터로 게임을 한다.
execution(void aop002.Person.runSomething())
얼굴 인식 확인: 문 개방
요리한다.

Advice - 언제, 무엇을

언제 횡단관심사를 핵심 관심사를 적용할지를 정의한다.
즉. Pointcut언제, 무엇을 적용할지 정의한 메서드이다.

Advise의 종류

종류설명
Before Advice대상 객체의 메서드 호출 전에 공통 기능을 실행한다.
After Returning Advice대상 객체의 메서드가 예외 없이 실행된 이후에 공통 기능을 실행한다.
After Throwing Advice대상 객체의 메서드를 실행하는 도중 익셉션이 발생한 경우에 공통 기능을 실행한다.
After Advice익셉션 발생 여뷰에 상관없이 대상 객체의 메서드 실행 후 공통 기능을 실행한다.
Around Advice대상 객체의 메서드 실행 전, 후, 또는 익셉션 발생시점에 공통 기능을 실행하는데 사용된다.

🔍 가장 자주 사용되는 Around Advice?
대상 객체의 메서드 실행에 대해서 다양한 시점에 사용할 수 있기 때문이다.
캐시 기능이나 성늘 모니터링 기능을 공통기능으로 사용할 수 있다.

예시

public class MyAspect {
  @Before("~~~")   //실행 전에 before 메서드를 실행하겠다.
  public void before(JoinPoint joinPoint){
 ...

위에서는 PointCut이 시작되기 전에 before메서드를 실행하라고 되어 있다.

Aspect

여러개의 Advice와 여러개의 Pointcut의 결합을 의미한다. 즉 언제+무엇을+어디에를 뜻한다.

예사

@Aspect   //이 클래스를 이제 AOP에서 사용하겠다는 의미이다.
public class MyAspect {
  @Before("execution(* runSomething ())")   //대상 메서드 실행전에 이 메서드를 실행하겠다.
  public void before(JoinPoint joinPoint){

runSomething () 실행 전에, before() 를 실행한다.

트랜잭션이나 보안등이 Aspect의 좋은 예이다.

Advisor..?

스프링 AOP에서만 사용되며 한 개의 Advise와 한개의 Pointcut으로만 구성되어있다.
그러나 스프링이 발전되고 Aspect가 나오면서 더이상 사용되지 않는다.

Weaving

Advice를 핵심 로직 코드에 적용하는 것을 말한다.

📌 추가 코드 완성

After Advice - 어노테이션 기반으로

MyAspect 만 수정하면된다.

package aop005;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;

@Aspect   //이 클래스를 이제 AOP에서 사용하겠다는 의미이다.
public class MyAspect {
  @Before("execution(* runSomething ())")   //대상 메서드 실행전에 이 메서드를 실행하겠다.
  public void before(JoinPoint joinPoint){
    System.out.println("얼굴 인식 확인: 문 개방");
  }
  @After("execution(* runSomething ())")
  public void after(JoinPoint joinPoint) {
    System.out.println("외출 : 문잠금");
  }
}

실행코드

얼굴 인식 확인: 문 개방
컴퓨터로 게임을 한다.
외출 : 문잠금
얼굴 인식 확인: 문 개방
요리한다.
외출 : 문잠금

한번더 리팩토링하기 - 중복없애기

package aop005;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;

@Aspect   //이 클래스를 이제 AOP에서 사용하겠다는 의미이다.
public class MyAspect {
  @Pointcut("execution(* runSomething ())")
  private  void iampc() {

  }
  @Before("iampc()")   //대상 메서드 실행전에 이 메서드를 실행하겠다.
  public void before(JoinPoint joinPoint){
    System.out.println("얼굴 인식 확인: 문 개방");
  }
  @After("iampc()")
  public void after(JoinPoint joinPoint) {
    System.out.println("외출 : 문잠금");
  }
}
profile
24년도까지 프로젝트 두개를 마치고 25년에는 개발 팀장을 할 수 있는 실력이 되자!

0개의 댓글