[SPRING] AOP 란❓ AOP 를 사용하기 위한 기본 설정

수경·2025년 3월 21일

SpringFrameWork

목록 보기
4/24
post-thumbnail

AOP 란?

AOP(Aspect-Oriented Programming, 관점 지향 프로그래밍) 란 반복적으로 사용되는 공통 기능을 따로 빼서 관리하는 기법을 말한다.

💻 실제 프로그래밍 예제
개발에서 AOP는 보통 로깅, 보안, 트랜잭션 관리 같은 반복되는 기능을 따로 빼서 관리할 때 사용

예를 들어, Java의 Spring AOP에서 로그를 남기는 기능을 만들 때, 모든 메서드마다 System.out.println("로그 기록")을 넣는 대신, AOP를 활용하면 핵심 비즈니스 로직은 그대로 유지하면서도 자동으로 로그를 기록할 수 있다.

기본 설정

pom.xml에 추가하는 이유는 Spring AOP를 사용하기 위해 필요한 라이브러리들을 설정하는 것이다.

pom.xml

  • 프로젝트 생성 → pom.xml

    pom.xml 에 아래 코드를 추가한다. 위치는 상관없다.
<!--aspectjweaver-->
	<dependency> 
		<groupId>org.springframework</groupId>
		<artifactId>spring-aop</artifactId>
		<version>${org.springframework-version}</version>
		<type>jar</type>
		<scope>compile</scope>
	</dependency>
<!--cglib-->
	<dependency>
		<groupId>cglib</groupId>
		<artifactId>cglib</artifactId>
		<version>2.2</version>
		<type>jar</type>
		<scope>compile</scope>
	</dependency>
<!--apring-aop-->
	<dependency>
		<groupId>org.aspectj</groupId>
		<artifactId>aspectjweaver</artifactId>
		<version>${org.aspectj-version}</version>
	</dependency>

코드를 추가하면 아래 3개 파일이 자동 생성, 안되었으면 Crtl + S 누른 후 F5

spring-aop

✅ 하는 일

  • Spring에서 AOP 기능을 제공하는 핵심 라이브러리
  • 프록시(proxy) 기반의 AOP 지원
    @Aspect, @Around, @Before, @After 등 사용 가능
  • XML 또는 @EnableAspectJAutoProxy를 통해 AOP를 활성화할 때 필요

✅ 왜 필요한가?

  • Spring의 AOP 기능 (@Aspect 기반 메서드 가로채기 등)을 사용하려면 반드시 필요
  • 내부적으로 CGLIB 또는 JDK Dynamic Proxy를 사용하여 AOP를 구현

➕ Legacy Spring MVC 프로젝트로 생성하면 spring-context가 기본으로 들어가 있습니다.


<참고>
만약 프로젝트를 Legacy Spring MVC 프로젝트로 생성하였다면 pom.xml에 spring-aop를 적지 않아도 생성되어 있다.

  • Legacy Spring MVC 프로젝트에서는 spring-context가 기본으로 포함되어있기 때문이다.
  • 이유는 Spring MVC 프로젝트 템플릿이 spring-context필수 라이브러리로 포함하고 있기 때문!

✅ Legacy Spring MVC 프로젝트에서 spring-context가 기본 포함되는 이유

  • Spring MVC는 spring-context에 의존한다.
  • Spring MVC 프로젝트를 만들면 스프링의 DI(의존성 주입) 컨테이너, AOP 기능 등을 사용하기 위해 spring-context가 필요하다.
    그래서 템플릿(기본 설정)에 의해 자동으로 추가되는 것이다.

📌 Maven pom.xml을 보면, spring-context가 포함되어 있다.

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>5.3.23</version>
</dependency>

즉, Legacy Spring MVC 프로젝트에서는 spring-context를 따로 추가할 필요 없이 기본으로 제공된다.

Legacy Spring MVC 프로젝트에서 기본 포함된 Spring 라이브러리 Maven으로 Spring MVC 프로젝트를 생성하면 다음과 같은 Spring 라이브러리가 기본적으로 포함된다.


➡ 즉, Legacy Spring MVC 프로젝트에서는 spring-context가 자동 포함되지만, 일반 Maven 프로젝트에서는 직접 추가해야 한다.

cglib

✅ 하는 일

  • Spring AOP에서 프록시 객체를 만들 때 필요한 라이브러리
  • CGLIB는 JDK Dynamic Proxy와 다르게 인터페이스 없이 클래스 자체를 상속받아 프록시를 생성할 수 있음
  • final 클래스가 아닌 경우, 프록시 객체를 생성하여 AOP 기능을 수행함.

✅ 왜 필요한가?

  • Spring AOP가 JDK Dynamic Proxy(인터페이스 기반)를 기본으로 사용하지만, 클래스기반 프록시가 필요할 경우 CGLIB을 사용
    즉, 인터페이스가 없는 클래스에도 AOP를 적용하려면 CGLIB이 필요

aspectjweaver

✅ 하는 일

  • Spring의 AOP 기능을 더 강력하게 확장할 수 있도록 지원하는 라이브러리
  • AspectJ를 기반으로 한 AOP 기능을 사용할 때 필요
  • @Aspect 를 사용한 AOP 코드에서 동작하는 핵심 라이브러리

✅ 왜 필요한가?

  • @Aspect 기반 AOP 기능을 Spring이 처리할 수 있도록 도와줌.
  • Pointcut 표현식을 사용하여 메서드를 가로채려면 필요함.

가로채다 🤔

어떤 메서드가 실행되기 전에, 실행된 후에, 또는 실행 중에 특정한 작업을 추가적으로 수행하는 것을 의미한다.
원래의 비즈니스 로직을 수정하지 않고도 기능을 추가할 수 있다

예제

🎯 AOP 없이 로깅 기능을 추가하는 경우

public class MemberService {
    public void registerMember(String name) {
        System.out.println("[INFO] 회원 가입 시작");  // 로그 출력
        System.out.println(name + " 회원 가입 완료");
        System.out.println("[INFO] 회원 가입 완료");  // 로그 출력
    }
}

👉 문제점:

  • 메서드마다 직접 System.out.println()을 추가해야 한다.
  • 모든 메서드에서 중복 코드 발생한다.
  • 나중에 로깅 로직을 바꾸려면 모든 메서드를 수정해야 한다.

"로깅(logging) 로직이란 프로그램이 실행되는 동안 발생하는 정보를 기록하는 기능을 의미"


🎯 AOP 로깅 기능을 추가하는 경우


@Aspect
@Component
public class LoggingAspect {

    @Before("execution(* com.example.service.MemberService.*(..))")
    public void logBeforeMethodExecution() {
        System.out.println("[INFO] 메서드 실행 시작");
    }
}

📌 설명:

  • @Aspect
    : AOP 기능을 가진 클래스임을 선언한다.

  • @Before("execution(* com.example.service.MemberService.*(..))")
    : MemberService() 클래스의 모든 메서드 실행 전에 이 코드를 자동으로 실행한다. 즉, registerMember(), deleteMember()모든 메서드가 실행되기 전에 로그를 남긴다.

📌 즉, "메서드를 가로챈다"는 말은, 원래의 메서드 실행을 AOP가 감싸서(Proxy 방식) 추가적인 작업을 수행한다는 의미! 🚀

profile
개발 공부중•••

0개의 댓글