🎯 학습 목표
- 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 표현식의 패키지/클래스 경로가 실제와 맞는지 먼저 확인하세요.