반응형
아래와 같이 모든페이지에는 Layout으로 적용한 Header 부분이 공통적으로 들어간다. 그렇기 때문에 모든 페이지에서 해당 알림 데이터 리스트들이 필요하다. 하지만 현재 해당 헤더가 적용된 view를 반환하는 컨트롤러 코드들은 로그인과 회원가입 페이지들을 제외하면 총 9개가 있다. 이 많은 컨트롤러마다 일일히 패키지를 열어서 알림 테이블에서 회원별 알림 내역을 조회한 데이터들을 model에 담아 일일이 View에 뿌려줘야할까? 공통으로 사용되는 부분을 단순 반복 작업을 통해 추가하는건 너무 개발자스럽지 않다. 이 공통으로 사용되는 로직을 스프링 AOP를 적용해 해당 Contoller들의 Model에 알림 데이터들을 추가 해보자. AOP 적용 우선 먼저 build.gradle에 해당 의존성을 추가해주어..
스프링은 프록시 방식의 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..
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) 라고 합니다. 부가 기능 적용시 문제점그런데 이러한 기존 프로젝..