AOP를 특정 패키지 기준으로 적용할 경우, 해당 패키지가 변경되면 코드도 함께 수정해야 하는 문제가 발생할 수 있다.
// AS IS
@Around("execution(* com.sprint.mission.discodeit.service..*(..))")
// TO BE
@Retention(value = RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface Logging {
String value() default "";
}
@Around("@annotation(com.sprint.mission.discodeit.annotation.Logging)")
위와 같이 커스텀 어노테이션을 정의해 설정하면, 코드 변경에도 유연하게 대응할 수 있다.
resolve ~ 등의 유사한 처리를 하는 메서드가 반복되는 경우, 이를 별도의 유틸리티 메서드로 추출해 재사용하는 것이 효율적이다.
아래의 코드에서 숫자 5는 상수로 선언하여 의미를 명확히 표현하는 것이 좋다.
// AS IS
Instant instantFiveMinuteAgo = Instant.now().minus(Duration.ofMinutes(5));
// TO BE
private static final int TIMEOUT_MINUTES = 5;
Instant instantFiveMinuteAgo = Instant.now().minus(Duration.ofMinutes(TIMEOUT_MINUTES));