티스토리 뷰

Spring

[Spring] AOP(Aspect Oriented Programming, 관점 지향 프로그래밍)의 이해 - (1/3)

망나니개발자 2021. 6. 2. 18:28
반응형

이 내용은 토비의 스프링 1권의 797부터 시작하는 내용을 참고하며 작성하였습니다.

 

 

1.  AOP(Aspect Oriented Programming, 관점 지향 프로그래밍)의 이해


[ AOP(Aspect Oriented Programming, 관점 지향 프로그래밍)의 등장 ]

AOP(Aspect Oriented Programming, 관점 지향 프로그래밍)를 이해하기 위해서는 어드바이스(Advice), 포인트컷(PointCut)를 이해해야 한다.

 

  • 어드바이스(Advice): 타겟 오브젝트에 적용하는 부가 기능을 담은 오브젝트
  • 포인트컷(PointCut): 메소드 선정 알고리즘을 담은 오브젝트

부가기능은 핵심기능과 섞이면 설계와 코드가 지저분해지기 때문에 부가기능을 독립적인 모듈로 만들고자 하는 필요성이 대두되었다.그리고 핵심 기능에 부여되는 부가 기능을 효과적으로 모듈화하는 방법을 찾다가, 어드바이스와 포인트컷을 결합한 어드바이스가 발전하여 AOP가 만들어지게 되었다. 이러한 부가 기능 모듈은 기존의 객체지향 설계와 구분되는 새로운 특성이 있어서 Aspect라고 불리기 시작하였다. Aspect(애프펙트)는 애플리케이션의 핵심 기능을 담고 있지는 않지만 애플리케이션을 구성하는 한 가지 요소로써 핵심 기능에 부가되어 의미를 갖는 모듈을 의미한다. 그리고 이렇게 애플리케이션의 핵심적인 기능에서 부가적인 기능을 분리하여 독특한 모듈로 만들고 설계하여 개발하는 방법을 AOP(Aspect Oriented Programming, 관점 지향 프로그래밍)라고 부른다.

 

AOP는 OOP를 대체하는 기술이 아니라 OOP를 돕는 보조 기술로써 핵심 기능을 설계하고 구현할 때 객체지향적인 가치를 지킬 수 있도록 도와준다. 예를 들어 사용자 관리 기능을 개발할 때 핵심 로직 대신 트랜잭션의 처리라는 관점에서 바라보고, 그 부분을 집중해서 설계하고 개발할 수 있도록 도와준다.

 

[ Spring의 AOP ]

Spring의 AOP는 내부적으로 다음과 같이 동작을 하게 된다.

 

  1. 다이내믹 프록시 객체의 생성 요청
  2. 포인트컷을 통해 부가 기능 대상 여부 확인
  3. 어드바이스로 부가 기능 적용
  4. 실제 기능 처리

 

Spring AOP는 프록시를 이용하였으며 자바의 기본 JDK와 스프링 컨테이너 외에는 특별한 기술이나 환경을 필요로 하지 않는다. 하지만 이러한 프록시 방법은 반드시 Spring 컨테이너가 필요하며 부가기능의 처리가 어려운 단점이 있어서, 바이트를 조작하는 AOP가 등장하게 되었다.

 

[ AspectJ의 AOP ]

Spring AOP 외에 또 다른 강력한 AOP 프레임워크 중 하나인 AspectJ는 프록시를 이용하지 않았다. 대신 AspectJ는 CGlib이라는 바이트 조작 라이브러리를 사용하여 타깃 오브젝트의 바이트를 고쳐서 부가기능을 직접 넣어주는 방법(바이트 조작)을 사용한다. 그래서 우리가 만든 코드에서는 부가 기능이 분리되어 있지만 바이트 코드에서는 핵심 기능과 부가 기능이 섞여있는 구조이다. AspectJ가 프록시를 사용하지 않고 CGLib을 이용한 복잡한 바이트 조작 방법을 사용하는 이유는 크게 2가지가 잇다.

  • 바이트 코드를 조작하면 Spring과 같은 컨테이너의 도움이 필요 없기 때문이다.
  • 프록시 방식보다 훨씬 강력하고 유연한 AOP를 제공할 수 있다.

 

프록시를 이용해 프록시를 구현하면 Spring의 빈으로 등록해야 하기 때문에 Spring에 종속적인 기술이 되어버린다는 단점이 있다. 반면에 바이트코드를 조작하면 스프링과 같은 컨테이너가 없는 환경에서도 AOP를 이용할 수 있다.

또한 바이트 조작으로 AOP를 구현하면 객체의 생성, 필드 값의 조회와 조작 등과 같은 다양한 부가 기능을 추가할 수 있다. 하지만 프록시를 이용하는 방법으로는 이러한 부가 기능을 처리하기가 어렵다.

 

그래도 대부분의 경우라면 Spring에서 제공하는 AOP로도 처리할 수 있다. 하지만 특별한 요구사항이 생겨서 Spring의 AOP로 처리가 어렵다면 AspectJ를 이용하면 된다.

 

AOP를 적용하는 방법으로는 크게 다음의 3가지를 고려하면 된다.

  • 클래스 또는 메소드의 이름 패턴으로 적용
  • 빈의 이름으로 적용
  • 어노테이션으로 적용

 

 

다음에는 AOP를 패키지 기반으로 그리고 어노테이션 기반으로 적용해보도록 하자.

 

 

 

관련 포스팅

  1. AOP(Aspect Oriented Programming, 관점 지향 프로그래밍)의 이해 - (1/3)
  2. AOP(Aspect Oriented Programming, 관점 지향 프로그래밍)의 개념 및 사용 방법 예제 코드 - (2/3)
  3. Spring의 AOP 프록시 구현 방법(JDK 동적 프록시,  CGLib 프록시)과 @EnableAspectJAutoProxy의 proxyTargetClass - (3/3)

 

 

 

반응형
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG more
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함