[Advanced-13] 스프링 AOP - 실무 주의사항
·
Spring/Core
1. 프록시와 내부 호출 - 문제1.1. 내부 호출 문제의 본질스프링 AOP는 프록시 기반으로 동작한다. 이는 AOP가 적용된 메서드를 호출할 때 항상 프록시를 거쳐서 대상 객체를 호출해야 함을 의미한다. 프록시를 거치지 않고 대상 객체를 직접 호출하면 AOP가 적용되지 않는다.문제 발생 시나리오:스프링은 AOP 적용 시 대상 객체 대신 프록시 객체를 빈으로 등록의존관계 주입 시 프록시 객체가 주입됨하지만 대상 객체의 내부 메서드 호출 시 프록시를 거치지 않고 직접 호출되는 문제 발생1.2. 예제를 통한 문제 확인1.2.1. CallServiceV0 - 내부 호출이 있는 서비스 클래스package hello.aop.internalcall;import lombok.extern.slf4j.Slf4j;impo..
[Advanced-12] 스프링 AOP - 실전 예제
·
Spring/Core
1. 예제 프로젝트 구성1.1. 실전 예제 목표이번 장에서는 지금까지 학습한 스프링 AOP 개념을 활용하여 실무에서 유용하게 사용할 수 있는 두 가지 AOP를 직접 구현해본다:로그 출력 AOP: @Trace 애노테이션을 사용하여 메서드 호출 정보를 로그로 출력재시도 AOP: @Retry 애노테이션을 사용하여 예외 발생 시 자동으로 재시도1.2. 기본 예제 프로젝트 구성1.2.1. ExamRepository - 저장소 클래스간헐적으로 실패하는 저장소를 시뮬레이션하는 클래스이다.package hello.aop.exam;import org.springframework.stereotype.Repository;@Repositorypublic class ExamRepository { // 테스트를 위한 시퀀스..
[Advanced-11] 스프링 AOP - 포인트 컷
·
Spring/Core
1. 포인트컷 지시자 개요1.1. 포인트컷 표현식이란? 포인트컷 지시자(Pointcut Designator, PCD)는 AspectJ 프레임워크에서 제공하는 특별한 표현식으로, AOP에서 어떤 조인 포인트에 어드바이스를 적용할지 선택하는 기준을 정의한다. 이전 장에서 사용한 `@Around("execution(* hello.aop.order..*(..))")`에서 execution이 바로 포인트컷 지시자이다.1.2. 주요 포인트컷 지시자 종류스프링 AOP에서 지원하는 주요 포인트컷 지시자는 다음과 같다: 지시자 설명 주요 특징 execution메소드 실행 조인 포인트를 매칭가장 많이 사용, 기능이 복잡함within특정 타입 내의 조인 포인트를 매칭타입 기반 필터링args인자가 주어진 타입의 인스턴스인..
[Advanced-10] 스프링 AOP 구현
·
Spring/Core
1. 프로젝트 생성 및 기본 설정1.1. 스프링 부트 프로젝트 생성 방법스프링 AOP를 학습하기 위한 프로젝트를 생성하는 과정이다. 스프링 부트 스타터 사이트(https://start.spring.io)를 사용하여 프로젝트를 생성한다.필요한 설정값:Project: Gradle Project (빌드 도구 선택)Language: Java (프로그래밍 언어)Spring Boot: 2.5.x (스프링 부트 버전)Project Metadata:Group: hello (프로젝트 그룹 ID)Artifact: aop (프로젝트 이름)Name: aop (프로젝트 표시 이름)Package name: hello.aop (기본 패키지명)Packaging: Jar (패키징 방식)Java: 11 (자바 버전)Dependencie..
[Advanced-9] 스프링 AOP 개념
·
Spring/Core
1. AOP 소개 - 핵심 기능과 부가 기능1.1. 애플리케이션 로직의 두 가지 측면1.1.1. 핵심 기능(Core Concerns) OrderService의 주문 로직 혹은 UserService의 사용자 관리 로직 등 비즈니스 요구사항을 직접적으로 구현한 기능을 말한다. 즉, 객체가 제공하는 고유의 본질적 기능이다.1.1.2. 부가 기능(Cross-cutting Concerns) 로그 추적, 트랜잭션 관리, 보안 검증, 캐싱, 성능 모니터링 등 핵심 기능을 보조하기 위해 제공되는 기능을 말한다. 부가 기능은 단독으로 사용되지 않고 항상 핵심 기능과 함께 사용된다.1.2. 여러 곳에서 공통으로 사용하는 부가 기능부가 기능의 중요한 특징은 여러 클래스에 걸쳐 공통으로 사용된다는 점이다. 이는 단순히 하나의..
[Advanced-8] @Aspect AOP
·
Spring/Core
1. @Aspect 프록시 - 소개1.1. @Aspect의 등장: 선언적 프로그래밍의 완성 지금까지 우리는 빈 후처리기를 통해 프록시 생성 자동화 문제를 해결했다. 하지만 여전히 어드바이저 설정 코드는 수동으로 작성해야 했다. 하지만 @Aspect의 등장으로 이 마지막 장벽도 해결할 수 있다.발전 과정 정리:1단계: 수동 프록시 생성 (문제: N개 빈 → N개 설정)2단계: 프록시 팩토리 (문제: 설정 폭발)3단계: 빈 후처리기 (해결: 자동 프록시 생성, 문제: 어드바이저 설정 필요)4단계: @Aspect (완전 해결: 선언적 AOP)1.2. 빈 후처리기 방식의 문제점빈 후처리기를 사용하면 프록시 생성은 자동화되었지만, 어드바이저 설정 코드는 여전히 수동으로 작성해야 했다.@Configurationpu..
[Advanced-7] 빈 후처리기
·
Spring/Core
1. 빈 후처리기 - 소개1.1. 스프링 빈 등록 과정의 문제점스프링에서 빈을 등록하는 방법은 크게 두 가지가 있다:@Bean 애노테이션을 사용한 수동 등록컴포넌트 스캔을 통한 자동 등록일반적인 스프링 빈 등록 과정은 다음과 같다:1. 빈 대상 객체 생성 → 2. 스프링 컨테이너에 등록 → 3. 클라이언트에서 사용하지만 프록시를 적용해야 하는 상황에서는 심각한 문제들이 발생한다:문제 1: 너무 많은 설정 (Configuration Hell)프록시 팩토리를 사용할 때의 가장 큰 문제는 각 빈마다 일일이 프록시 설정을 해야 한다는 점이다.@Configurationpublic class ProxyFactoryConfig { // OrderService 빈 등록 @Bean public Order..
[Advanced-6] 스프링 지원 프록시
·
Spring/Core
1. 프록시 팩토리 - 소개1.1. 스프링의 해결책: 통합과 추상화Q: 인터페이스가 있는 경우에는 JDK 동적 프록시를 적용하고, 그렇지 않은 경우에는 CGLIB를 적용하려면 어떻게 해야할까?A: 스프링은 유사한 구체적인 기술들이 있을 때, 그것들을 통합해서 일관성 있게 접근할 수 있고, 더욱 편리하게 사용할 수 있는 추상화된 기술을 제공한다. 스프링은 동적 프록시를 통합해서 편리하게 만들어주는 프록시 팩토리(ProxyFactory)라는 기능을 제공한다.이전 방식:// 상황에 따라 다른 기술 선택if (인터페이스가_있는가) { // JDK 동적 프록시 사용 Proxy.newProxyInstance(...);} else { // CGLIB 사용 Enhancer enhancer = ne..