AOP (Aspect-Oriented Programming, 관점 지향 프로그래밍)
AOP는 비즈니스 로직과 공통 관심사(횡단 관심사, Cross-Cutting Concerns)를 분리하여 코드를 효율적으로 관리할 수 있도록 해주는 프로그래밍 패러다임입니다.
AOP의 주요 개념
- 횡단 관심사 (Cross-Cutting Concerns)
- 애플리케이션 전반에 걸쳐 반복적으로 사용되는 공통 기능.
- 예: 로깅, 보안, 트랜잭션 관리, 예외 처리.
- 비즈니스 로직과의 분리
- AOP를 사용하면 로직 코드에 공통 기능을 직접 작성하지 않고, 분리된 모듈(Aspect)로 관리 가능.
- 이는 유지보수성과 코드의 가독성을 향상시킵니다.
AOP가 필요한 이유 (왜 쓰는가?)
- 코드 중복 제거
반복적으로 작성되는 로직(예: 로그 출력)을 별도의 모듈로 분리. - 유지보수성 향상
비즈니스 로직에 공통 기능 코드가 섞이지 않아 수정이 용이. - 애플리케이션의 모듈화 강화
주요 기능(로깅, 보안 등)을 독립적인 단위로 관리.
실습 코드에서는 Gradle 빌드 스크립트(build.gradle)에서 사용하는 의존성 선언을 다음과같이 추가해주었다.
implementation 'org.springframework.boot:spring-boot-starter-aop'
spring-boot-starter-aop는 Spring Boot에서 제공하는 "Starter" 의존성 중 하나입니다. Starter 의존성은 특정 기능을 사용하기 위해 필요한 여러 의존성들을 묶어서 제공함으로써, 개발자가 필요한 의존성을 일일이 추가해야 하는 번거로움을 줄여줍니다. spring-boot-starter-aop는 다음과 같은 기능과 관련된 라이브러리들을 포함하고 있습니다.
이 의존성을 추가하는 것 외에도, Spring Boot 애플리케이션에서 AOP를 사용하기 위해서는 @EnableAspectJAutoProxy 어노테이션을 설정 클래스에 추가해야 합니다. 이 어노테이션은 Spring에게 AOP 프록시를 생성하도록 지시합니다. 예를 들어 다음과 같습니다.
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
@SpringBootApplication
@EnableAspectJAutoProxy // AOP 활성화
public class AopexamApplication {
public static void main(String[] args) {
SpringApplication.run(AopexamApplication.class, args);
}
}
이 두 가지 (의존성 추가 및 @EnableAspectJAutoProxy 어노테이션 추가)를 모두 완료해야 Spring Boot에서 AOP를 정상적으로 사용할 수 있습니다.
GPT에서 추천해준 깃연습코드
https://github.com/NomadHuns/aop-practice
GitHub - NomadHuns/aop-practice
Contribute to NomadHuns/aop-practice development by creating an account on GitHub.
github.com
나머지는 팀원분이 잘 정리 하셔서 태그.
250121 TIL | AOP
💬 AOP(Aspect oriented Programming, 관점지향 프로그래밍) 프로그램에서 핵심 로직과 부수 로직(DB 연결, 로깅, 파일 입출력 등)을 분리해 모듈화하는 방식그림 1을 통해 설명하자면, 각각의 클래스에서
code-with-fish.tistory.com
AOP의 주요 구성 요소
- Aspect
- 공통 관심사를 캡슐화한 모듈.
- 예: 로깅, 트랜잭션 처리.
- Advice
- Aspect의 실제 동작 코드. 특정 시점(Join Point)에서 실행.
- 종류:
- Before: 메서드 실행 전에 실행.
- After: 메서드 실행 후에 실행.
- Around: 메서드 실행 전후에 모두 실행.
- AfterReturning: 메서드가 정상적으로 실행된 후 실행.
- AfterThrowing: 메서드 실행 중 예외가 발생하면 실행.
- Join Point
- Advice가 실행될 수 있는 특정 실행 지점.
- 예: 메서드 호출, 필드 접근.
- Pointcut
- Advice가 적용될 Join Point를 결정하는 표현식.
- Weaving
- Aspect를 실제 코드에 적용하는 과정.
- 스프링에서는 런타임 시 Weaving을 지원.
AOP 적용 예시 (스프링)
@Aspect
@Component
public class LoggingAspect {
// Pointcut 정의: com.example.service 패키지의 모든 메서드
@Pointcut("execution(* com.example.service..*(..))")
public void allServiceMethods() {}
// Before Advice
@Before("allServiceMethods()")
public void logBeforeMethod(JoinPoint joinPoint) {
System.out.println("Method Start: " + joinPoint.getSignature());
}
// After Advice
@After("allServiceMethods()")
public void logAfterMethod(JoinPoint joinPoint) {
System.out.println("Method End: " + joinPoint.getSignature());
}
}
결과:
- com.example.service 패키지의 모든 메서드 호출 전에 "Method Start" 로그 출력.
- 메서드 호출 후 "Method End" 로그 출력.
AOP의 장점
- 코드 중복 제거: 로깅, 트랜잭션 처리 등 공통 로직을 분리하여 중복 제거.
- 유지보수 용이: 공통 관심사만 수정하면 전체 애플리케이션에 반영 가능.
- 가독성 향상: 비즈니스 로직과 공통 로직이 분리되므로 가독성이 좋아짐.
비유를 통한 이해
- AOP는 프로그램 전체에서 반복적으로 필요한 일을 "하인"처럼 처리하는 방식입니다.
- 집안일(로깅, 트랜잭션 관리)은 하인(AOP)가 하고, 주인은 비즈니스 로직만 신경 쓰면 되는 구조입니다.
스프링 AOP를 활용하면 애플리케이션의 로깅, 트랜잭션 처리, 보안 등을 효율적으로 관리할 수 있습니다.
'멋쟁이사자처럼_부트캠프 > Spring' 카테고리의 다른 글
[멋쟁이사자처럼 부트캠프 TIL 회고] 백엔드 부트캠프 13기: Java 41일차 웹 프로그램 실습-1 (1) | 2025.02.07 |
---|---|
[멋쟁이사자처럼 부트캠프 TIL 회고] 백엔드 부트캠프 13기: Java 40일차 스트림 (0) | 2025.02.06 |
[멋쟁이사자처럼 부트캠프 TIL 회고] 백엔드 부트캠프 13기: Java 37일차 쿠키, 세션 그리고 토큰 (2) | 2025.02.03 |
[멋쟁이사자처럼 부트캠프 TIL 회고] 백엔드 부트캠프 13기: Java 32일차 Spring 2 (0) | 2025.01.20 |
[멋쟁이사자처럼 부트캠프 TIL 회고] 백엔드 부트캠프 13기: Java 30일차 Spring (1) | 2025.01.16 |