minlog
article thumbnail

 

AOP 

관점 지향 프로그램

스프링 어플리케이션, MVC웹 어플리케이션에서 Web Layer, Business Layer ,Data Layer로 정의한다.

 

  • Web Layer : Rest Api 제공, Client 중심의 로직 적용
  • Business Layer : 내부 정책에 따른 logic 를 개발
  • Data Layer  : 데이터 베이스 및 외부와의 연동 처리

 

횡단 관심

특정 구역의 반복되는 로직들을 한곳에서 코딩해준다.

ex) 각 메소드가 시간이 얼마나 걸렸는지 로그를 남긴다. 

 

 

 

Annotation 의미
@Aspect 자바에서 많이 사용되는 AOP 프레임워크 
AOP를 정의한는 Class에 할당
@Pointcut 기능을 어디에 적용시킬지(메소드, 패키지 하위)등 AOP를 적용 시킬 지점을 설정
@Before 매소드가 실행하기 이전 
@After 메소드가 성공적으로 실행후, 예외 발생하더라도 실행된다.
@AfterReturing 메소드 호출 후 성공 실행 시 
@AfterThrowing 메소드 호출 후 실패 예외 발행
@Around Before/After 모두 제어

 

 

 

🍫 실무사례 1

중요한 메서드들에 어떤 값이 들어갔고 나왔는지,log를 남겨 볼수있다.

 

🍫 실무사례 2

메서드의 실행 시간으로 서버의 부화 및 상태를 로깅해 볼 수 있다. 

 

📑 build.gradle

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-aop'
    implementation 'org.springframework.boot:spring-boot-starter'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

1) AOP를 사용하기 위해서는 디펜던시(dependencies)를  추가해야한다. 

implementation 'org.springframework.boot:spring-boot-starter-aop'

 

 

 

📑 aop . java

@Aspect //aop 사용 선언
@Component // 빈으로 만들어서 스프링에서 관리
public class ParameterAop{
	//실행시킬 포인트 지점 (어떤 메서드)
    	// 1)  선언한 패키지(컨트롤러) 하위의 모든 메서드에서 사용
    @Pointcut("execution(* com.example.aop.controller..*.*(..))")
    public void cut(){}
    
    //들어갈때 (메서드명)
    	//JoinPoint 들어가는 지점에 대한 정보들을 가져오는 객체
    @Before("cut()")
   public void before(JoinPoint joinPoint){
    	//어떤 메서드들이 호출이 되어 실행을 했는지 확인가능
        MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();
        Method method = methodSignature.getMethod();
        
    	//조인포인트에 들어가고 있는 메게변수 배열
    	Object[] args = joinPoint.getArgs();
        for(Object obj : args){
        	System.out.println("type :" + obj.getClass().getSimpleName());
            System.out.println("value :" + obj);
        }
   }
    
    //반환값 (메서드명)
    @AfterReturning("cut()", returning ="reobj")
    public void afterReturn(JoinPoint joinPoint,Object reobj){
    	System.out.println("return obj :" + reobj);
    
   	}
}

 

 

 

 

 

 

profile

minlog

@jimin-log

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!