Spring framework core (12) - Spring AOP

2020. 1. 24. 23:06· Java/Spring framework

Spring AOP

Aspect-Oriented Programming는 OOP를 보완하는 수단이다.

로깅, 트랜잭션 등 서비스 로직 내에서 동일하게 사용되는 특별한 관심사(Aspect)를 모듈화하는 기법이다.

개요

트랜잭션을 활성화한 로직은 아래와 같은 공통 사항을 포함할 수 있다.

  1. 트랜잭션 활성화
  2. 서비스 로직 수행
  3. Commit / Rollback
  4. 트랜잭션 종료

AOP가 없다면 트랜잭션이 필요한 로직을 아래처럼 수행할 수 있다.

void doLogic() {
    transactionManager.enable();
    boolean result = service.execute1();
    if (result) {
        transactionManager.commit();
    } else {
        transactionManager.rollback();
    }
    transactionManager.exit();
}
void doLogic2() {
    transactionManager.enable();
    boolean result = service.execute2();
    if (result) {
        transactionManager.commit();
    } else {
        transactionManager.rollback();
    }
    transactionManager.exit();
}

boolean result = service.execute*(); 를 제외하고 나머지가 모두 동일한 코드로 되어 있다.

이 작업이 반복되면 관리 포인트가 늘어나게 되고 개발자에겐 귀찮은 일이 될 것이다.

AOP는 위와 같은 문제를 모듈화하는 것으로 해결한다.

서비스 로직에는 주 로직만 작성하고 부가 모듈은 따로 빼내어 관리하는 방법으로 주 로직에만 집중할 수 있게 도와준다.

주요 용어

  1. Aspect

    • 관심사를 의미한다.
    • 핵심 로직에서 따로 빼내어 관리하고 싶은 보조 로직을 Aspect로 생각하자.
  2. Target

    • Aspect를 적용할 대상
  3. Advice

    • Aspect가 어떠한 로직을 수행할 것인지 정의
  4. Join point

    • Advice를 적용할 위치
    • 다양한 시점에 적용이 가능하다. (메소드 실행 전,후/생성자/필드 등)
  5. Point cut

    • Join point의 상세 정의
    • 적용 위치나 침투 시점 등을 상세하게 정의할 수 있다.
    • 예시로 A 클래스의 모든 메소드 실행 전 으로 지정 가능

사용 예시

AOP를 실제로 구현해본다.

CRUD 기능을 수행하는 서비스 클래스를 대상으로 작동하는 AOP를 만들었다.

  1. CrudService
@Service
public class CrudService implements CrudManager {

    @Clock
    public void create() {
        System.out.println("create");
    }

    @Override
    public void read() {
        System.out.println("read");
    }

    @Clock
    public void update() {
        System.out.println("publish");
    }

    @Clock
    public void delete() {
        System.out.println("delete");
    }
}
  1. Clock
    • 이 annotation이 붙은 메소드는 실행 시간을 측정한다.
@Target(ElementType.METHOD)
public @interface Clock {}
  1. CrudAspect
    • Aspect 정의
    • @Around 는 대상 메소드 실행 전/후, 예외 발생 시점에 수행한다.
    • 시간 측정의 Point cut은 @Clock 이 부착된 메소드의 @Around 로 설정했다.
    • @Before 는 대상 메소드 실행 전에 수행한다.
    • bean으로도 대상을 선택할 수 있다. 이름을 넣어서 실행하면 모든 메소드가 대상이 된다.
@Component
@Aspect
public class CrudAspect {

    @Around(“@annotation(com.example.demo.Clock)”)
    public Object timeMeasure(ProceedingJoinPoint joinPoint) throws Throwable {
        long begin = System.currentTimeMillis();
        Object ret = joinPoint.proceed();
        System.out.println("걸린 시간 : " + (System.currentTimeMillis() - begin) + " ms");
        return ret;
    }

    @Before("bean(crudService)")
    public void beforeExecute() {
        System.out.println("This is CRUD!");
    }
}
  1. AppRunner
    • 로직 수행
@Component
public class AppRunner implements ApplicationRunner {

    @Autowired
    private CrudManager crudManager;

    @Override
    public void run(ApplicationArguments args) throws Exception {
        crudManager.create();
        crudManager.read();
        crudManager.update();
        crudManager.delete();
    }
}

결과

This is CRUD!
create
걸린 시간 : 12 ms
This is CRUD!
read
This is CRUD!
publish
걸린 시간 : 1 ms
This is CRUD!
delete
걸린 시간 : 0 ms

모든 메소드에서 실행한 aspect,

read를 제외한 메소드에만 실행한 aspect를 확인할 수 있다.

 

전체 소스코드

https://github.com/dhmin5693/Spring-core-study/tree/master/SpringAOP

저작자표시 비영리 (새창열림)

'Java > Spring framework' 카테고리의 다른 글

Spring framework 소스코드 읽어보기 - Bean 생성 원리 (3)  (0) 2020.02.23
Spring framework 소스 코드 읽어보기 - Bean 생성 원리 (2)  (1) 2020.01.27
Spring framework core (11) - SpEL  (0) 2020.01.24
Spring framework core (10) - Data binding  (0) 2020.01.17
Spring framework core (9) - Validation  (0) 2020.01.15
'Java/Spring framework' 카테고리의 다른 글
  • Spring framework 소스코드 읽어보기 - Bean 생성 원리 (3)
  • Spring framework 소스 코드 읽어보기 - Bean 생성 원리 (2)
  • Spring framework core (11) - SpEL
  • Spring framework core (10) - Data binding
감동이중요해
감동이중요해
https://github.com/dhmin5693 dhmin5693@naver.com
감동이중요해
티끌모아 산을 쌓아보자
감동이중요해
전체
오늘
어제
  • 분류 전체보기 (111)
    • 알고리즘 (35)
    • Infra & Dev tools (10)
      • Git (2)
      • Cloud platform (5)
      • Mac, Linux (3)
    • BigData (1)
    • IT 도서 (11)
      • Clean Code (8)
    • Java (36)
      • Spring framework (19)
      • JPA (5)
      • Domain Driven Design (3)
    • Database (2)
      • oracle (1)
      • mysql (0)
    • Computer Science (7)
      • 운영체제 (7)
    • 기타 (9)
      • 크롤링(파이썬) (1)
      • 회고 (4)
      • Career (0)

블로그 메뉴

  • 홈
  • 태그
  • 미디어로그
  • 위치로그
  • 방명록

공지사항

  • About me

인기 글

태그

  • 회고
  • DDD
  • Mac
  • Clean Code
  • 영속
  • Linux
  • AWS
  • Spring
  • Stream
  • 프로세스
  • bean
  • 알고리즘
  • Java
  • JPA
  • 운영체제
  • 블라인드공채
  • 메모리
  • Database
  • 우아한테크캠프2기
  • 영속상태

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.2
감동이중요해
Spring framework core (12) - Spring AOP
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.