본문 바로가기
Spring/Toby's Spring Reading Club

1-6. AOP (2)

by Soono991 2023. 1. 10.

이전에 JDK 다이내믹 프락시를 사용해 반복되는 로직을 제거하며, 핵심 기능과 부가 기능을 분리해 보았습니다.

 

변하지 않는 타깃으로의 위임과 부가기능 적용 여부 판단이라는 부분은 코드 생성기법을 이용하는 다이내믹 프락시 기술에게 맡기고, 변하는 부가기능 코드는 별도로 만들어서 다이나믹 프록시 생성 팩토리에게 DI로 제공하는 방법을 사용했습니다.

 

그렇다면 반복적인 프락시 메서드 구현을 코드 자동생성 기법을 이용해 해결했다면 반복적인 ProxyFactoryBean 설정 문제는 설정 자동등록 기법으로 해결 할 수 업슬까? 또는 실제 빈 오브젝트가 되는 것은 ProxyFactoryBean을 통해 생성되는 프록시 그 자체이므로 프락시가 자동으로 빈으로 생성되게 할 수는 없을까?

 

스프링에서는 빈 후처리 기를 이용해 위의 궁금증을 해결합니다.

 

BeanPostProcessor (빈 후처리기)는 이름 그대로 스프링 빈 오브젝트로 만들어지고 난 후에, 빈 오브젝트를 다시 가공할 수 있게 해 줍니다.

 

6장에서는 DefaultAdvisorAutoProxyCreator를 알아보며, 이는 어드바이저를 이용한 자동 프락시 생성기입니다.

빈 후처리 기는 빈 오브젝트의 프로퍼티를 강제로 수정할 수도 있고 별도의 초기화 작업을 수행할 수도 있습니다.

따라서 빈 후처리 기를 이용해 빈 등록 시 자동으로 프락시를 생성해보도록 하겠습니다.

 

 

포인트컷 표현식을 이용한 포인트컷

스프링은 아주 간단하고 효과적인 방법으로 포인트컷의 클래스와 메서드를 선정하는 알고리즘을 작성할 수 있는 방법을 제공합니다.

 

정규식이나 JSP의 EL과 비슷한 일종의 표현식 언어를 사용해서 포인트컷을 작성할 수 있도록 하는 방법이며, 이것을 포인트컷 표현식이라고 합니다.

 

포인트컷 표현식을 지원하는 포인트컷을 작성하려면 AspectJExpressionPointcut 클래스를 사용합니다.

 

포인트컷 표현식

execution([접근 제한자 패턴] 타입패턴 [타입패턴.] 이름패턴 (타입패턴 | "..",...) [throws 예외 패턴])

[] : 생략 가능
| : or 조건

 

이때 클래스 이름에 적용되는 패턴은 클래스 이름 패턴이 아니라 타입 패턴입니다.

 

전통적인 객체지향 기술의 설계 방법으로는 독립적인 모듈화가 불가능한 트랜잭션 경계설정과 같은 부가기능을 어떻게 모듈화 할 것인가를 연구해온 사람들은, 이 부가기능 모듈화 작업은 기존의 객체지향 설계 패러다임과는 구분되는 새로운 특성이 있다고 생각했습니다.
그래서 이런 부가기능 모듈을 객체지향 기술에서 주로 사용하는 오브젝트와는 다르게 특별한 이름으로 부르기 시작했는데, 그것이 바로 애스펙트(aspect)입니다.

애스펙트란 부가될 기능을 정의한 코드인 어드바이스와, 어드바이스를 어디에 적용할지를 결정하는 포인트컷을
함께 가지고 있습니다.

 

AOP는 애스펙트 지향 프로그래밍 (Aspect Oriented Programming)의 약자로, 애플리케이션의 핵심적인 기능에서 부가적인 기능을 분리해서 애스펙트라는 독특한 모듈로 만들어서 설계하고 개발하는 방법을 말합니다.

 

AOP의 용어

타깃: 부가기능을 부여할 대상

어드바이스: 타깃에게 제공할 부가기능을 담은 모듈

조인 포인트: 어드바이스가 적용될 수 있는 위치, 스프링의 프락시 AOP에서 조인 포인트는 메서드의 실행 단계뿐입니다. 타깃 오브젝트가 구현한 인터페이스의 모든 메서드는 조인 포인트가 됩니다.

포인트컷: 어드바이스를 적용할 조인 포인트를 선별하는 작업 또는 그 기능을 정의한 모듈

프락시: 클라이언트와 타깃 사이에 투명하게 존재하면서 부가기능을 제공하는 오브젝트

어드바이저: 포인트컷과 어드바이스를 하나씩 갖고 있는 오브젝트

애스펙트: AOP의 기본 모듈, 한 개 또는 그 이상의 포인트컷과 어드바이스의 조합으로 만들어지며 보통 싱글톤 형태의 오브젝트로 존재합니다.

 

처음 AOP를 학습할 때 토비님의 말처럼 처음 접하는 용어도 많고 프록시라는 개념이 부족했던 상태여서 학습하는데 무척 어려웠습니다.

만약 저 같은 분이 계시다면 추가로 인프런의 김영한 님 강의 중 스프링 핵심 원리 - 고급 편을 같이 학습하면 훨씬 이해가 잘 될 것입니다.

'Spring > Toby's Spring Reading Club' 카테고리의 다른 글

1-8. 스프링이란 무엇인가?  (0) 2023.01.15
1-7. 스프링 핵심 기술의 응용  (0) 2023.01.15
1-6. AOP (1)  (0) 2023.01.09
1-5장. 서비스 추상화  (0) 2023.01.08
1-4장. 예외  (0) 2023.01.08

댓글