티스토리 뷰

It

Spring AOP 4-1 AOP

IT eoeo25 2022. 8. 15. 15:38

Spring AOP 4-1 AOP

AOP 개념

OOP를 좀더 OOP 답게... (OOP를 대체하지는 않음)

관심의 분리(Separation of Concerns)

문제 영역을 독립적인 모듈로 분해

핵심관심(Core Concerns)

객체지향 분석/설계 과정을 통해 쉽게 모듈화/추상화가 가능함.

횡단관심(CrossCutting Concerns)

객체지향의 기본 원칙을 지키면서 이를 분리해서 모듈화하는 것이 매우 어려움

횡단관심 모듈들은 여러개의 또는 많은 핵심 관심 모듈들과 긴밀하게 결합되어 있음

따라서 기존 OOP 개념으로는 뾰죽한 답이 나오지 않음.

관점 분리

OOP의 문제점

횡단 관심 : ) 로깅, 인증, 리소스 풀링, 에러 검사 등

이러한 횡단 관심은 핵심 관심과 다른 형태로 존재함.

아래와 같은 방식은 핵심관심 모듈에 객체생성, 메서드 호출 코드가 모두 포함되어야 함.

public class BeforeAdvice {

public void beforeLog() throws Throwable{

System.out.println("[사전 충고] 메소드가 실행되기 전에 호출됨...");

}

}

@Service("userService")

public class UserServiceImpl implements UserService {

@Autowired

private UserDAO userDAO;

public void addUser(UserVO vo) {

BeforeAdvice before = new BeforeAdvice();

before.beforeLog();

userDAO = new UserDAO();

userDAO.addUser(vo);

}

}

한계점 정리

중복되는 코드

지저분한 코드

가독성 저하, 실수나 버그 유발, 유지보수에 어려움 가중

생산성 저하

핵심관심과 횡단관심을 함께 구현해야 하므로 개발의 집중력을 떨어뜨리고 결과적으로 생산성 저하를 불러옴

재활용성 저하

변경의 어려움

새로운 요구사항이 많은 부분에 영향을 미치는 경우 적용이 힘들어짐

새로운 관심영역의 등장시에 적용을 어렵게 함.

툴의 도움없이 리팩토링도 어려움

EJB에서의 AOP

현재의 AOP 이전의 방식

두가지 방법

EJB와 같은 컨테이너 또는 서버를 이용한 방법

횡단 관심 기능을 컨테이너 상에서 작동하는 EJB 모듈에 적용

일종의 엔터프라이즈 서비스

POJO 지원하지 않음

Dynamic Proxy를 이용한 인터셉터 체인 방식

JDK1.3 부터 지원

컨테이너 개발자들을 통해 많이 사용된 방식

복잡한 프레임워크 또는 컨테이너의 도움이 필요

AspectJ

Java VM과 호환되는 최초의 AOP

AspectJ과 별도의 컴파일러나 위빙에 의존하지 않고 Spring에 적용됨

위빙(Weaving) : CrossCutting이라고도 함. AOP가 핵심 관심 모듈의 코드를 직접 건드리지 않고 필요한 기능이 작동하도록 함.

AOP 용어

조인포인트(Joinpoint)

횡단 관심 모듈인 Advice가 삽입되어 동작할 수 있는 실행가능한 위치로서 포인트컷(Pointcut) 후보 위치임.

메서드 호출 시점, 메서드가 리턴되는 시점 등이 조인포인트가 될 수 있음

포인트컷(Pointcut)

어떤 클래스의 어느 조인포인트를 사용할 것인지를 결정하는 선택기능

AOP가 항상 모든 모듈의 모든 조인포인트를 사용하는 것이 아니기 때문에, 필요에 따라 사용해야할 모듈의 특정 조인포인트를 지정할 필요가 있음.

<aop:config>

<aop:pointcut id="testPointcut"

expression="execution(* com.multicampus.biz.user.UserServiceImpl.*(..))"/>

</aop:config>

</beans>

어드바이스(Advice)

각 조인포인트에 삽입되어 동작할 수 있는 코드

주로 메서드 단위로 구성됨

포인트컷에 의해 결정된 모듈의 조인포인트에서 호출되어 사용됨

동작 시점은 AOP 기술마다 조금씩 다름

before, after, after-returning, after-throwing, around

어드바이스 예

<bean id="aroundAdvice" class="com.multicampus.biz.common.FilterAdvice" />

<aop:config>

<aop:pointcut id="testPointcut"

expression="execution(* com.multicampus.biz.user.UserServiceImpl.*(..))" />

<aop:aspect id="logAspect" ref="aroundAdvice">

<aop:around pointcut-ref="testPointcut" method="filter" />

</aop:aspect>

</aop:config>

</beans>

위빙(Weaving or CrossCutting)

포인트컷에 의해 결정된 조인포인트에 지정된 어드바이스를 삽입하는 과정

AOP의 핵심적인 처리과정

처리방식

Compile-time weaving, Loading- time weaving, Run-time weaving

Spring AOP Run-time weaving.

Aspect 또는 Advisor

Aspect는 포인트컷(where)과 어드바이스(what) 합쳐놓은 것

어느 조인포인트에 어떤 기능을 삽입할 것인지를 정의하는 것

<bean id="aroundAdvice" class="com.multicampus.biz.common.FilterAdvice" />

<aop:config>

<aop:pointcut id="testPointcut"

expression="execution(* com.multicampus.biz.user.UserServiceImpl.*(..))" />

<aop:aspect id="logAspect" ref="aroundAdvice">

<aop:around pointcut-ref="testPointcut" method="filter" />

</aop:aspect>

</aop:config>

</beans>

Spring AOP 특징

표준 자바 클래스로 작성

Spring AOP는 완벽히 자바 표준을 따름. 쉽다!!

별도의 컴파일러 필요 없음

Runtime 시점에서의 Advice 적용

프록시를 이용하여 핵심관심을 구현한 객체에 접근하도록 하여 AOP 지원

AOP 연맹 표준 준수

AOP 연맹의 표준과 호환되는 다른 프레임워크에서 재사용 가능

메서드 단위의 조인포인트만 제공

생성자와 관련된 조인포인트는 제공하지 않음.

. Spring에서의 AOP 설정

XML 설정 파일에 Schema 방식으로 적용

<bean id="logAdvice" class="com.multicampus.biz.common.LoggingAdvice" />

<aop:config>

<aop:pointcut id="testPointcut" expression="..."/>

<aop:aspect id="logAspect" ref="logAdvice">

<aop:before pointcut-ref="testPointcut" method="log"/>

</aop:aspect>

</aop:config>

</beans>

Bean 클래스 내에 Annotation을 사용하여 적용

@Aspect

public class LoggingAdvice {

@Pointcut("execution(* com.multicampus.biz.user.UserService.*(..))")

public void logPointcut(){}

@Before("logPointcut()")

public void beforeLog(){

System.out.println("[ 사전 충고 ] 비즈니스 메소드 호출 전에 수행됨...");

}

}

'It' 카테고리의 다른 글

명령어 세트  (0) 2022.08.16
명령어 파이프라이닝  (0) 2022.08.16
명령어 실행  (0) 2022.08.16
Dependency Injection 3-4 Annotation 기반 설정  (0) 2022.08.15
Dependency Injection 3-3 Dependency Injection  (0) 2022.08.15