AOP(관점지향 프로그래밍)란

비구름·2025년 3월 16일

Spring

목록 보기
6/10

지난 포스팅에서 Spring에 대해 간단하게 공부하며 AOP라는 개념을 처음 제대로 접해보았습니다. 이에 대한 개념을 공부하며 간단하게 정리해보았습니다.

AOP의 정의

AOPAspect-Oriented Programming의 약자로 관점지향 프로그래밍이라는 뜻을 가지고 있습니다.

AOP의 목표

비즈니스 로직이 아닌 부가적인 기능을 개발할 때 중복된 코드를 줄이고 유지보수에 용이하게 만들기 위해 사용됩니다.

AOP 간단한 설명

세로로된 유저, 게시글, 댓글 로직의 경우 OOP로 개발된 비즈니스 로직입니다. 하지만 각 비즈니스 로직에서 추가적으로 로그와 트랜잭션 로직과 같은 중복된 로직을 각각 유저, 게시글, 댓글에 제작하는 것이 아닌 하나의 객체에 로그, 트랜잭션 로직을 제작한 후 필요한 위치에서 해당 로직을 사용할 수 있도록 제작된 것입니다.

위 그림에서 세로로된 로직의 경우 비즈니스 로직이며 가로로된 로직이 부가적인 로직입니다. 기존 OOP에서 조금 더 발전된 형식이라고 볼 수 있습니다.

AOP 사용 이유

기존 OOP의 문제점

아래의 코드와 같이 간단하게 유저의 이름, 나이, 간단한 소개를 가진 클래스가 있습니다. 비즈니스 로직으로 getter/setter를 통해 유저의 정보를 수정하거나 가져올 수 있습니다.

public class User {
    private String name;
    private int age;
    private String comment;

    public User(String name, int age, String comment) {
        this.name = name;
        this.age = age;
        this.comment = comment;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getComment() {
        return comment;
    }
    
    public void setComment(String comment) {
        this.comment = comment;
    }
}

만약 JPA를 사용하여 이 인스턴스가 DB와 매핑된 상태라고 가정을 해봅시다. 그렇다면 getter의 경우 단순히 테이블 하나를 조회하여 트랜잭션이 필요없지만 setter의 경우 update쿼리이기에 트랜잭션을 적용시켜 동시성 문제를 해결하는 것이 좋을 것입니다. 우선 setAge 메서드만을 확인해봅시다. 트랜잭션을 적용하는 메서드를 앞 뒤로 적용시켜 개발을 해주어야할 것입니다.

public void setAge(int age) {
		// 트랜잭션 시작 메서드
    this.age = age;
    // 트랜잭션 끝 메서드
}

만약 트랜잭션을 setAge하나에 사용한다면 큰 문제는 없을 것입니다. 하지만 다양한 메서드에 트랜잭션이 적용이 되어야한다면 트랜잭션 시작 메서드와 끝 메서드가 중복해서 사용되는 문제점이 생길 것입니다. 또한 하나의 클래스가 아닌 다른 클래스에도 똑같은 트랜잭션을 적용시켜야한다면 정말 많은 중복이 생길 것입니다.

AOP 적용

Spring에서 제공하는 @Transactional어노테이션을 이용하여 해당 메서드에 적용시켜준다면 해당 메서드에 트랜잭션이 적용될 것입니다. 어노테이션으로 해당 부가 기능을 사용할 것을 명시하고 그 어노테이션이 사용된 메서드에 부가기능을 적용하는 방식으로 중복된 코드는 제거하며 유지보수가 더욱 용이해질 것입니다.

@Transactional
public void setAge(int age) {
		// 트랜잭션 시작 메서드
    this.age = age;
    // 트랜잭션 끝 메서드
}

정리

비즈니스 로직이 아닌 로깅, 트랜잭션등과 같이 여러 코드에서 중복되는 부가적인 기능을 하나의 클래스로 만들어 필요한 위치에서 간편하게 사용할 수 있습니다. 비즈니스 로직과 부가적인 기능을 분리하여 비즈니스 로직을 담당하는 클래스는 비즈니스 로직에 더욱 집중할 수 있게됩니다. 이를 통해 각 메서드의 길이가 줄어들며 가독성이 높아지게 됩니다.

느낀점

스프링에서 Spring AOP와 AspectJ를 사용하여 AOP를 구성할 수 있습니다. 위 내용을 살펴보기 전 간단하게 개념과 사용 목적을 알고 가는 것이 더 좋을 것 같아 한번 정리해보며 AOP에 대한 개념을 잡을 수 있게 되었습니다.

profile
기본부터 정리해나가는 기록용 블로그

0개의 댓글