[Spring] AOP

zini9188·2023년 2월 7일
0

Spring

목록 보기
5/33

AOP(Aspect Oriented Programming)란?

관점 지향 프로그래밍이라고 불린다. 어떤 로직을 기준으로 핵심적인 관점, 부가적인 관점으로 나누어서 보고, 그 관점을 기준으로 각각 모듈화하는 것이다.

클래스 A, B, C에서 공통적으로 나타나는 색깔 블록이 사용되는 부분들을 흩어진 관심사(Cross-cutting Concerns)라고 한다.

기존에 사용하던 OOP를 대체하는 것이 아닌 흩어진 관심사를 깔끔하게 처리하기 위해 OOP의 부족한 부분을 보조하는 목적으로 개발되었다.

로깅이나 보안, 트랜잭션과 같은 흩어진 관심사를 모듈화하여 핵심적인 기능에서 분리하여 재사용하는 것이 AOP의 취지이다. 이때 모듈화 시켜놓은 블럭을 Aspect라고 한다.

AOP가 필요한 이유

  • 코드의 간결성 유지

  • 객체지향설계원칙에 맞는 코드 구현

  • 코드의 재사용

public class example {
    private Connection connection;

    public void registerMember(Member member, Point point) throws SQLException {
        connection.setAutoCommit(false); 
        try {
            saveMember(member); 
            savePoint(point);  
            
            connection.commit(); 
        } catch (SQLException e) {
            connection.rollback(); 
        }
    }

    private void saveMember(Member member) throws SQLException {
        // Spring JDBC를 이용한 회원 정보 저장
    }

    private void savePoint(Point point) throws SQLException {
        // Spring JDBC를 이용한 포인트 정보 저장
    }
}

위의 코드는 트랜잭션 기능에 대해 AOP가 적용되지 않았다.

regeisterMember() 메서드는 회원의 정보를 등록하는 기능을 하는데 실제 비즈니스 로직을 수행하는 코드는 회원 정보를 저장하는 saveMember()와 회원의 포인트를 저장하는 savePoint()이다.

만약 이러한 트랜잭션 기능이 애플리케이션 전반에 존재한다면 매번 코드를 작성해야 할 것이다. 이러한 작업을 최소화하기 위해서는 AOP를 통해 중복된 코드를 공통화해서 재사용 가능하도록 만들어야 한다.

@Component
@Transactional
public class example{
    private Connection connection;

    public void registerMember(Member member, Point point) throws SQLException {
        saveMember(member);
        savePoint(point);
    }

    private void saveMember(Member member) throws SQLException {
        // Spring JDBC를 이용한 회원 정보 저장
    }

    private void savePoint(Point point) throws SQLException {
        // Spring JDBC를 이용한 포인트 정보 저장
    }
}

이처럼 @Transactional 어노태이션을 사용하면 Spring 내부에서 AOP를 통해 트랜잭션을 적용해준다. AOP를 사용하면 트랜잭션뿐만 아니라 로깅, 보안, 트레이싱 등의 공통 기능 또한 분리할 수 있다.

AOP 개념 및 용어

애스팩트 (Aspect)

  • 여러 객체에 공통으로 적용되는 공통 기능

  • 어드바이트 + 포인트 컷을 모듈화하여 애플리케이션에 포함되는 횡단 기능

  • 여러 어드바이스와 포인트 컷이 함께 존재

조인 포인트 (Join Point)

  • 클래스 초기화, 객체 인스턴스화, 메서드 호출, 필드 접근, 예외 발생과 같은 애플리케이션 실행 흐름에서의 특정 포인트를 의미

  • 애플리케이션에 새로운 동작을 추가하기 위해 조인 포인트에 관심 코드를 추가할 수 있음

  • 횡단 관심은 조인 포인트 전/후에 AOP에 의해 자동으로 추가

  • 추상적인 개념으로 AOP를 적용할 수 있는 모든 지점

  • 스프링 AOP는 프록시 방식을 사용하므로 조인 포인트는 항상 메서드 실행 지점으로 제한됨

  • 어드바이스 적용이 필요한 곳은 애플리케이션 내에 메서드를 가짐

어드바이스 (Advice)

  • 조인 포인트에서 수행되는 코드를 의미

  • Aspect를 언제 핵심 코드에 적용할지를 적용

  • 시스템 전체 Aspect에 API 호출을 제공

  • 메서드를 호출하기 전에 각 상세 정보와 모든 메서드를 로그로 남기기 위해 메서드 시작 전의 포인트인 조인 포인트 S를 선택

  • 부가 기능에 해당

포인트 컷 (Pointcut)

  • 조인 포인트 중에서 어드바이스가 적용될 위치를 선별하는 기능

  • AspectJ 표현식을 사용해서 지정

  • 프록시를 사용하는 스프링 AOP는 메서드 실행 지점만 포인트 컷으로 선별 가능

위빙 (Weaving)

  • 포인트 컷으로 결정한 타겟의 조인 포인트에 어드바이스를 적용하는 것

  • 핵심 기능 코드에 영향을 주지 않고 부가 기능을 추가할 수 있음

  • AOP 적용을 위해 Aspect 객체에 연결한 상태

    • 컴파일 타임
    • 로드 타임
    • 런타임, 스프링 AOP는 런타임, 프록시 방식

AOP 프록시 (Proxy)

  • AOP 기능을 구현하기 위해 만든 프록시 객체

  • 스프링에서 AOP 프록시는 JDK 동적 프록시 또는 CGLIB 프록시

타겟 (Target)

  • 핵심 기능을 담고 있는 모듈로 target은 부가 기능을 부여할 대상이 됨

  • Advice를 받는 객체로 Pointcut으로 결정 됨

어드바이저 (Advisor)

  • 하나의 Advice와 하나의 Pointcut으로 구성

  • 스프링 AOP에서만 사용되는 특별한 용어

profile
백엔드를 지망하는 개발자

0개의 댓글