관리 메뉴

VivaButton

[스프링부트, Spring Boot]관점지향 프로그래밍(AOP: Aspect-Oriented Programming) #4 본문

카테고리 없음

[스프링부트, Spring Boot]관점지향 프로그래밍(AOP: Aspect-Oriented Programming) #4

비바버튼 2019. 5. 2. 12:40
728x90

이번 포스팅에서는 스프링 AOP(Aspect Orientecd Programming, 관점지향 프로그래밍)에 대해 알아보겠습니다.

 

Spring AOP(Aspect Oriented Programming)이란?

AOP는 관점지향 프로그래밍으로 기능을 핵심 비지니스 기능과 공통 기능으로 구분하고, 공통 기능(로깅, 보안인증 모듈 등)을 개발자의 코드 밖에서 필요한 시점에 적용하는 프로그래밍 방법이다. 코드 밖에 공통기능이 설정 된다는 것이 핵심이다.

AOP가 사용되는 경우

1) 간단한 메소드 성능 검사

개발도중 특히 DB에 대용량 데이터를 조회하고 등록하는 등의 배치 작업에 대하여 실행 시간을 측정해보고 쿼리를 개선하는 작업은 매우 의미가 있다. 이경우 매번 해당 메소드의 처음과 끝에 System.currentTimeMills() 를 사용하거나, 스프링이 제공하는 StopWatch 코드를 사용하기는 매우 번거로운 일이다. 이런 경우 해당 작업을 하는 코드를 밖에 설정하고 해당 기능을 사용하는 것이 편리하다.

2) 트랜젝션 처리

트랜젝션의 경우 비지니스 로직의 전후에 설정된다. 하지만 매번 사용하는 트랜젝션(try ~ catch)의 코드는 번거롭고 소스코드를 복잡하게 만들어지게 한다.

3) 기타 

예외반환, 아키텍처 검증, DB 동기화 문제 해결, 로깅, 인증권한 등등

Aspect, Advice, Pointcut, Weaving, Joinpoint 등의 AOP 구성요소를 알고 넘어가야 하지만, 속성으로 스터디를 진행하고 있으니 나중에 알아보도록 하겠다.

 

스프링에서 AOP 적용하는 방법 3단계 

1. spring-boot-starter-aop dependency 적용하기
라이브러리 의존성 설정

<dependency>

    <groupId>org.springframework.boot</groupId>

    <artifactId>spring-boot-starter-aop</artifactId>

</dependency>

2. @EnableAspectJAutoProxy 적용하기

최상위 패키지에 있는 클래스에 Anotation을 적용하여 AOP를 찾을 수 있게 해준다.

@EnableAspectJAutoProxy

@SpringBootApplication

public class AoploggingApplication {

    public static void main(String[] args) {

        SpringApplication.run(AoploggingApplication.class, args);

    }

}

3. 공통기능을 정의하고 공통기능이 사용될 시점을 정의한다.

@Aspect

@Component

public class LogAspect {

    Logger logger =  LoggerFactory.getLogger(LogAspect.class);

    //BookService의 모든 메서드

    @Around("execution(* com.example.demo.service.BookService.*(..))")

    public Object logging(ProceedingJoinPoint pjp) throws Throwable {

        logger.info("start - " + pjp.getSignature().getDeclaringTypeName() + " / " + pjp.getSignature().getName());

        Object result = pjp.proceed();

        logger.info("finished - " + pjp.getSignature().getDeclaringTypeName() + " / " + pjp.getSignature().getName());

        return result;

    }

}

끝. 메소드의 시작과 끝에 로깅을 하도록 AOP를 적용해 보았다.

AOP 부가설명

라이브러리를 읽어오는것은 당연한일이고, @EnableAspectJAutoProxy는 스프링이 자동으로 개발자의 메소드를 호출하기 전에 가로챌 수 있게 하는 설정이라고 보면 된다.

이렇게 가로채야만 메소드를 실행하기 전이나 후에 공통기능을 실행 할 수 있다.

 

 

* 참고자료 : https://isstory83.tistory.com/90

 

Spring - AOP 개념 정리

AOP (Aspect Oriented Programming) - 기능을 핵심 비지니스 로직과 공통 모듈로 구분하고, 핵심 로직에 영향을 미치지 않고 사이사이에 공통 모듈을 효과적으로 잘 끼워넣도록 하는 개발 방법이다. 공통 모듈(보..

isstory83.tistory.com

* 참고자료2 : https://jeong-pro.tistory.com/171

 

Spring AOP 스프링이 해줄건데 너가 왜 어려워 해? Spring boot에서 aop logging 사용법 제일 쉽게 알려드립니다!

Spring AOP (Aspect Oriented Programming) - AOP는 관점 지향 프로그래밍으로 "기능을 핵심 비즈니스 기능과 공통 기능으로 '구분'하고, 공통 기능을 개발자의 코드 밖에서 필요한 시점에 적용하는 프로그래밍 방..

jeong-pro.tistory.com