분류 전체보기
-
어노테이션으로 AOP 사용스프링/스프링 AOP 2023. 9. 23. 21:25
@Trace 인터페이스 @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface Trace { } @Trace라는 어노테이션을 붙이면 자동으로 Aspect로 되어서 로그를 찍는 기능을 만들어볼 것이다. TraceAspect.class @Slf4j @Aspect public class TraceAspect { @Before("@annotation(hello.aop.exam.annotation.Trace)") public void doTrace(JoinPoint joinPoint) { Object[] args = joinPoint.getArgs(); log.info("[trace] {} args={}", joinPoin..
-
포인트컷 - execution스프링/스프링 AOP 2023. 9. 23. 17:47
execution의 매칭 조건 execution(modifiers-pattern? ret-type-pattern declaring-type-pattern?namepattern(param-pattern) throws-pattern?) 위의 코드가 포인트컷의 매칭 조건이다. ?가 붙은 것들은 생략을 할 수 있다. pointcut.setExpression("execution(public String hello.aop.member.MemberServiceImpl.hello(String))"); 아무것도 생략을 하지 않았을 때의 경우이다. 매칭 조건 - (?)가 붙은 것들은 생략 가능 접근제어자(?) : public 반환타입 : String 선언타입(?) : hello.aop.member.MemberService..
-
어드바이스 종류스프링/스프링 AOP 2023. 9. 22. 20:55
@Around : 메서드 호출 전후에 수행, 조인 포인트 실행 여부 선택, 반환 값 변환 ,예외 변환 등 가능 @Before : 조인 포인트 실행 이전에 실행 @AfterReturning : 조인 포인트가 정상 완료후 실행 @AfterThrowing : 메서드가 예외를 던지는 경우 실행 @After : 조인 포인트가 정상 또는 예외에 관계없이 실행(finally) 2. @Before @Before("hello.aop.order.aop.Pointcuts.orderAndService()") public void doBefore(JoinPoint joinPoint) { log.info("[before] {}", joinPoint.getSignature()); } @Before 어노테이션은 조인 포인트 실행 이..
-
어드바이스 순서스프링/스프링 AOP 2023. 9. 22. 20:10
@Order 어노테이션을 이용해서 순서를 줄 수 있다. 그런데 이 어노테이션은 메서드에 부여하는 것이 아니라 클래스에 부여하는 것이다. 클래스 레벨의 @Aspect에 부여되는 것이니 @Aspect 안에 있는 두 개의 메서드에 @Order()를 넣는다해도 순서가 정해지지 않는다. @Slf4j public class AspectV5Order { // hello.aop.order 패키지와 하위 패키지 @Pointcut("hello.aop.order.aop.Pointcuts.allOrder()") // 포인트컷 private void allOrder(){} // 클래스 이름 패턴이 *Service @Pointcut("hello.aop.order.aop.Pointcuts.orderAndService()") pri..
-
@Pointcut - 포인트컷 분리스프링/스프링 AOP 2023. 9. 22. 14:36
AOP 동작을 위한 service, repository 코드 OrderRepository.class @Slf4j @Repository public class OrderRepository { public String save(String itemId) { log.info("[orderRepository] 실행"); //저장 로직 if (itemId.equals("ex")) { throw new IllegalStateException("예외 발생!"); } return "ok"; } } OrderService.class @Slf4j @Service public class OrderService { private final OrderRepository orderRepository; public OrderSer..
-
@Aspect 프록시스프링/스프링 AOP 2023. 9. 20. 12:57
이전까지 만들었던 포인트컷과 어드바이스를 어노테이션 하나로 만들 수 있다. @Slf4j @Aspect public class LogTraceAspect { private final LogTrace logTrace; public LogTraceAspect(LogTrace logTrace) { this.logTrace = logTrace; } @Around("execution(* hello.proxy.app..*(..))") // 이 부분이 포인트컷 public Object execute(ProceedingJoinPoint joinPoint) throws Throwable { // 여기 advice 로직이 들어감 TraceStatus status = null; try { String message = joi..
-
join fetch와 left join fetch의 차이프로젝트/Trend-Pick 2023. 9. 18. 22:11
쿼리를 최적화할 때 join fetch를 사용해서 최적화했다. 배포를 완료하고 테스트 하는데 계속해서 내가 올린 사진, 게시글들이 마이페이지에 올라오지 않는 문제점이 발생했다. 이 문제로 거의 일주일동안 고민했다. 내가 고친 것이라고는 fetch join으로 성능 최적화를 한 것밖에 없는데.. 중간에 네트워크에서 오류가 생겼나? 데이터에 에러가 나고있나? 라는 생각들이 들었다. 결국 처음으로 돌아와서 repository 계층에 있는 쿼리문에서 하나하나 조건을 빼가며 테스트를 해보았다. public List MyPagePicture(Long memberId) { return em.createQuery("select p from Picture p join fetch p.likes l " + "where p...
-
빈 후처리기스프링/스프링 AOP 2023. 9. 17. 22:13
빈 후처리기란? 빈 후처리기는 빈을 조작하고 변경할 수 있는 기능이다. 빈 객체를 조작하거나 다른 객체로 바꿔 버릴정도로 강력한 기능이다. 일반적으로 스프링 컨테이너가 등록하는 빈들, 특히 컴포넌트 스캔의 대상이 되어서 의존관계 주입이 자동으로 이루어지는 빈들은 중간에 조작할 방법이 없는데, 빈 후처리기를 사용하면 개발자가 등록하는 모든 빈을 중간에 조작할 수 있다. 즉, 빈 객체를 프록시로 교체하는 것도 가능하다는 뜻이다. 스프링에서 지원하는 빈 후처리기 기능을 알아볼 것이다. build.gradle에 추가 implementation 'org.springframework.boot:spring-boot-starter-aop' 위의 코드를 build.gradle에 추가하면 스프링 자동 빈 후처리가 스프링으..