2020. 7. 27. 12:33ㆍSpring/Spring
1. AOP
1) AOP 사용 이유
일반적으로 서비스 구현 시 사용되는 메서드 내에는 핵심 비즈니스 로직보다 로깅, 예외, 트랜잭션 처리와 같은 부가적인 코드가 많다. 부가적인 코드도 중요하지만 동일하게 반복적으로 사용되는 문제가 있다. AOP는 이러한 부가적인 공통 코드를 효율적으로 관리할 수 있도록 한다.
2) 관심 분리
AOP 횡단 관심이란 메서드마다 공통으로 등장하는 로깅, 예외, 트랜잭션 처리 코드이다. 반면에 사용자의 요청에 따라 실제로 수행되는 핵심 비즈니스 로직을 핵심 관리라고 한다. 두 가지 관심을 분리한다면 메서드에 비즈니스 로직만을 구현할 수 있기에 효율성이 높아진다. 하지만 객체 지향 언어에서는 횡단 관심을 독립적인 모듈로 분리하기 어렵다.
3) 관심 분리 문제
공통으로 처리할 로직을 LogAdvice 클래스에 printLog 메서드를 구현하고 BoardServiceImpl 클래스에서 사용할 수 있도록 한다. 여기서의 문제점은 LogAdvice와 BoardServiceImpl 클래스가 강하게 결합되어 있다는 점이다.
/src/main/java/
LogAdvice.java, BoardServiceImpl.java
4) 관리 분리 문제 해결
AOP 라이브러리를 추가한다.
pom.xml
AOP 네임스페이스를 추가하고 LogAdvice 클래스를 <bean> 등록 후 AOP 설정을 추가한다.
/src/main/resources/
applicationContext.xml
다른 Log 클래스를 사용하게 된다면 설정 파일만 수정하면 된다.
구현 화면
2. AOP 용어
1) 조인포인트 (Joinpoint)
클라이언트가 호출하는 모든 비즈니스 메서드이다.
2) 포인트컷 (Pointcut)
포인트컷은 필터링된 조인포인트를 의미한다. 예를 들어, 트랜잭션은 CRUD 기능의 메서드에 필요한 기능이지만, 검색 기능의 메서드에서는 관계없기 때문에 동작할 필요가 없다. 이러한 특정 메서드에서만 공통 기능을 수행하기 위해서 포인트컷을 이용하여 클래스, 패키지, 메서드 시그니처까지 정확하게 지정할 수 있다.
포인트컷의 엘리먼트는 <aop:pointcut>이며 id 속성으로 식별한다. expression 속성은 설정하는 것에 따라 필터링되는 메서드가 달라진다.
3) 어드바이스 (Advice)
횡단 관심에 해당하는 공통 기능의 코드이며 독립된 클래스의 메서드이다. 메서드가 언제 동작할 지에 대해서는 스프링 설정 파일을 통해 <aop:before>, <aop:after>, <aop:after-returning>, <aop:after-throwing>, <aop:around> 다섯가지로 지정할 수 있다.
4) 위빙 (Weaving)
포인트컷으로 지정한 핵심 관리 메서드가 호출 시 어드바이스에 해당하는 횡단 관심 메서드가 삽입되는 과정을 의미한다. 위빙을 통해 비즈니스 메서드를 수정하지 않고도 횡단 관심에 해당하는 기능을 추가하거나 변경할 수 있다.
5) 애스팩트 (Aspect), 어드바이저 (Advisor)
애스팩트는 AOP의 핵심이며 포인트컷과 어드바이스의 결합으로, 포인트컷 메서드에 대해서 어떤 어드바이스 메서드를 실행할지 결정한다. 이 설정에 따라 AOP 동작 방식이 결정된다. (어드바이저의 경우, 주로 트랜잭션 설정에서 사용한다.)
6) 과정
사용자는 조인포인트를 호출 후, 특정 포인트컷으로 지정한 메서드가 호출 순간 어드바이스 객체의 어드바이스 메서드 실행하고 어드바이스 메서드를 삽입하도록 하는 설정한다.
7) 요약
1. 조인포인트: 클라이언트가 호출하는 모든 비즈니스 메서드
2. 포인트컷: 특정 메서드에서만 수행하도록 지정
3. 어드바이스: 횡단 관심의 공통 코드, 동작 시점 설정
4. 위빙: 동작 시점에 해당하는 공통 기능이 삽입되는 과정
5. 애스팩트, 어드바이저: 포인트컷과 어드바이스의 결합
[참고] wiki.gurubee.net/pages/viewpage.action?pageId=26740833
[참고] 스프링 퀵 스타트
'Spring > Spring' 카테고리의 다른 글
[Spring] AOP 어노테이션 (0) | 2020.07.29 |
---|---|
[Spring] AOP 엘리먼트, 표현식, JoinPoint, 바인드 변수 (0) | 2020.07.29 |
[Spring] 사용자 서비스 구현 (0) | 2020.07.27 |
[Spring] 게시판 서비스 구현 (0) | 2020.07.26 |