AOP란?

AOP (Aspect-Oriented Programming, 관점 지향 프로그래밍)은 프로그램의 핵심 비즈니스 로직과는 별개로 공통 관심사(cross-cutting concerns)를 분리하여 모듈화하는 프로그래밍 패러다임이다.

주로 반복적으로 사용되는 기능(예: 로깅, 보안, 트랜잭션 관리 등)을 핵심 로직에서 분리하여, 코드의 재사용성을 높이고 유지보수를 용이하게 만든다.

 

 

왜 필요한가 ?

  • 코드 중복 제거: 공통적으로 발생하는 기능을 여러 클래스에서 매번 반복적으로 작성하는 것보다, 한 곳에 정의해 두고 필요한 곳에서 사용하는 방식으로 코드 중복을 줄일 수 있다.
  • 모듈화: 공통 기능을 핵심 비즈니스 로직과 분리하여 코드의 구조를 더욱 깔끔하고 유지보수하기 쉬운 형태로 만들 수 있다.
  • 유지보수 용이성: 특정 기능을 수정할 때, 코드 전반에 영향을 미치지 않고 한 곳에서만 수정하면 되므로, 수정 및 유지보수가 용이해진다.
  • 응집도 높은 코드: 핵심 비즈니스 로직은 핵심 비즈니스에만 집중하고, 공통 관심사는 AOP로 처리하므로 코드의 응집도가 높아진다.

 

OOP와 AOP의 차이점

OOP는 주로 클래스와 객체 간의 관계를 중시하며, 이를 통해 데이터와 행동을 캡슐화하고 상속, 다형성 등을 통해 기능을 확장한다.

반면, AOP는 공통 관심사를 Aspect라는 단위로 분리하여, 핵심 비즈니스 로직과 독립적으로 관리한다.

AOP는 OOP의 개념을 보완하는 방식으로, 반복적인 코드와 부가적인 관심사를 처리하는 데 사용된다.

 

 

 

AOP의 핵심 개념

  • Aspect (관점): 애플리케이션의 여러 부분에 걸쳐 나타나는 공통 관심사를 뜻함. 예를 들어, 로깅, 보안, 트랜잭션 관리 등이 Aspect로 다뤄진다.
  • Join Point (조인 포인트): Aspect가 적용될 수 있는 프로그램의 특정 지점. 예를 들어, 메서드 호출, 예외 처리, 필드 접근 등이 조인 포인트가 될 수 있다.
  • Advice (어드바이스): Join Point에서 실행할 구체적인 행동을 정의하는 부분. 예를 들어, 메서드 실행 전후에 수행될 작업을 정의한다.
  • Pointcut (포인트컷): Advice가 적용될 조인 포인트들을 정의하는 표현식. 특정 메서드나 클래스에 대해 AOP를 적용할지를 지정한다.
  • Weaving (위빙): Aspect와 관련된 로직을 실제 코드에 결합하는 과정이다. AOP는 이 과정을 통해 Aspect를 기존 코드에 삽입한다.

 

 

 

AOP가 적용되는 런타임 위빙 vs 컴파일 타임 위빙의 차이점

  • 런타임 위빙 (Runtime Weaving):
    • AOP 적용이 실행 시점에 이루어진다.
    • 프록시 객체를 생성하여, 메서드 호출 전에 advice를 실행하는 방식.
    • Spring AOP가 런타임 위빙을 사용하며, 프록시 패턴을 활용해 동작한다.
    • 코드 변경 없이도 실행 중에 AOP를 적용할 수 있기 때문에 유연성이 뛰어나다.
  • 컴파일 타임 위빙 (Compile-time Weaving):
    • AOP 적용이 컴파일 시점에 이루어진다.
    • AOP 관련 코드가 컴파일 시에 자동으로 추가된다.
    • AspectJ와 같은 도구가 컴파일 타임 위빙을 사용한다.
    • 컴파일 시점에 위빙이 이루어지므로 성능이 향상될 수 있지만, 유연성은 떨어질 수 있다.

 

 

스프링에서 AOP가 프록시 패턴을 활용하여 동작하는 원리

Spring AOP는 프록시 패턴을 사용하여 AOP 기능을 구현한다.

프록시 패턴을 사용하면, 실제 객체에 대한 접근을 프록시 객체가 대신 처리하고, 프록시 객체에서 advice를 실행한다.

프록시 패턴 동작 원리

  1. 클라이언트가 실제 객체를 호출하는 대신 프록시 객체 호출
  2. 프록시 객체는 실제 객체의 메서드를 호출하기 전에 또는 후에 advice를 실행함.
    • 예를 들어, 메서드 실행 전에 로그를 찍거나 트랜잭션을 시작하는 작업을 할 수 있음
  3. 어드바이스가 실행되고, 그 후 실제 객체의 메서드가 호출됨.

Spring AOP는 기본적으로 JDK 동적 프록시와 CGLIB를 사용하여 프록시 객체를 생성함.

JDK 동적 프록시는 인터페이스 기반의 프록시를 만들고, CGLIB는 클래스 기반의 프록시를 만든다.

 

 

프록시 패턴 사용 이유:

  • 실제 객체의 메서드 호출을 가로채서, 추가적인 기능(로깅, 트랜잭션 관리 등)을 처리할 수 있게 된다.
  • 실제 객체를 변경하지 않고, 단일 책임 원칙에 따라 공통 기능을 분리할 수 있다.

+ Recent posts