Java

[Java] AOP

Castle Bird 2025. 12. 24. 10:09

1. AOP란?

AOP(Aspect Oriented Programming = 관점 지향 프로그래밍)는 기능을 '핵심 로직''공통 기능'으로 분리하여 관리하는 프로그래밍 패러다임입니다. '관점'이라는 추상적인 단어는 실무적으로 다음과 같이 이해할 수 있습니다.

 

Aspect(관점 → 공통 관심사): 여러 모듈에서 공통적으로 필요로 하는 부가 기능 그 자체를 의미합니다.

(예: 로깅, 보안 검사, 트랜잭션 관리)

 

핵심관점과 횡단관점의 구별 이미지 / 출처: ohgiraffers의 owl강사님

 

  1. 핵심 관점(Primary Concern): 로그인, 검색, 게시판 서비스는 개별 구분이 되어 있고 비즈니스의 본질적인 기능을 담당하는 영역입니다. 상 → 하로 실행되는 독립적인 수직 구조를 가집니다.
  2. 횡단 관점(Cross-cutting Concern): 로깅(Logging), 보안(Security), 트랜잭션과 같이 모든 핵심 관점에 공통적으로 적용되어야 하는 기능입니다.
  3. 코드의 분리와 삽입: AOP는 각 서비스에 있는 중복 코드를 횡단 관점으로 따로 추출합니다. 이렇게 분리된 공통 기능은 설정에 따라 모든 핵심 관점의 적절한 지점에 끼워져 실행됩니다.

결론적으로 AOP를 사용하면 개발자는 핵심 비즈니스 로직에만 집중할 수 있으며, 공통 기능의 수정이 필요할 때 해당 Aspect만 변경하면 되므로 유지보수 효율성이 극대화됩니다.

 

 


2. AOP를 왜 사용할까?

AOP를 적용 전.

@Service
public class MemberService {

    private final MemberRepository memberRepository;

    public MemberService(MemberRepository memberRepository) {
        this.memberRepository = memberRepository;
    }

    public void join(Member member) {
        long start = System.currentTimeMillis();

        try {
            // 핵심 로직
            memberRepository.save(member);
        } finally {
            long end = System.currentTimeMillis();
            long time = end - start;
            System.out.println("MemberService.join 실행 시간 = " + time + "ms");
        }
    }
}
  • 핵심 로직과 부가 로직이 하나의 소스 코드 파일에 섞인 상태.
  • join() 메서드는 핵심 로직(member 저장) 외에도 실행 시간 측정 코드가 섞여 있음.
  • 해당 로직이 여러 메서드나 클래스에 반복되면 중복 증가 → 유지보수 어려움.

 

AOP를 적용 후.

// 핵심 로직 클래스
@Service
public class MemberService {

    private final MemberRepository memberRepository;

    public MemberService(MemberRepository memberRepository) {
        this.memberRepository = memberRepository;
    }

    public void join(Member member) {
        memberRepository.save(member);
    }
}
// 공통 기능(여기서는 로깅 기능)만 분리
@Aspect
@Component
public class TimeTraceAspect {

    @Around("execution(* com.example..*(..))")
    public Object trace(ProceedingJoinPoint joinPoint) throws Throwable {
        long start = System.currentTimeMillis();

        try {
            return joinPoint.proceed(); // 실제 핵심 로직 메서드 실행
        } finally {
            long end = System.currentTimeMillis();
            long time = end - start;
            System.out.println("[실행 시간] " + joinPoint.getSignature() + " = " + time + "ms");
        }
    }
}
  • 핵심 로직과 부가 로직을 완전히 분리할 수 있음.
  • 공통 기능은 한 곳에서 관리되기 때문에 유지보수와 확장성이 크게 향상됨.

AOP 사용 전,후차이 / 출처: ohgiraffers의 owl강사님

 

 


3.AOP 용어

용어 정의 및 핵심 역할 비유 
Aspect 여러 객체에 공통으로 적용되는 기능 그 자체입니다.
Advice와 Pointcut을 합친 개념입니다.
공통 기능 꾸러미
Join Point 프로그램 실행 흐름 내에서 Advice가 적용될 수 있는 모든 지점입니다. (메서드 호출, 필드 값 변경 등) 잠재적 설치 가능 지역
Advice 특정 Join Point에서 실제로 수행될 공통 로직입니다.
(언제 무엇을 할 것인가)
실제로 수행할 작업 내용
Pointcut Join Point 중에서 실제로 Advice를 적용할 지점을 선별하는 규칙입니다. 타겟을 정하는 필터/조준경
Weaving Aspect(부가 기능)를 핵심 로직(대상 객체)에 연결하여 적용하는 과정입니다. 핵심 로직에 부가 기능을 조립하기

 

 


4.AOP 활용 사례

AOP를 활용한 실제 사례를 알아보자.
위에서 예시로 든 것처럼 크게 로킹, 보안 등이 있다.

3-1. 로깅 기능

운영 중인 서비스가 느려졌을 때, 어떤 메서드에서 병목이 발생하는지 전수 조사해야 하는 상황.

  • AOP 적용 전: 모든 Controller의 메서드 시작과 끝에 System.currentTimeMillis()를 넣고 빼야 합니다. 대상 메서드가 100개라면 200줄의 중복 코드가 발생합니다.
  • AOP 적용 후: 실행 시간 측정 기능을 가진 Aspect를 생성하고, 모든 @RestControllerPointcut으로 지정합니다. 단 몇 줄의 설정으로 전 서비스의 성능 지표를 수집할 수 있습니다.

3-2. 사용자 권한 및 세션 검증 (보안)

금융 앱이나 사내 시스템처럼 메뉴별로 접근 권한(ADMIN, USER 등)이 철저히 분리되어야 하는 경우입니다

  • AOP 적용 전: 게시글 삭제, 사용자 차단 등 중요 로직마다 현재 로그인한 사용자의 권한을 체크하는 if문이 비즈니스 로직과 섞여 유지보수가 어려워집니다.
  • AOP 적용 후: Custom Annotation을 만들고, 이 어노테이션이 붙은 메서드 실행 직전(Before)에 권한 검사를 수행하는 AOP를 적용합니다.

'Java' 카테고리의 다른 글

[Java] @RestController와 HttpMassageConverter  (0) 2026.01.04
[Java] @Controller 와 @RestController  (0) 2025.12.26
[Java] Spring Boot에서 Bean 등록하는 법  (0) 2025.12.21
[Java] 웹 서버와 WAS  (0) 2025.12.19
[Java] CORS와 CSRF의 차이  (0) 2025.12.14