멘토님의 추천으로 공부하게 된 주제인데, 2차 프로젝트 마지막 부분에 고민했던 스웨거 적용, 커스텀 예외 적용, 로깅 등에 너무 필요한 주제를 시기 적절하게 RBF로 공부하게 되어서 좋았다!
Advice
+ PointCut
→ AOP의 기본 모듈이며, 싱글톤 형태의 객체로 존재@Aspect
: Spring Container에게 AOP 담당 객체임을 알리는 역할 / 내부에 반드시 PointCut 설정과 Advice 구현이 필요@PointCut
: Spring Container에게 객체 생성하도록 지정@Before(”${pattern}”)
: 지정한 패턴에 해당되는 메서드가 실행되기 전에 동작 / 이 어노테이션이 붙은 메서드의 반환값은 void 이어야 함@After(”${pattern}”)
: 지정한 패턴에 해당되는 메서드가 실행된 후에 동작 / 이 어노테이션이 붙은 메서드의 반환값은 Object 이어야 함@AfterReturning
: AOP가 적용될 메서드가 에러 없이 성공적으로 실행된 이후의 시점@AfterThrowing
: AOP가 적용될 메서드에서 에러가 발생해 Exception을 던지는 시점@Around(”${pattern}”)
: 지정된 패턴에 해당되는 메서드가 실행 전, 실행 후 모든 부분에서 동작 / 이 어노테이션이 붙은 메서드의 반환 값은 Object이어야 함The AspectJ Project | The Eclipse Foundation
-javaagent
옵션을 통해서 클래스 로더 조작기를 지정해야 하는데, 이 부분이 번거롭고 운영하기 어려움// AppConfig.java
@Configuration
@ComponentScan(basePackages = "com.example")
@EnableAspectJAutoProxy
public class AppConfig {
}
// Anotation 정의
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface LogExecutionTime {
}
// 로깅을 수행하는 Aspect 정의
@Aspect
@Component
public class LoggingAspect {
@Before("@annotation(LogExecutionTime)")
public void logExecutionTime(JoinPoint joinPoint) {
System.out.println("Before method execution: " + joinPoint.getSignature().getName());
}
}
// MyService의 main 메서드 실행
@Component
public class MyService {
@LogExecutionTime
public void doSomething() {
System.out.println("Inside doSomething method");
}
@LogExecutionTime
public void doAnotherThing() {
System.out.println("Inside doAnotherThing method");
}
public static void main(String[] args) {
// Spring 컨텍스트 초기화
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
// 빈(MyService)을 가져와서 메소드 호출
MyService myService = context.getBean(MyService.class);
myService.doSomething();
myService.doAnotherThing();
// 컨텍스트 종료
context.close();
}
}
이번 프로젝트를 진행하면서 예외처리 시에 중복적인 코드들이 발생했고, 시간 관계상 더 찾아보지 않고 중복코드를 그냥 감수해서 코드를 작생했다. Aspect를 잘 활용한다면 이런 부분들을 간소화 해서 가독성이 뛰어난 코드를 작성할 수 있을 것 같다는 생각을 했다
이후에 @EnableTransactionManagement
어노테이션을 config 파일에 설정해서 트랜잭션 관리 또한 할 수 있다는 글을 보았는데, 직접 코드에 적용해 보고 싶다
이외에도 다양한 경우에 AOP를 적용하는데,
[스프링 핵심 원리 - 고급편] 강의에 꼼꼼하게 설명해 주셔서 이번에는 용어 정리까지만 보고 다른 부분들은 간단하게 공부했다.. 최종프로젝트 시작 전까지 틈틈히 강의 이어서 듣고 있는데 원리에 대한 부분을 더 상세하게 이해할 수 있어서 좋았다 (
완강 화이팅)