전체 글128 스프링 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. 객체 초기화 방식: User user = null vs User user = new User() User user = null; 과 User user = new User(); 의 차이점 User user = null;와 User user = new User();는 서로 다른 상황에서 사용된다. User user = null; 나중에 값을 할당하려는 변수를 선언할 때 변수의 초기 값이 나중에 다른 로직에서 설정될 경우 예외적인 상황을 처리하기 위해 변수를 null로 초기화할 때 예를 들어, 메서드나 블록 내에서 예외적인 조건에 따라 변수 값을 설정할 때 변수를 null로 초기화한다. 이 코드는 변수를 선언하고 초기화하지 않은(null) 상태로 둘 때 사용됩니다. 주로 다음과 같은 상황에서 사용된다 User user = new User(); 객체를 생성하고 초기화할 때 변수를 선언과 동시에 특정한 값을.. Tech/Java 2023. 10. 6. 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. Slice vs Page: 슬라이스 방식과 페이징 방식 1. 슬라이스 조회 (Slice) 특징 슬라이스 조회는 Spring Data JPA에서 제공하는 기능으로, 결과 데이터를 슬라이스(일부) 형태로 가져온다. 슬라이스는 페이지 크기와 현재 페이지 번호에 따라 정의되며, 페이지 크기에 맞게 결과 데이터를 가져온다. 슬라이스를 사용하면 일부 데이터만 로드되므로 메모리 사용을 최적화할 수 있다. Spring Data JPA의 Slice 타입을 사용하여 결과를 반환합니다. 장점 메모리 사용을 효율적으로 관리하며, 대용량 데이터셋을 다룰 때 성능을 최적화할 수 있다. 사용자 인터페이스에서 무한 스크롤과 같은 기능을 구현하는 데 적합하다. 단점 정렬 기준 및 방향을 지정하는 등 추가적 설정이 필요할 수 있다. import org.springframework.data... Tech/JPA 2023. 9. 22. 이전 1 ··· 7 8 9 10 11 다음 728x90 반응형