반응형
Spring AOP를 이용하여 특정상황에 AOP를 적용할 수 있습니다. 이번 포스팅에서 설명할 내용은 다음과 같습니다. ---------------------------------------------------------- 직접 만든 @Trace 어노테이션이 붙은 메소드에 AOP 적용하기 예외가 발생했을 경우 재시도를 하는 AOP 적용하기 메소드의 실행시간이 일정 시간을 초과했을 경우 AOP 적용하기 @Trace 어노테이션이 붙은 메소드에 AOP 적용 먼저 직접 만든 @Trace 어노테이션이 붙은 메소드에 AOP 적용하는 방법을 알아 보겠습니다. 1. @Trace 어노테이션을 생성합니다. @Trace 어노테이션 package hello.aop.exam.annotation; ... @Target(Elem..
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..
AOP를 사용하지 않는다면 ?AOP에 대해 설명하기 전에 AOP를 사용하는 이유에 대해 먼저 알아 봅시다. 애플리케이션 로직은 크게 핵심 기능과 부가 기능으로 나눌 수 있습니다.핵심 기능 : 해당 객체가 제공하는 고유의 기능부가 기능 : 핵심 기능을 보조하기 위해 제공되는 기능 ( ex: 로그 추적 기능, 트랜잭션 기능 )보통 기존 프로젝트에 부가 기능을 추가하게 되면 하나의 클래스가 아닌 여러 클래스에 부가 기능을 추가하게 됩니다.예를 들어서 프로젝트의 모든 클래스에 로그 기능을 추가 한다면 하나의 부가 기능(로그 추적)을 여러 곳에 동일하게 사용하게 됩니다.이러한 부가 기능을 바로 횡단 관심사(cross-cutting concerns) 라고 합니다. 부가 기능 적용시 문제점그런데 이러한 기존 프로젝..
프록시란 ? 우리가 일반적으로 클라이언트가 서버를 호출할 때는 아래와 같은 그림을 떠올립니다. 직접 호출의 경우에는 클라이언트가 서버를 직접 호출하고, 그 결과를 받습니다. 그런데 클라이언트가 요청한 결과를 서버에 직접 요청하는 것이 아닌 "대리자"를 통해 대신 간접적으로 서버에 요청을 할 수도 있습니다. 여기서 "대리자"의 역할을 하는 것은 프록시(Proxy)로, 클라이언트는 프록시를 통해 간접적으로 서버에 요청합니다. 이렇게만 보면 굳이 프록시를 중간에 둬서 요청을 해야하나 ? 라는 생각이 들 수 있는데 프록시를 중간에 둘 경우 여러 기능을 추가로 얻을 수 있습니다. 프록시의 주요 기능 접근 제어 권한에 따른 접근 차단 캐싱 지연 로딩 - 접근 제어의 캐싱 예시 철수가 메로나가 먹고 싶어 형한테 올 ..
동시성이란? 여러 쓰레드가 동시에 같은 인스턴스의 필드 값을 변경하면서 발생하는 문제를 동시성 문제라고 합니다. 이런 동시성 문제는 여러 쓰레드가 같은 인스턴스의 필드에 접근해야 하기 때문에 트래픽이 많을 때 자주 발생하게 됩니다. 특히 자바의 스프링은 기본적으로 스프링 빈을 싱글톤으로 등록하기 때문에 싱글톤 객체의 필드를 변경하며 사용할 때 이러한 동시성 문제를 조심해야 합니다. ( 동시성 문제는 값을 읽기만 하면 발생하지 않고, 값을 변경하기 때문에 발생 ) 동시성 문제는 쓰레드마다 각각 다른 메모리 영역이 할당 지역 변수에서는 발생하지 않고, 동시성 문제가 주로 발생하는 곳은 같은 인스턴스의 필드(주로 싱글톤에서 자주 발생) 접근, 또는 static 같은 공용 필드에 접근할 때 발생합니다. 동시성 ..