본문 바로가기
백엔드/스프링 핵심 개념

AOP

by 임지혁코딩 2023. 12. 25.

관점 지향. 

특정 함수 호출 전, 후에 공통적인 처리를 위한 것. 

특정 타이밍에서만 원하는 작업을 넣어주고 싶을때 사용한다. 

즉. 공통적이지만 모든 곳에 공통적이지 않은 logging->특정 부분에 상세 로깅하고 싶을때. Transaction -> 내부적으로 aop 기법을 사용해서 , 시작과 끝 지점 처리. 인증 -> 특정 영역 사용을 위한 인증. 

주로 LOGGING(시간재기나 등등)LOCK,인증 등에서 사용한다. 

 

AOP사용의 단점? 코드 분석을 어렵게 하는 단점이 있고, 보수적으로 사용하는 것은 어떨까 제안 . 

 

Aspect -> 특정 관심사를 모듈화 한것. 

Advice- > 실제 적용 기능. 로깅, 트랜잭션등의 기능

join point-> 프로젝트의 진행중, AOP를 넣어줄 수 있는 포인트.

POINTCUT-> 실제로 JOIN POINT 중 AOP가 들어간 포인트들. 

ADVICE가 적용된 OBJECT-> TARGET OBJECT. AOP PROXY -> 특정 CLASS에 AOP를 입힐때. 사실은!

클래스에 AOP를 한번 더 씌워주고 적용시키는것. 해당 CLASS가 TARGET OBJECT, 이 덧붙이는 작업이 AOP PROXY.

WEAVING-> ADVICE를 비지니스 로직 위에 붙이는 것. 

즉, ADVICE를 POINT CUT들에 적용시키게 되는 것이다. 

 

 

실제 예시 . 

@Aspect

@Component  //특정 Aspect를 Bean으로 등록해서 사용. 

public class UsefulAspect {

   @ PointCut("exection (*transfer(..))" //포인트 컷의 사용식. 

   public void anyOldTransfer() {}

 

   @ PointCut("exection (public * * transfer(..))"  //public 메서드 대상으로 포인트컷 

   @ PointCut("within(com.xyz.myapp.trading.*})" // 특정 패키지 대상  등 등.. 가능

   

}

 

//갑자기 생각난 정보!! 이전 프로젝트 내용에서 로그인 회원가입을 AoP 를 통해서 얼마나 걸리는지 확인해달라는 요청을 받아 진행했던 경험! 이를 기억하며 밑 내용을 보자 

 

Ex) start, stop watch를 통해서, 시작과 끝 간에 걸리는 시간을 확인했던 기록

 

@Aspect 

public class AroundExample {

 

   @Around("com.xyz.myapp.commponpointcuts.businesservice()")

   public Object doBasicProfitin(ProceedingJoinPOint pjp ) throws Throwable  {

   Object retval = pjp.proceed) 

  //METHOD의 시작 전과 후에 현재 시간, 그 이후 시간을 확인해서 시간을 확인하면, 정확학 동작 시간 CHECK 가능.

+함수의 시작 전에 LOCK을 제거하거나 추가할 수 있는 기능도 추가할 수 있다. 

    return retVal; 

} } 

 

 

 

 

'백엔드 > 스프링 핵심 개념' 카테고리의 다른 글

SpEL  (0) 2023.12.27
Resource  (0) 2023.12.26
Validation, Data binding  (1) 2023.12.26
JAVA- spring, spring boot/ BEAN  (0) 2023.12.25
API  (1) 2023.12.20