🌿 Spring AOP & 트랜잭션 처리 정리
⚙️ AOP (관점 지향 프로그래밍)
🧭 개념
- AOP(Aspect Oriented Programming)는 핵심 로직과 공통 로직을 분리하여 관리하는 프로그래밍 방식입니다.
- 핵심 로직은 그대로 유지하면서, 공통 기능(횡단 관심사) 을 별도의 모듈에서 관리합니다.
| 구분 | 설명 | 예시 |
|---|
| 핵심 로직 | 비즈니스 기능 담당 | 회원가입, 결제 처리 등 |
| 공통 로직 | 여러 로직에서 공통으로 사용되는 보조 기능 | 로그, 트랜잭션, 성능 측정 |
🧰 AOP 사용법
단계별 설정
| 단계 | 내용 |
|---|
| 1 | 의존성 추가 — build.gradle에 AOP 관련 라이브러리 추가 |
| 2 | AOP 클래스에 @Aspect, @Component 어노테이션 추가 |
| 3 | 공통 로직을 메서드로 정의 (Advice 실행 시점 설정) |
Advice 종류 (공통 함수 실행 시점)
| 어노테이션 | 실행 시점 | 활용 예시 |
|---|
@Before | 메소드 실행 전 | 권한 검사 |
@After | 메소드 실행 후 | 로그 기록, 리소스 해제 |
@AfterReturning | 메소드 성공 후 반환값 반환 시점 | 반환값 처리 |
@Around | 메소드 실행 전/후 모두 | 성능 측정, 트랜잭션 처리 |
🧾 execution 규칙
Aspect를 적용할 대상 메서드 지정 규칙입니다.
| 구분 | 문법 | 설명 |
|---|
| 반환 타입 지정 | execution(*) | 모든 반환 타입의 메서드 적용 |
| execution(타입) | 지정한 반환 타입에만 적용 |
| 클래스 지정 | execution(* example.AopService) | 지정한 클래스 경로 대상 |
| 메소드 지정 | execution(* AopService.*) | 해당 클래스의 모든 메소드 |
| execution(* AopService.enter(..)) | 지정한 메소드만 적용 |
| 매개변수 지정 | execution(* AopService.enter(..)) | 모든 매개변수 허용 |
| execution(* AopService.enter(타입) && args(변수명)) | 특정 매개변수 지정 |
| 반환 지정 | @AfterReturning(value="...", returning="타입명") | 반환값을 받아 사용 |
🧩 @Around 세부 예시
@Around("execution(* com.example.service.*(..))")
public Object logAround(ProceedingJoinPoint joinPoint) throws Throwable {
String method = joinPoint.getSignature().toShortString();
Object[] args = joinPoint.getArgs();
Object result = joinPoint.proceed();
return result;
}
| 메서드 | 설명 |
|---|
.getSignature() | 수행 중인 메소드의 시그니처(이름) 확인 |
.getArgs() | 메소드의 매개변수 배열을 반환 |
.proceed() | 핵심 비즈니스 로직 실행 및 결과 반환 |
🧾 주요 어노테이션 정리
| 어노테이션 | 역할 |
|---|
@Transactional | 트랜잭션 처리 (JDBC 동작 포함) |
@Log4j2 | 로그 출력 담당 (@Log4j2 클래스 선언 시 사용) |
| Spring Security 관련 | 보안 처리 담당 |
💾 트랜잭션 처리
개념
@Transactional은 지정한 메소드 또는 클래스 내의 모든 SQL 작업을 하나의 트랜잭션으로 묶어 처리합니다.
- 트랜잭션 내에서 예외가 발생하면 자동으로 rollback이 수행됩니다.
Spring 트랜잭션 기본 동작
| 항목 | 설명 |
|---|
| 제어 대상 | SQL이 포함된 메소드 또는 클래스 전체 |
| 기본 롤백 조건 | RuntimeException (실행 예외) 발생 시 자동 롤백 |
| 상위 예외 클래스 | RuntimeException |