일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Servlet
- http
- JPQL
- 자바
- 인프런
- transaction
- 그리디
- jpa
- QueryDSL
- Proxy
- JDBC
- Greedy
- 김영한
- Exception
- 스프링 핵심 기능
- Thymeleaf
- java
- 알고리즘
- Spring Boot
- 스프링 핵심 원리
- 스프링
- 백준
- SpringBoot
- AOP
- Android
- pointcut
- db
- spring
- kotlin
- springdatajpa
- Today
- Total
목록spring (109)
개발자되기 프로젝트
JDK 동적 프록시와 CGLIB를 사용해서 AOP 프록시를 만드는 방법에는 각각 장단점이 있다. JDK 동적 프록시는 인터페이스가 필수이고, 인터페이스를 기반으로 프록시를 생성한다. CGLIB는 구체 클래스를 기반으로 프록시를 생성한다. 물론 인터페이스가 없고 구체 클래스만 있는 경우에는 CGLIB를 사용해야 한다. 그런데 인터페이스가 있는 경우에는 JDK 동적 프록시나 CGLIB 둘중에 하나를 선택할 수 있다. 스프링이 프록시를 만들때 제공하는 ProxyFactory 에 proxyTargetClass 옵션에 따라 둘중 하나를 선택해서 프록시를 만들 수 있다. proxyTargetClass=false --> JDK 동적 프록시를 사용해서 인터페이스 기반 프록시 생성 proxyTargetClass=true..
앞서 생성자 주입이 실패하는 이유는 자기 자신을 생성하면서 주입해야 하기 때문이다. 이 경우 수정자 주입을 사용하거나 지금부터 설명하는 지연 조회를 사용하면 된다. 스프링 빈을 지연해서 조회하면 되는데, ObjectProvider(Provider) , ApplicationContext 를 사용 1. ApplicationContext @Slf4j @Component public class CallServiceV2 { private final ApplicationContext applicationContext; public CallServiceV2(ApplicationContext applicationContext) { this.applicationContext = applicationContext; } p..
내부 호출을 해결하는 가장 간단한 방법은 자기 자신을 의존관계 주입 받는 것. 오? 1. 자기 자신 주입 @Slf4j @Component public class CallServiceV1 { private CallServiceV1 callServiceV1; /** * 생성자 주입은 순환 사이클을 만들기 때문에 실패한다. * 수정자(setter) 주입도 스프링 부트 2.6붙 막힘 --> 순환참조 금지 * 순환참조를 해결하기 위해 application.properties에 아래 파일 추가 * spring.main.allow-circular-references=true */ @Autowired public void setCallServiceV1(CallServiceV1 callServiceV1) { this.c..
@Retry 애노테이션이 있으면 예외가 발생했을 때 다시 시도해서 문제를 복구한다. 1. @Retry Retry방식을 사용할 때 항상 재시도 횟수가 정해져 있어야 함. @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface Retry { int value() default 3; //Retry는 항상 재시도 횟수가 있어야함.. } 2. RetryAspect @Slf4j @Aspect public class RetryAspect { /* @Around("@annotation(hello.aop.exam.annotation.Retry)") public Object doRetry(ProceedingJoinPoint join..
1. bean 스프링 전용 포인트컷 지시자, 빈의 이름으로 지정한다 스프링 빈의 이름으로 AOP 적용 여부를 지정한다. bean(orderService) || bean(*Repository) * 과 같은 패턴을 사용할 수 있다. 2. Test @Slf4j @Service public class OrderService { private final OrderRepository orderRepository; public OrderService(OrderRepository orderRepository) { this.orderRepository = orderRepository; } public void orderItem(String itemId) { log.info("[orderService] 실행"); orde..
1. 타입 매칭 - 부모 타입 허용 @Test void typeExactMatch(){ pointcut.setExpression("execution(* hello.aop.member.MemberServiceImpl.*(..))"); assertThat(pointcut.matches(helloMethod, MemberServiceImpl.class)).isTrue(); } @Test void typeMatchSuperType(){ pointcut.setExpression("execution(* hello.aop.member.MemberService.*(..))"); assertThat(pointcut.matches(helloMethod, MemberServiceImpl.class)).isTrue(); } ..
스프링 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..*(..)) 는 포인..
1. 조인 포인트(Join point) 어드바이스가 적용될 수 있는 위치, 메소드 실행, 생성자 호출, 필드 값 접근, static 메서드 접근 같은 프로그램 실행 중 지점 조인 포인트는 추상적인 개념이다. AOP를 적용할 수 있는 모든 지점이라 생각하면 된다. 스프링 AOP는 프록시 방식을 사용하므로 조인 포인트는 항상 메소드 실행 지점으로 제한된다. 2. 포인트 컷(Pointcut) 조인 포인트 중에서 어드바이스가 적용될 위치를 선별하는 기능 주로 AspectJ 표현식을 사용해서 지정 프록시를 사용하는 스프링 AOP는 메서드 실행 지점만 포인트컷으로 선별 가능 3.타겟(Target) 어드바이스를 받는 객체, 포인트컷으로 결정 4. 어드바이스(Advice) 부가 기능 특정 조인 포인트에서 Aspect에..