스프링은 프록시 방식의 AOP를 사용합니다. 스프링 AOP를 적용하면 스프링은 대상 객체 대신에 프록시를 스프링 빈으로 등록하고, 스프링은 의존관계 주입시에 항상 프록시 객체를 주입합니다. 프록시 객체가 주입되기 때문에 대상 객체를 직접 호출하는 문제는 일반적으로 발생하지 않지만 대상 객체의 내부에서 메서드 호출이 발생하면 프록시를 거치지 않고 대상 객체를 직접 호출하는 문제가 발생하게 됩니다. 어떤 문제가 발생하는지 간단한 예시를 통해 알아보겠습니다. CallService에서 external() 메서드를 호출하는데 그 안에서 CallService 자기 자신의 메서드인 internal()을 호출하는 상황 package hello.aop.internalcall.aop; ... @Slf4j @Componen..
Spring AOP를 이용하여 특정상황에 AOP를 적용할 수 있습니다. 이번 포스팅에서 설명할 내용은 다음과 같습니다. ---------------------------------------------------------- 직접 만든 @Trace 어노테이션이 붙은 메소드에 AOP 적용하기 예외가 발생했을 경우 재시도를 하는 AOP 적용하기 메소드의 실행시간이 일정 시간을 초과했을 경우 AOP 적용하기 @Trace 어노테이션이 붙은 메소드에 AOP 적용 먼저 직접 만든 @Trace 어노테이션이 붙은 메소드에 AOP 적용하는 방법을 알아 보겠습니다. 1. @Trace 어노테이션을 생성합니다. @Trace 어노테이션 package hello.aop.exam.annotation; ... @Target(Elem..
문제 설명 입출력 예제 # 입력 5 1 3 2 -1 2 4 4 -1 3 1 2 4 3 -1 4 2 4 3 3 5 6 -1 5 4 6 -1 # 출력 11 풀이 코드 이전 포스팅한 백준 1967 트리의 지름 문제와 별 차이가 없습니다. 주어진 입력값으로 그래프를 초기화하는 방법만 다를 뿐입니다. 트리의 지름을 구하는 방법은 다음과 같습니다. 1. 시작 정점에서 임의의 정점까지의 거리를 구하여 가장 먼 거리를 구합니다. 2. 1에서 찾은 가장 먼 거리를 시작 지점으로 하여 다시 한번 가장 긴 거리를 찾습니다. 정답 코드 (DFS) import sys input = sys.stdin.readline sys.setrecursionlimit(10 ** 9) V = int(input()) graph = [[] for..
문제 설명 입력과 출력 입출력 예제 # 입력 12 1 2 3 1 3 2 2 4 5 3 5 11 3 6 9 4 7 1 4 8 7 5 9 15 5 10 4 6 11 6 6 12 10 # 출력 45 풀이 코드 트리의 지름을 구하는 문제로, 가장 긴 이동 경로를 갖는 구간을 의미합니다. 트리의 지름을 구하는 방법은 다음과 같습니다. 1. 시작 정점에서 임의의 정점까지의 거리를 구하여 가장 먼 거리를 구합니다. 2. 1에서 찾은 가장 먼 거리를 시작 지점으로 하여 다시 한번 가장 긴 거리를 찾습니다. 정답 코드 (DFS) import sys input = sys.stdin.readline sys.setrecursionlimit(10**9) n = int(input()) tree = [[] for _ in rang..
AspectJ는 포인트컷을 편리하게 표현하기 위한 특별한 표현식을 제공합니다. 스프링에서는 포인트컷 표현식에서 사용하기 위해 AspectJ가 제공하는 포인트컷 지시자(Pointcut Designator) 줄여서 PCD를 지원합니다. 포인트컷 지시자의 종류 포인트컷 지시자는 아래와 같이 여러개가 있지만, 주로 execution을 자주 사용합니다. execution : 메소드 실행 조인 포인트를 매칭한다. 스프링 AOP에서 가장 많이 사용하고, 기능도 복잡하다. within : 특정 타입 내의 조인 포인트를 매칭한다. args : 인자가 주어진 타입의 인스턴스인 조인 포인트 this : 스프링 빈 객체(스프링 AOP 프록시)를 대상으로 하는 조인 포인트 target : Target 객체(스프링 AOP 프록시..
스프링 AOP 적용법 스프링 AOP를 사용하기 위해서는 build.gradle에 아래의 라이브러리를 의존성 추가해줘야합니다. implementation 'org.springframework.boot:spring-boot-starter-aop' // aop 추가 스프링 AOP를 적용하기 위해서는 @Aspect 어노테이션을 사용합니다. @Slf4j @Aspect @Component public class AspectExample @Around("execution(* hello.aop.test..*(..))") // AspectJ 표현식 public Object doLog(ProceedingJoinPoint joinPoint) throws Throwable { log.info("[log] {}", joinPo..