ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • AOP 이해할 수 있다!
    백엔드 : 서버공부/Spring 2025. 7. 28. 17:42
    728x90

    들어가며

    스프링 개발에서 정말 어려우면서 중요한 개념이 AOP이다.

    AOP를 깊게 파고들면 정말 어려운데..

    그래서 오늘은 가볍게 개념을 정리해보려한다!

    할 수 있다능!

     

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

    개발을 하다 보면 핵심 비즈니스 로직 외에 반복적으로 들어가는 부가기능이 생긴다.

    예를 들어 로그 출력, 트랜잭션 처리, 보안 체크 같은 것들이다.

    이런 부가 기능을 매번 비즈니스 로직에 섞어서 작성하면, 코드는 지저분해지고 유지보수도 어려워진다.

    그래서 이런 공통 기능들을 따로 분리해서 필요한 곳에만 자동으로 적용할 수 있게 도와주는 방식이 AOP(관점 지향 프로그래밍)이다.

     

    AOP는 왜 쓸까?

    위 설명에서 알 수 있듯이 AOP를 사용하면 핵심 비즈니스 로직은 로직대로 유지하면서 공통 기능은 따로 관리할 수 있어 코드 재사용성과 유지보수성이 크게 향상된다.

    AOPOPP를 대체하는 것이 아니라, OPP 설계를 더 깔끔하게 가능하게 하도록 도와주는 보조 기술이다.

    이제 진짜 Spring에서의 AOP에 대해 알아보자

    Spring에서 AOP는 프록시를 이용해서 동작한다. 우리가 @Transactional 같은 어노테이션을 붙이면, 스프링이 내부적으로 해당 객체를 감싸는 프록시 객체를 만들어낸다. 이 프록시는 메서드 실행 전/후로 부가기능을 끼워넣는 역할을 한다.

    Spring 은 이 프록시를 만들기 위해 상황에 따라 두 가지 방법 중 하나를 사용한다.

    1. JDK 동적 프록시
    2. CGLIB 프록시

    이 방식은 단순하고 스프링 빈에만 적용되기 때문에 안전하지만 몇 가지 한계도 있다.

    1. 오직 스프링 컨테이너에서 관리되는 빈에만 AOP 적용 가능
    2. 생성자 호출, 필드 접근 등에는 관여할 수 없음

    그렇다면 AspectJ는 뭔가??

    spring AOP 말고도 유명한 AOP 프레임워크 중 하나가 AspectJ다. AspectJ는 스프링처럼 프록시를 사용하는 방식이 아니다. 대신에 CGLib이라는 라이브러리를 이용해서 바이트코드 자체를 수정하는 방식이다.

    쉽게 말해서, 우리가 작성한 코드에는 핵심 기능과 부가 기능이 따로 보이지만, 실제로는 클래스 파일(bytecode) 단계에서 기능들이 하나로 섞여 있는 구조라는 뜻이다.

    왜 이렇게 복잡한 바이트코드 조작까지 할까?

    AspectJ가 이런 방식(CGLib 바이트코드 조작)을 택한 이유는 크게 두 가지다.

    첫번째 이유는 Spring 같은 컨테이너에 의존하지 않아도 되기때문이다. 프록시 방식은 AOP를 적용하려는 객체를 스프링 빈으로 등록해야한다. 하지만 바이트코드를 직접 건드리면, 스프링 없어도 AOP를 적용할 수 있다.

    두번째는 프록시 방식보다 더 강력하고 유연하기 때문이다. 예를 들어 객체가 생성될 때, 필드 값을 조회하거나 조작하는 등의 훨씬 더 세밀한 수준에서 기능을 끼워 넣을 수 있게 해준다.

    마무리

    AOP는 OPP의 단점을 보완해주는 프로그래밍 기법이다.

    스프링 AOP는 기본적으로 프록시 방식을 이용한다.

    AspectJ는 프록시 기반의 스프링 AOP의 한계를 극복하게해준다.

Designed by Tistory.