Spring AOP

Spring AOP 강좌 03강 — 첫 Aspect 만들기: @Aspect와 @Before 로깅

🎯 학습 목표

  • AOP 의존성을 추가한다.
  • @Aspect 클래스를 만들어 빈으로 등록한다.
  • @Before로 메서드 호출을 자동 로깅한다.

📖 개념 설명

스프링 부트에서 AOP는 spring-boot-starter-aop 의존성만 추가하면 바로 쓸 수 있습니다(AspectJ 어노테이션 기반). Aspect는 @Aspect + @Component를 붙인 일반 스프링 빈입니다.

💻 의존성

# build.gradle
implementation 'org.springframework.boot:spring-boot-starter-aop'
# (Spring Boot라면 @EnableAspectJAutoProxy는 자동 적용됨)

💻 대상이 될 서비스

@Service
public class MemberService {
    public String findName(Long id) {
        return "member-" + id;
    }
    public void register(String name) {
        System.out.println("회원 등록: " + name);
    }
}

💻 첫 Aspect — 호출 전 로깅

@Aspect
@Component
public class LoggingAspect {

    private static final Logger log = LoggerFactory.getLogger(LoggingAspect.class);

    // MemberService의 모든 public 메서드 실행 전에 동작
    @Before("execution(* com.example.service.MemberService.*(..))")
    public void logBefore(JoinPoint jp) {
        String method = jp.getSignature().toShortString();
        Object[] args = jp.getArgs();
        log.info("▶ 호출: {} / 인자={}", method, Arrays.toString(args));
    }
}

💻 실행 결과

memberService.findName(42L) 호출 시 콘솔:
  ▶ 호출: MemberService.findName(..) / 인자=[42]
memberService.register("kim") 호출 시:
  ▶ 호출: MemberService.register(..) / 인자=[kim]
// 서비스 코드는 한 줄도 안 건드렸는데 로깅이 자동 적용됨!

⚠️ 주의사항

  • Aspect는 스프링 빈으로 등록되어야 동작합니다(@Component 필수, 또는 @Bean 등록).
  • AOP는 스프링 컨테이너가 주입한 빈을 통해 호출할 때만 적용됩니다. new로 만든 객체엔 적용 안 됩니다.

💡 팁

  • JoinPoint에서 getSignature(), getArgs(), getTarget()로 호출 정보를 꺼낼 수 있습니다.
  • 로그가 안 찍히면 Pointcut 표현식의 패키지/클래스 경로가 실제와 맞는지 먼저 확인하세요.