관점지향 프로그래밍 (AOP, Aspect Oriented Programming)란 ?

Kddongkyu·2023년 10월 22일
0

CS-Study

목록 보기
2/8

AOP(Aspect Oriented Programming)란?

AOPAspect-Oriented Programming의 약어로 컴퓨터 프로그래밍의 한 패러다임이다. OOP를 보완하는 수단으로 흩어진 Aspect를 모듈화 하는 것을 목표로 하며, 여러 모듈에 걸쳐 사용되는 기능의 중복을 줄이기 위한 방법입니다.


AOP 주요개념

  • Aspect

    • 프로그램의 여러 부분에 걸쳐 나타나는 관심사를 모듈화합니다.

    • 예를 들어, 로깅이나 보안과 같은 기능을 aspect로 정의할 수 있습니다.

  • Join Point

    • 프로그램의 실행 흐름에서 aspect가 적용될 수 있는 지점을 나타냅니다

    • 예를 들어, 메서드 호출이나 예외 발생 지점 등이 될 수 있습니다.

  • Advice

    • aspect가 어떻게 작동해야 하는지 정의한 코드 부분입니다

    • 예를 들어, 메서드 호출 전/후에 로깅을 수행하는 코드가 advice가 될 수 있습니다.

  • Pointcut

    • join point의 집합으로, 어떤 join point들에 특정 advice가 적용되어야 하는지 정의합니다.
  • Weaving

    • aspect를 프로그램 코드와 결합하는 과정을 의미합니다.

    • 이 과정은 컴파일, 로드, 또는 실행 시간에 이루어질 수 있습니다.


AOP가 필요한 상황?

  • AOP를 사용하지 않았을 때
public class OrderService {
    public void createOrder(User user, Order order) {
        // Logging (Cross-cutting Concern)
        System.out.println("Order created: " + order);

        // Business Logic
        // ... (Order creation logic)
    }

    public void cancelOrder(Order order) {
        // Logging (Cross-cutting Concern)
        System.out.println("Order cancelled: " + order);

        // Business Logic
        // ... (Order cancellation logic)
    }
}

public class UserService {
    public void createUser(User user) {
        // Logging (Cross-cutting Concern)
        System.out.println("User created: " + user);

        // Business Logic
        // ... (User creation logic)
    }

    public void deleteUser(User user) {
        // Logging (Cross-cutting Concern)
        System.out.println("User deleted: " + user);

        // Business Logic
        // ... (User deletion logic)
    }
}
  • AOP를 사용했을 때
// Aspect for Logging
@Aspect
public class LoggingAspect {
    @Before("execution(* *Service.*(..))")
    public void logBefore(JoinPoint joinPoint) {
        System.out.println(joinPoint.getSignature().getName() + " called");
    }
}

public class OrderService {
    public void createOrder(User user, Order order) {
        // Business Logic
        // ... (Order creation logic)
    }

    public void cancelOrder(Order order) {
        // Business Logic
        // ... (Order cancellation logic)
    }
}

public class UserService {
    public void createUser(User user) {
        // Business Logic
        // ... (User creation logic)
    }

    public void deleteUser(User user) {
        // Business Logic
        // ... (User deletion logic)
    }
}

💡 비유

  • 하나의 회사에는 여러 부서가 있다.

  • 각 부서에는 모두 부장과 과장이라는 직책이 있고, 각 부장과 과장들이 공통적으로 하는 역할은 같다는 것 이다.

  • 따라서 AOP는 부장이라는 직책과 과장이라는 직책이 하는 일을 따로 추출해서 작성하는 방법이라고 비유 할 수 있다.


AOP 와 OOP 의 차이점?

  • OOP

    • 비지니스 로직의 모듈화

    • 프로그램을 객체들로 구성하고, 이 객체들이 서로 협력하여 프로그램을 완성합니다.

    • 학교에서 학생, 선생님, 강의 등을 각각의 객체로 보고 이들의 상호작용으로 수업이 진행되는 로직을 구현합니다.

  • AOP

    • 부가기능(인프라 혹은 기술적인 관심사)의 모듈화

    • 프로그램에서 공통적으로 필요한 기능(로깅, 보안 등)을 별도의 모듈(관점)로 분리하여 관리합니다.

    • 여러 기능에서 공통적으로 필요한 로깅 기능을 별도로 분리하여, 필요한 곳에서 쉽게 적용하고 관리합니다.

간단히 말해, OOP는 주요 비지니스 로직을 객체를 기반으로 모듈화하는 방식이고, AOP는 여러 모듈에서 공통적으로 필요한 기능(로깅, 보안 등)을 별도로 분리하여, 중복을 줄이고 코드 관리를 편리하게 하는 방식입니다. AOP는 OOP의 한계(특히, 코드의 중복과 복잡성)를 해결하기 위해 등장한 프로그래밍 패러다임입니다.


📝 결론

AOP(관점 지향 프로그래밍)는 코드의 중복을 최소화하고, 유지 보수를 용이하게 하여 개발 프로세스의 효율성을 크게 향상시킵니다.
이를 통해 개발자는 핵심 비즈니스 로직에 집중하면서, 고품질의 소프트웨어를 더욱 신속하고 효과적으로 제작할 수 있습니다.
따라서, AOP는 현대적인 소프트웨어 개발에서 중요한 역할을 담당하며, 프로젝트의 생산성과 확장성을 높이는 데에 기여합니다.

profile
Step by step

0개의 댓글