일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 알고리즘
- transaction
- 백준
- jpa
- 인프런
- java
- 그리디
- Spring Boot
- Servlet
- JDBC
- pointcut
- SpringBoot
- Android
- 스프링 핵심 기능
- db
- kotlin
- QueryDSL
- Thymeleaf
- 스프링 핵심 원리
- 김영한
- Exception
- spring
- Proxy
- springdatajpa
- JPQL
- http
- 스프링
- 자바
- AOP
- Greedy
- Today
- Total
목록인프런 (528)
개발자되기 프로젝트
1. Annotation @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) public @interface ClassAop { } @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) //Runtime때까지 annotation유지 public @interface MethodAop { String value(); } @Target: Indicates the contexts in which an annotation type is applicable. @Retention: Indicates how long annotations with the annotated type are to be r..
애스펙트J는 포인트컷을 편리하게 표현하기 위한 특별한 표현식을 제공한다. 예) @Pointcut("execution(* hello.aop.order..*(..))") 포인트컷 표현식은 AspectJ pointcut expression 즉 애스펙트J가 제공하는 포인트컷 표현식을 줄여서 말하는 것이다 1. 포인트컷 지시자 포인트컷 표현식은 execution 같은 포인트컷 지시자(Pointcut Designator)로 시작한다. 줄여서 PCD라 한다. execution : 메소드 실행 조인 포인트를 매칭한다. 스프링 AOP에서 가장 많이 사용하고, 기능도 복잡하다. within : 특정 타입 내의 조인 포인트를 매칭한다. args : 인자가 주어진 타입의 인스턴스인 조인 포인트 this : 스프링 빈 객체(스..
어드바이스는 앞서 살펴본 @Around 외에도 여러가지 종류가 있다. 1. Advice종류 @Around : 메서드 호출 전후에 수행, 가장 강력한 어드바이스, 조인 포인트 실행 여부 선택, 반환 값 변환, 예외 변환 등이 가능 ->모든 것을 할 수 있음. @Before : 조인 포인트 실행 이전에 실행 @AfterReturning : 조인 포인트가 정상 완료후 실행 @AfterThrowing : 메서드가 예외를 던지는 경우 실행 @After : 조인 포인트가 정상 또는 예외에 관계없이 실행(finally) 2. AspectV6 @Slf4j @Aspect public class AspectV6Advice { /* //hello.aop.order 패키지와 하위 패키지이면서, 클래스 이름 패턴이 *Servi..
어드바이스는 기본적으로 순서를 보장하지 않는다. 순서를 지정하고 싶으면 @Aspect 적용 단위로 org.springframework.core.annotation.@Order 애노테이션을 적용필요. 어드바이스 단위가 아니라 클래스 단위로 적용할 수 있다는 점이다. 그래서 지금처럼 하나의 애스펙트에 여러 어드바이스가 있으면 순서를 보장 받을 수 없다. 따라서 애스펙트를 별도의 클래스로 분리해야 한다. 로그를 남기는 순서를 바꾸어서 [ doTransaction() doLog() ] 트랜잭션이 먼저 처리되고, 이후에 로그가 남도록 변경해보자. 1. AspectV5 @Slf4j public class AspectV5Order { @Aspect @Order(2) public static class LogAspec..
다음과 같이 포인트컷을 공용으로 사용하기 위해 별도의 외부 클래스에 모아두어도 된다. 참고로 외부에서 호출할 때는 포인트컷의 접근 제어자를 public 으로 열어두어야 한다. 1. Pointcuts import org.aspectj.lang.annotation.Pointcut; public class Pointcuts { //hello.aop.order 패키지와 하위 패키지 @Pointcut("execution(* hello.aop.order..*(..))") public void allOrder(){ } // pointcut signature //클래스 이름 패턴이 *Service @Pointcut("execution(* *..*Service.*(..))") public void allService()..
추가로 트랜잭션을 적용하는 코드도 추가해 보자. 기능이 동작한 것 처럼 로그만 남겨보자. 트랜잭션 기능은 보통 다음과 같이 동작한다. 핵심 로직 실행 직전에 트랜잭션을 시작 핵심 로직 실행 핵심 로직 실행에 문제가 없으면 커밋 핵심 로직 실행에 예외가 발생하면 롤백 1. AspectV3 @Slf4j @Aspect public class AspectV3 { //hello.aop.order 패키지와 하위 패키지 @Pointcut("execution(* hello.aop.order..*(..))") private void allOrder(){ } // pointcut signature //클래스 이름 패턴이 *Service @Pointcut("execution(* *..*Service.*(..))") priv..
@Around 에 포인트컷 표현식을 직접 넣을 수 도 있지만, @Pointcut 애노테이션을 사용해서 별도로 분리할 수 도 있다. 1. AspectV2 @Slf4j @Aspect public class AspectV2 { //hello.aop.order 패키지와 하위 패키지 @Pointcut("execution(* hello.aop.order..*(..))") private void allOrder(){ } // pointcut signature @Around("allOrder()") public Object doLog(ProceedingJoinPoint joinPoint) throws Throwable{ log.info("[[log] {}", joinPoint.getSignature()); return..
스프링 AOP를 구현하는 일반적인 방법은 앞서 학습한 @Aspect 를 사용하는 방법이다. 1. AspectV1 @Slf4j @Aspect public class AspectV1 { //hello.aop.order 패키지와 하위 패키지 @Around("execution(* hello.aop.order..*(..))") public Object doLog(ProceedingJoinPoint joinPoint) throws Throwable{ log.info("[[log] {}", joinPoint.getSignature()); return joinPoint.proceed(); //target호출 } } @Around 애노테이션의 값인 execution(* hello.aop.order..*(..)) 는 포인..