Tech/Spring40 스프링 AOP - 프록시와 내부 호출 대안(2) 지연 조회 자기 자신을 생성하면서 주입해야해서 실패한다. 수정자 주입이나 지연 조회 사용 스프링 빈 지연해서 조회 → ObjectProvider(Provider), ApplicationContext 사용 @Slf4j @Component public class CallServiceV2 { private final ApplicationContext applicationContext; public CallServiceV2(ApplicationContext applicationContext) { this.applicationContext = applicationContext; } public void external() { log.info("call external"); CallServiceV2 callServiceV2 .. Tech/Spring 2023. 11. 10. 스프링 AOP - 프록시와 내부 호출 대안(1) 자기 자신 주입 내부 호출을 해결하는 가장 간단한 방법은 자기 자신을 의존관계 주입받는 것이다. @Autowired public void setCallServiceV1(CallServiceV1 callServiceV1) { this.callServiceV1 = callServiceV1; } 수정자를 통해 주입을 받는 것을 확인할 수 있다. 스프링에서 AOP가 적용된 대상을 의존관계 주입 받으면 주입 받은 대상은 실제 자신이 아니라 프록시 객체이다. /** * 참고: 생성자 주입은 순환 사이클을 만들기 때문에 실패함 */ @Slf4j @Component public class CallServiceV1 { private CallServiceV1 callServiceV1; @Autowired public void setCal.. Tech/Spring 2023. 11. 7. 스프링 AOP - 프록시와 내부 호출 문제 1. 문제점 스프링은 프록시 방식의 AOP를 사용하는데 이때 AOP를 적용하려면 항상 프록시를 통해서 대상 객체를 호출해야한다. 프록시에서 먼저 어드바이스를 호출하고 이후에 대상 객체를 호출한다. 만약 프록시를 거치지 않고 대상 객체를 직접 호출하게 되면 AOP가 적용되지 않고 어드바이스도 호출되지 않는다. AOP를 적용하면 스프링은 대상 객체 대신 프록시를 스프링 빈으로 등록한다. 따라서 스프링은 의존관계 주입 시에 항상 프록시 객체를 주입한다. 하지만 대상 객체의 내부에서 메서드 호출이 발생하면 프록시를 거치지 않고 대상 객체를 직접 호출하는 문제가 발생한다. 예시를 통해 알아보자 @Slf4j @Aspect public class CallLogAspect { @Before("execution(* he.. Tech/Spring 2023. 11. 3. 스프링 AOP - this VS target this: 스프링 빈 객체(스프링 AOP 프록시)를 대상으로 하는 조인 포인트 target: Target 객체(스프링 AOP 프록시가 가르키는 실제 대상)를 대상으로 하는 조인 포인트 둘 다 적용 타입 하나를 정확하게 지정해야 한다. 같은 패턴 사용 불가 부모 타입 허용 this vs target 단순히 타입 하나를 정하면 되는데, this와 target은 어떤 차이가 있을까? 스프링에서 AOP 적용하면 실제 target 객체 대신 프록시 객체가 스프링 빈으로 등록된다. this는 스프링 빈으로 등록되어있는 프록시 객체를 대상으로 포인트컷을 매칭한다. target은 실제 target 객체를 대상으로 포인트컷을 매칭한다. 프록시 생성 방식에 따른 차이 스프링은 프록시를 생성할 때 JDK 동적 프록시와 CG.. Tech/Spring 2023. 10. 27. 스프링 AOP - 매개변수 전달 매개변수 전달 포인트컷 표현식을 사용해서 어드바이스에 매개변수 전달할 수 있다. this., target, args, @target, @within, @annotation, @args 포인트컷 이름과 매개변수의 이름을 맞춰야한다. 추가로 타입이 메서드에 지정한 타입으로 제한된다. 1. 가장 기본적인 방식 @Around("allMember()") public Object logArgs1(ProceedingJoinPoint joinPoint) throws Throwable { Object arg1 = joinPoint.getArgs()[0]; log.info("[logArgs1]{}, arg={}", joinPoint.getSignature(), arg1); return joinPoint.proceed();.. Tech/Spring 2023. 10. 25. 스프링 AOP - 어드바이스 종류 Advice 종류 @Around 메서드 호출 전후에 수행 가장 강력한 어드바이스 join point 실행 여부 선택 반환 값 변환 예외 변환 등 가능 → 다 할 수 있음 @Before join point 실행 이전에 실행 @AfterReturning join point가 정상 완료 후 실행 @AfterThrowing 메서드가 예외를 던지는 경우 실행 @After join point가 정상 또는 예외에 관계 없이 실행 (finally) @Before("hello.aop.order.aop.Pointcuts.orderAndService()") public void doBefore(JoinPoint joinPoint) { log.info("[before] {}", joinPoint.getSignature());.. Tech/Spring 2023. 10. 20. AOP 용어 정리 조인 포인트(Join point) 어드바이스가 적용될 수 있는 위치, 메소드 실행, 생성자 호출, 필드 값 접근, static 메서드 접근 같은 프로그램 실행 중 지점 조인 포인트는 추상적인 개념이다. AOP를 적용할 수 있는 모든 지점이라 생각하면 된다. 스프링 AOP는 프록시 방식을 사용하므로 조인 포인트는 항상 메소드 실행 지점으로 제한된다. 포인트컷(Pointcut) 조인 포인트 중에서 어드바이스가 적용될 위치를 선별하는 기능 주로 AspectJ 표현식을 사용해서 지정 프록시를 사용하는 스프링 AOP는 메서드 실행 지점만 포인트컷으로 선별 가능 타켓(Target) 어드바이스를 받는 객체, 포인트컷으로 결정 어드바이스(Advice) 부가 기능 특정 조인 포인트에서 Aspect에 의해 취해지는 조치 .. Tech/Spring 2023. 10. 18. AOP 적용 방식 AOP를 사용할 때 부가 기능 로직은 어떤 방식으로 실제 로직에 추가될 수 있을까? 1. 컴파일 시점 .java → .class 이 시점에 부가 기능 로직 추가 가능 AspectJ 컴파일러는 Aspect를 확인해서 해당 클래스가 적용 대상인지 먼저 확인하고, 적용 대상인 경우 부가 기능 로직을 적용한다. 위빙(Weaving): 애스펙트와 실제 코드를 연결해서 붙이는 것 (원본 로직에 부가 기능 로직 추가) 단점: 특별한 컴파일러도 필요하고 복잡하다. 2. 클래스 로딩 시점 .class 파일을 JVM 내부 클래스 로더에 보관할 때 이 .class 파일을 조작한 다음 JVM에 올릴 수 있다. 로드 타임 위빙 단점: 자바 실행할 때 특별한 옵션(java -javaagent)을 통해 클래스 로더 조작기를 지정해.. Tech/Spring 2023. 10. 16. Spring Security - Failure Handler 공식적인 설명은 아래와 같다. - 실패한 인증 시도를 처리하는 데 사용되는 전략입니다. - 일반적인 동작은 사용자를 인증 페이지로 리디렉션하는 것일 수 있습니다(이 경우 양식 로그인)을 사용하여 다시 시도할 수 있습니다. 더 정교한 논리는 - 예외 유형에 따라 구현됩니다. Spring Security FailureHandler 로그인 실패 핸들러의 경우 onAuthenticationFailure 메소드로 인증 시도가 실패할 때 호출된다. 메소드의 인자에서 AuthenticationException 예외의 종류로는 아래와 같다. BadCredentialsException : 비밀번호불일치 UsernameNotFoundException : 계정없음 AccountExpiredException : 계정만료 Cr.. Tech/Spring 2023. 10. 11. Spring Security 예외 처리 스프링 시큐리티로 로그인을 구현하던 중 예외 처리에 대한 이슈가 있었다. AOP를 통해 공통 관리를 해주려고 했으나 기대했던대로 처리가 되지 않았다. import org.springframework.ui.Model; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; @ControllerAdvice public class AdminExceptionHandler { @ExceptionHandler(AcceptAdminException.class) public String handleAcceptAdminException(Accep.. Tech/Spring 2023. 10. 4. 사용자 정의 어노테이션 VS @Pattern 사용자 정의 어노테이션 1. 유연성 및 맞춤화: 사용자 정의 주석은 특정 요구 사항에 따라 동작 및 유효성 검사 규칙을 정의하므로 높은 수준의 유연성과 사용자 정의를 제공한다. 2. 복잡한 검증 논리: 사용자 정의 주석은 단순한 패턴 일치를 넘어 복잡한 검증 논리를 처리할 수 있다. 사용자 정의 주석을 사용하여 필드 간 유효성 검사 또는 비즈니스 규칙 확인과 같은 사용자 정의 유효성 검사 논리를 구현할 수 있다. 3. 코드 가독성 및 재사용성: 사용자 정의 주석은 이름이 잘 지정된 주석에 유효성 검사 규칙을 캡슐화하여 코드 가독성과 재사용성을 향상시킬 수 있다. 이렇게 하면 코드를 보다 자체적으로 문서화하고 유지 관리하기 쉽게 만들 수 있다. 4. 사용 제어: 사용자 정의 주석을 적용하는 위치와 방법을 .. Tech/Spring 2023. 9. 26. @Target @Target @Target 어노테이션은 Java 어노테이션을 어떤 요소(Element)에 적용할 수 있는지를 지정하는데 사용된다. @Target 어노테이션은 어떤 종류의 Java 요소에 어노테이션을 적용할 수 있는지를 나타내는 열거형 상수(ElementType) 배열을 값으로 가진다. 여기서 ElementType.TYPE은 어노테이션을 클래스, 인터페이스, 열거형(enum) 등의 타입 선언에 적용할 수 있음을 나타낸다. ElementType 종류 @Target 어노테이션은 다양한 ElementType 상수와 함께 사용될 수 있으며, 주요 ElementType 상수는 다음과 같다: ElementType.TYPE: 클래스, 인터페이스, 열거형(enum) 등의 타입 선언에 어노테이션을 적용할 수 있음을 나타.. Tech/Spring 2023. 9. 21. 이전 1 2 3 4 다음 728x90 반응형