AOP(Aspect-Oriented Programming, 관점 지향 프로그래밍) 란 반복적으로 사용되는 공통 기능을 따로 빼서 관리하는 기법을 말한다.
💻 실제 프로그래밍 예제
개발에서 AOP는 보통 로깅, 보안, 트랜잭션 관리 같은 반복되는 기능을 따로 빼서 관리할 때 사용
예를 들어, Java의 Spring AOP에서 로그를 남기는 기능을 만들 때, 모든 메서드마다 System.out.println("로그 기록")을 넣는 대신, AOP를 활용하면 핵심 비즈니스 로직은 그대로 유지하면서도 자동으로 로그를 기록할 수 있다.
pom.xml에 추가하는 이유는 Spring AOP를 사용하기 위해 필요한 라이브러리들을 설정하는 것이다.

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

✅ 하는 일
@Aspect, @Around, @Before, @After 등 사용 가능@EnableAspectJAutoProxy를 통해 AOP를 활성화할 때 필요✅ 왜 필요한가?
@Aspect 기반 메서드 가로채기 등)을 사용하려면 반드시 필요➕ Legacy Spring MVC 프로젝트로 생성하면 spring-context가 기본으로 들어가 있습니다.
<참고>
만약 프로젝트를 Legacy Spring MVC 프로젝트로 생성하였다면 pom.xml에 spring-aop를 적지 않아도 생성되어 있다.
왜❓
✅ Legacy Spring MVC 프로젝트에서 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 프로젝트에서는 직접 추가해야 한다.
✅ 하는 일
✅ 왜 필요한가?
✅ 하는 일
@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 방식) 추가적인 작업을 수행한다는 의미! 🚀