AOP @Around 시 proceed 를 호출안하면?

백엔드&인프라 추종자·2025년 2월 27일

스프링 공부

목록 보기
22/35

개인생각

@Around 안에서 proceed 를 호출안하면, URL 로 접근된 메소드가 실행이 되지 않는다.


네, @Around 어드바이스에서 proceed() 메서드를 실행하지 않으면, 해당 메소드가 실제로 실행되지 않습니다. 즉, 메소드 실행을 "차단"하거나 "취소"하는 효과를 낳습니다.

AOP에서 @Around는 메소드 실행 전후에 동작하며, joinPoint.proceed()현재 실행 중인 메소드를 실행하는 역할을 합니다. 만약 proceed()를 호출하지 않으면, 그 메소드는 실행되지 않습니다.

예시:

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Around;
import org.springframework.stereotype.Component;

@Aspect
@Component
public class MyAspect {

    @Around("execution(* com.example.service.*.*(..))")  // 모든 메소드에 AOP 적용
    public Object logMethodInfo(ProceedingJoinPoint joinPoint) throws Throwable {
        // 메소드 실행 전
        System.out.println("메소드 실행 전: " + joinPoint.getSignature().getName());

        // proceed() 호출하지 않으면 메소드 실행 안됨
        System.out.println("메소드 실행을 차단합니다.");
        return null;  // 메소드 실행을 하지 않음
    }
}

위 코드 설명:

  • @Around 어드바이스에서 proceed()를 호출하지 않으면, 해당 메소드가 실제로 실행되지 않습니다.
  • 메소드 실행을 차단하고, return null을 반환하여 메소드 실행을 중지시킬 수 있습니다.

이럴 경우의 동작:

  • 만약 /some-url에 대한 URL 호출com.example.service.SomeService.someMethod() 메소드로 연결되어 있고, 이 메소드에 AOP가 적용된 상태에서 proceed()를 호출하지 않으면, 실제로 someMethod() 메소드는 실행되지 않으며, URL 호출에 대한 응답도 돌아가지 않게 됩니다.
  • 이때 클라이언트는 서버로부터 응답을 받지 못할 수 있습니다. return null을 반환하거나 다른 응답을 생성해주지 않으면 HTTP 요청에 대한 처리가 끝나지 않기 때문입니다.

대체로 URL 호출을 "안하는" 상황:

  1. 예를 들어 요청을 받았을 때, @Around에서 proceed()를 호출하지 않으면 메소드가 실행되지 않으므로, URL 호출에 해당하는 비즈니스 로직은 실행되지 않습니다.

  2. 응답을 반환하지 않으면:

    • 만약 @Around 어드바이스에서 proceed()를 호출하지 않고 아무런 응답도 반환하지 않으면, 클라이언트는 응답을 받지 못하고 대기 상태로 있게 됩니다.
    • 이는 타임아웃을 유발하거나 500번대 오류 (서버 내부 오류)를 발생시킬 수 있습니다.

응답을 반환하는 방법:

  • 만약 메소드 실행을 차단하고도 특정 응답을 반환하려면, proceed()를 호출하지 않고 적절한 값을 반환해야 합니다.

예시:

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Around;
import org.springframework.stereotype.Component;

@Aspect
@Component
public class MyAspect {

    @Around("execution(* com.example.service.*.*(..))")  // 모든 메소드에 AOP 적용
    public Object logMethodInfo(ProceedingJoinPoint joinPoint) throws Throwable {
        // 메소드 실행 전
        System.out.println("메소드 실행 전: " + joinPoint.getSignature().getName());

        // 메소드 실행을 차단하고, 대신 특정 값을 반환
        System.out.println("메소드 실행을 차단합니다.");
        return "메소드 실행을 차단한 결과";  // 응답을 반환
    }
}

위 코드에서는 proceed()를 호출하지 않고, 대신 "메소드 실행을 차단한 결과"라는 값을 반환합니다. 이렇게 하면 실제 비즈니스 로직은 실행되지 않지만, 클라이언트에게 적절한 응답을 보낼 수 있습니다.

결론:

  • proceed()를 호출하지 않으면 메소드가 실행되지 않으며, 해당 메소드를 호출한 URL에 대한 응답도 돌아가지 않거나 에러가 발생할 수 있습니다.
  • 만약 메소드 실행을 차단하고 응답을 반환하고 싶다면, proceed()를 호출하지 않고 적절한 값을 반환해야 합니다.
profile
AI 답변 글을 주로 올립니다.

0개의 댓글