본문 바로가기

개발Blog/웹개발(Spring)

[웹개발/spring] AOP 란 무엇인가 ?

반응형

AOP (Aspect-Oriented Programming)이란?

안녕하세요, 개발자 여러분! 😊 오늘은 개발을 하다 보면 꼭 한 번은 들어보게 되는 "AOP"에 대해 쉽게 설명해드릴게요. 복잡하게 느껴질 수 있지만, 알고 나면 "왜 이제야 알았지?" 싶을 정도로 유용한 개념이에요.


AOP는 뭐냐고요?

우리가 코드를 작성하다 보면 이런 상황을 자주 만나게 돼요:

  • "로그를 남겨야 하는데, 모든 메서드에 logger.info()를 넣는 건 너무 귀찮아!"
  • "사용자 권한 검사를 모든 컨트롤러에서 일일이 해야 하나?"
  • "트랜잭션 관리를 어떻게 하면 깔끔하게 처리할 수 있을까?"

이런 문제를 해결하기 위해 태어난 개념이 바로 AOP예요! 쉽게 말해 **"코드의 핵심 로직과 부가적인 작업을 깔끔하게 분리하는 방법"**이라고 할 수 있어요.
핵심 비즈니스 로직은 그대로 두고, 그 주변에서 동작하는 작업(예: 로그 기록, 권한 체크 등)을 따로 관리할 수 있죠.


왜 AOP가 필요한가요?

1. 중복 코드 제거

AOP를 사용하면 비슷한 기능(예: 로깅, 보안 검사)을 여러 클래스에서 반복적으로 작성할 필요가 없어요.
코드를 한 곳에서 관리하니 훨씬 깔끔해요!

2. 가독성 향상

핵심 로직만 남기고 부가적인 작업은 다른 곳으로 분리하면, 코드가 훨씬 읽기 좋아져요. "이 클래스는 어떤 일을 하는지" 명확히 보이니까요.

3. 유지보수 편리

부가 작업을 수정해야 할 때, 여러 곳을 찾아다니며 수정할 필요가 없어요. AOP로 처리하면 한 곳만 수정하면 끝!


AOP의 주요 개념

AOP를 이해하려면 몇 가지 용어를 알아야 해요:

1. Aspect (관점)

Aspect는 부가적인 기능 자체를 의미해요.

예를 들어 "로그 남기기"나 "트랜잭션 처리" 같은 게 될 수 있죠.

2. Advice (조언)

Aspect가 실제로 언제, 어떻게 동작할지 정의하는 부분이에요.
Advice에는 아래와 같은 종류가 있어요:

  • Before: 메서드 실행 전에 실행
  • After: 메서드 실행 후에 실행
  • Around: 메서드 실행 전후에 모두 실행

3. Join Point (결합 지점)

Advice가 적용될 수 있는 모든 지점을 말해요.
예를 들어, 메서드 실행, 예외 발생 등이 Join Point에 해당해요.

4. Pointcut (포인트컷)

Join Point 중에서 특정 조건을 만족하는 지점을 선택하는 거예요.
"이 메서드에만 Advice를 적용해라" 같은 조건을 설정할 수 있어요.


AOP는 어떻게 작동할까?

쉽게 설명하려고 간단한 예를 들어볼게요.

1. 로그 기록하기

"사용자가 특정 메서드를 호출했을 때, 호출 시각과 파라미터를 기록하고 싶다!"라는 요구사항이 있다고 가정해볼게요.

AOP 없이 구현하면, 모든 메서드에 아래와 같은 코드를 추가해야겠죠:

public void exampleMethod(String param) {
    logger.info("exampleMethod 호출됨 - 파라미터: " + param);
    // 실제 로직
}

 

하지만 AOP를 사용하면 이렇게 바뀝니다:

    1. 핵심 로직은 그대로 둡니다:
public void exampleMethod(String param) {
    // 실제 로직
}

 

          2. 부가 작업은 AOP로 처리:

@Aspect
@Component
public class LoggingAspect {

    @Before("execution(* com.example.service.*.*(..))")
    public void logBefore(JoinPoint joinPoint) {
        logger.info(joinPoint.getSignature().getName() + " 호출됨");
    }
}

이제 로깅은 LoggingAspect에서 처리하니까, 실제 로직은 깔끔하게 유지되죠!


Spring에서의 AOP

Spring에서는 AOP를 지원하기 위한 강력한 도구를 제공해요.
대표적으로
@Aspect@EnableAspectJAutoProxy 어노테이션을 활용합니다.

AOP 설정하기

  1. 의존성 추가 (Gradle 예):
implementation 'org.springframework.boot:spring-boot-starter-aop'

   

    2. Aspect 클래스 작성:

@Aspect
@Component
public class ExampleAspect {

    @Around("execution(* com.example..*(..))")
    public Object aroundAdvice(ProceedingJoinPoint joinPoint) throws Throwable {
        long start = System.currentTimeMillis();
        Object result = joinPoint.proceed();
        long end = System.currentTimeMillis();
        logger.info("Execution time: " + (end - start) + "ms");
        return result;
    }
}

 

    3. AOP 활성화

@Configuration
@EnableAspectJAutoProxy
public class AppConfig {
}

마무리

AOP는 처음엔 생소할 수 있지만, 한 번 익숙해지면 개발 속도를 높이고 코드를 더 깔끔하게 유지하는 데 큰 도움을 줘요. 특히 로깅, 보안, 트랜잭션 처리 등 공통 작업을 효율적으로 처리하고 싶다면 꼭 한 번 써보세요!