본문 바로가기

Server Development/Spring Basic

Spring - AOP

 

Spring에서는 기본적으로 여러가지 기능을 제공한다.

IoC, DI, AOP, ORM, MVC, Test 등이 있는데 전반적으로 개발을 하는데 있어서 쉽게 하기위해서 제공해주는 기능 같다.

그 중에 스프링 AOP가 무엇인지 알아보려고 한다.

 

AOP

- Aspect Oriented Programming

- 관점 지향 프로그래밍

- Object Oriented Programming(객체 지향 프로그래밍)을 보완하여 여러곳에서 쓰이는 공통기능을 모듈화하여 필요한곳에 연결함으로써 유지보수 또는 재사용이 용이해진다.

 

개발을 하다보면 자주 쓰이는 기능이 있다. 이들을 따로 모듈화하여 비지니스 로직과 분리해두지만 동작은 똑같게 만들어주는 방식을 AOP라고 한다.

 

코드를 분리할때, 핵심적인 관점과 부가적인 관점 둘로 나눌 수 있는데,

핵심적인 관점이란 우리들이 사용하는 비지니스 로직을 의미하고

부가적인 관점이란 비지니스 로직들안에 자주쓰이는 코드이면서 분리가능한 로직을 의미한다.

예를들어, 인코딩, 로그 관리 등을 볼 수 있다.

이렇게 다른 부분에서 자주쓰이는 코드라는 의미로 흩어진 관심사 라고도 한다.

또한 Spring AOP는 비지니스 로직 실행시 어떠한 부분을 가로채 실행하므로 프록시패턴이라고도 한다.

 

 

주요 용어 정리

  • Aspect : 부가기능(흩어진 관심사) 를 모듈화 한 것.
  • Target : Aspect를 적용할 클래스나 메서드.
  • Advice : 부가 기능을 담은 구현체
  • JointPoint : 모듈이 적용될 시점, 위치
  • PointCut : JointPoint을 좀 더 상세하게 설정.

 

 

Dependancy 설정 

<!-- AOP -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
</dependency>

 

 

 

관련 애너테이션

 

클래스 상단에 작성(Aspect)

@Component : 해당 클래스가 configuration 클래스임을 등록

@Aspect : 해당 클래스가 AOP 프록시 객체임을 등록

 

시점, 장소 선택(Target, Advice, JoinPoint)

@Before ("${위치}") : 해당 위치에 맞는 메서드나 클래스 실행 전에 실행

@After ("${위치}") : 해당 위치에 맞는 메서드나 클래스 실행 후에 실행

@Around ("${위치}") : 해당 위치에 맞는 메서드나 클래스 실행 전과 후에 실행

 

@Around("execution(* com.ReservationServer1..*(..))")

 지정시 해당 패키지 아래 모든 클래스의 메서드 앞뒤로 Aspect 한다는 뜻이다.

 

이 후 해당 메서드안에 실행할 내용을 작성하면 된다

이 밖에도 많은 애너테이션이 있으나 나중에 사용하면서 궁금하면 찾아보려고 한다.

 

기본 양식은 다음과 같다.

 

@Component
@Aspect
public class testAOP {

    @Around("execution(* com.ReservationServer1..*(..))")
    public Object logPerf(ProceedingJoinPoint pjp) throws Throwable {
        long begin = System.currentTimeMillis();
        Object reVal = pjp.proceed();
        System.out.println(System.currentTimeMillis() - begin);
        return reVal;
    }
}

 

여기서 주의깊에 볼것은 @Around는 지정한 위치 앞뒤로 실행된다고 했다.

모든 부분이 실행되는 것이 아닌, reVal 기준으로 앞에 있는 코드가 실행전 시작되고 뒤에 있는 코드는 메서드 마치고 실행된다.

따라서 이 부분을 PointCut으로 볼 수 있다.

'Server Development > Spring Basic' 카테고리의 다른 글

Spring - Jasypt  (0) 2023.04.06
Spring - Multiple Requests, Threads  (0) 2023.04.05
Spring - Exception  (0) 2023.04.01
Spring - Log(LogBack)  (0) 2023.04.01
Spring - MVC  (0) 2023.03.24