본문 바로가기

Spring|Spring-boot117

Spring AOP 한계 스프링에서 제공하는 AOP를 사용하면서 기억해야 할 것들 스프링 AOP는 프록시프락시 방식의 AOP만을 사용한다. 따라서 AOP를 적용하기 위해서는 프록시를 통해 실제 Target에 접근해야 하는데, 이 과정에서 프록시에서 Advice를 실행한 후 대상 객체를 호출하게 된다. 만약 대상 객체가 포인트 컷을 통해 매칭될 시 스프링 빈으로 프록시 객체가 등록된다. 따라서 스프링은 해당 객체의 의존관계 주입 시 프록시 객체를 주입해주기 때문에 대부분 대상 객체 직접 호출 문제는 발생하지 않는다. 하지만 대상 객체 내부에서 메서드 호출이 발생하면 프록시를 거치지 않고 대상 객체를 직접 호출하는 문제가 있다. 간단한 테스트를 진행하자 @Slf4j @Service public class InternalCallSer.. 2022. 1. 31.
Spring AOP 매개변수 활용 this. target, args, @target, @within, @annotation, @args의 지시자들은 표현식을 사용해 어드바이스에 매개변수를 전달할 수 있다. 1. 포인트 컷의 이름과 매개변수의 이름을 맞추어야 한다. 2. 타입이 메서드에 지정한 타입으로 제한된다. @Test void success() { log.info("memberService Proxy= {}", memberService.getClass()); memberService.hello("helloA"); } @Slf4j @Aspect static class ParameterAspect { @Pointcut("execution( * hello.aop.member..*.*(..))") public void allMember(){.. 2022. 1. 30.
Spring AOP @target, @within @target : 실행 객체의 클래스에 주어진 타입의 애노테이션이 있는 조인 포인트 @within : 주어진 애노테이션이 있는 타입 내 조인 포인트 이 둘은 사용자 정의 애노테이션으로 AOP 적용 여부를 판단한다. Class, Method에 붙일 애노테이션을 준비하자. @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) public @interface ClassAOP { } @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) public @interface ClassAOP { } @target과 @within의 차이 - @target은 인스턴스의 모든 메서드를 조인 포인트로 적용한다. -.. 2022. 1. 29.
Pointcut - within, args within within 지시자는 특정 타입 내의 조인 포인트에 대한 매칭을 제한한다. 해당 타입이 매칭 되면 그 안의 메서드들이 자동적으로 매칭 된다. 즉 execution에서 타입 부분만 사용한다. AspectJExpressionPointcut pointcut = new AspectJExpressionPointcut(); pointcut.setExpression("within(hello.aop.example.Example)"); Method exampleMethod = Example.class.getMethod("test", String.class); assertThat(pointcut.matches(exampleMethod, Example.class)).isTrue(); AspectJExpressi.. 2022. 1. 29.
Pointcut - execution AspectJ는 Pointcut을 편리하게 표현하기 위한 표현식을 별도로 제공한다. AspectJ pointcut expression이라고 부르며 간단하게 포인트 컷 표현식이라고 부른다. 이러한 포인트 컷 표현식에는 Pointcut Designator라는 포인트 컷 지시자가 존재하며 예를 들어 execution, within.. 등등이 존재한다. 포인트 컷 지시자의 종류 종류 execution : 메서드 실행 조인 포인트를 매칭 한다. 스프링 AOP에서 가장 많이 사용하고, 기능도 복잡하다. within : 특정 타입 내의 조인 포인트를 매칭 한다. args : 인자가 주어진 타입의 인스턴스인 조인 포인트 this : 스프링 빈 객체(스프링 AOP 프록시)를 대상으로 하는 조인 포인트 target : T.. 2022. 1. 29.
Spring AOP (2) 설정 사항 - org.aspectj 패키지 관련 기능은 aspectjweaver.jar 라이브러리가 제공하는 기능이다. 따라서 해당 라이브러리 의존관계의 추가가 필요하며 spring-boot인 경우 spring-boot-starter-aop를 포함하면 스프링 AOP 기능 + asppecthweaver.jar도 함께 사용할 수 있도록 의존관계에 포함된다. 구성요소 포인트 컷을 별도의 클래스로 관리하여 public으로 사용할 수 있도록 구성할 것이다. import org.aspectj.lang.annotation.Pointcut; public class Pointcuts { @Pointcut("execution(* hello.aop.example..*(..))") public void allExample().. 2022. 1. 29.
Spring AOP 사전 지식 빈 후처리기 @Aspect Aspect 기억 되살리기 @Aspect를 어드바이저로 변환해서 저장하는 과정 1. 스프링 애플리케이션 로딩 시점에 자동 프락시 생성기(AnnotationAwareAspectJAutoProxyCreator) 호출 2. 자동 프록시 생성기는 스프링 컨테이너에서 @Aspect 애노테이션이 붙은 스프링 빈 모두 조회 3. @Aspect Advisor Builder를 통해 어드바이저 생성 4. 생성한 어드바이저를 빌더 내부에 저장. 자동 프록시 생성기 작동 과정 1. 스프링 빈 대상 객체 생성 2. 컨테이너에 저장하기 전 빈 후처리기 전달 3. 스프링 컨테이너에서 Advisor 빈, @Aspect 어드바이저 빌드에 저장된 Advisor빈 모두 조회 4. 프록시 적용 대상을 .. 2022. 1. 27.
파일 업로드 및 다운로드 서블릿부터 스프링이 제공해주는 다양한 방식으로 파일 업로드 및 다운로드를 정리하려고 한다. 현재 클라이언트 요청에 따른 ReportingServer 모듈을 활용해 Report를 보여줌과 동시에 해당 report를 한글, 엑셀, PDF 형태로 서버로 다운로드 요청을 보내고, 응답 값으로 서버에 저장된 파일명을 리턴하여 대기후, 다운로드 요청 시 사용자 요청에 따른 형식의 보고서를 내려주는 걸 고민하고 있다. 음.. 리포트 테이블 설계해야 되고, 애플리케이션에서 리포트 서버로 3번 요청을 해야 하는데, 비동기로 처리해야 할 것 같고, 동시성 문제 생각해야 되고, 모바일 기기에 응답 형식 정의해야 하고, 객체 설계해야 하고.. 확장 가능성 생각하고 중간중간 인터페이스도 생각해보고... 고민이 많은데 우선 파일.. 2022. 1. 26.
Spring-boot ExceptionResolver 스프링에서는 예외 처리를 상당히 깔끔하게 할 수 있는 HandlerExceptionResolver를 제공한다. 해당 인터페이스를 implements 하여 예외처리를 직접 구현하여 서블릿 컨테이너까지 전달되는 예외를 정상 처리로 변경할 수 있거나, 사용자 정의 Exception일 때 특정 에러 페이지를 렌더링 하여 클라이언트에게 전달해 줄 수 있다. @Slf4j public class UserHandlerExceptionResolver implements HandlerExceptionResolver { private final ObjectMapper objectMapper = new ObjectMapper(); @Override public ModelAndView resolveException(HttpSe.. 2022. 1. 15.
Spring-boot Error Page 기존 서블릿의 예외 처리를 보면 정말 복잡하게 예외처리를 진행했다. WebServerCustomizer를 만들고, 예외 종류에 따라서 ErrorPage를 설정하고 해당 예외를 받을 수 있는 Controller를 만들고 Filter 중에 제외해야 할 필터를 선별하여 DispatcherType을 지정해주고 Interceptor에 excludePathPatterns를 추가하여 Spring에 등록하는 과정을 거쳤다. @Component public class WebServerCustomizer implements WebServerFactoryCustomizer { @Override public void customize(ConfigurableServletWebServerFactory factory) { Erro.. 2022. 1. 13.