과거의나야도와줘

Spring 10. AOP 03 본문

개발공부노트/Spring

Spring 10. AOP 03

o_60__o 2022. 10. 21. 15:23
728x90
주의!
공부하면서 제가 이해한 대로 쓰는거라 잘못된 부분이 있을 수 있습니다
만약 잘못된 부분이 있다면 댓글로 가르쳐주시면 감사합니다

 

이번엔 Spring으로 AOP를 만들어 봅시다

 

01. SpringAOP_xml

SpringAOP_xml 프로젝트를 만들어서 메이븐 프로젝트로 변환 시켜주세요

pom.xml 기억 나시죠? </build> 아래줄에 <dependencies></dependencies>를 추가하고 그 사이에 넣을 것들을 MvnRepository(Maven Repository: Search/Browse/Explore (mvnrepository.com))에서 가져오겠습니다

 

맨 처음은

Spring 검색하시고 Spring Context 가져올게요

 

그 다음에는 AspectJ를 검색해서 Weaver와 Runtime 두 개를 다 가져오세요

두개 다 가져오기

Weaver와 Runtime의 버전은 왠만하면 같은 버전으로 가져오시면 됩니다

 

다 하면 이렇게 됩니다

 

이제 우리가 할 것들을 정리해 볼까요

1. 핵심관심사항을 구현하고

2. Aspect(공통관심사항)을 구현하고

3. 핵심관심사항 호출을 Pointcut으로 지정하고

4. Pointcut에 Aspect들을 Advice로 지정하면 됩니다

 

01. 핵심관심사항 구현

핵심관심사항은 Spring AOP랑 별개의 문제로 우리가 하던대로 만들면 됩니다

Person 인터페이스 만들고 핵심관심사항을 구현한 Staff와 Student 클래스를 만들게요

 

02. Aspect(공통관심사항) 구현

이번에는 MyAspect라는 클래스를 만들고 공통관심사항을 구현할게요

여기에서 before()는 핵심관심사항 전에 실행할 메소드

afterReturning()은 핵심관심사항이 정상적으로 종료되고나서 실행할 메소드

afterThrowing()은 핵심관심사항에서 예외가 발생했을때 실행할 메소드

after()는 핵심관심사항이 어떻게든 끝나면 실행할 메소드 입니다.

 

03. 핵심관심사항 호출을 Pointcut으로 지정

이번에는 xml로 설정하는거니까 xml 파일로가서 pointcut을 지정하겠습니다

pointcut은 뒤에 나올 before, after-returning, after-throwing, after등이 실행되는 기준점입니다.

 

일단 코드부터 볼까요

resources(source folder)안에 applicationContext.xml(Spring Bean Configuration File)을 만들게요

 

Staff, Studnet, MyAspect를 빈 객체로 등록합니다

네임스페이스로 aop를 사용할 꺼기 때문에

Namespaces 탭에서 aop를 체크하세요

 

자 그리고 이제 아래 그림의 빨간 박스에 있는 코드를 작성 할건데요

하나 하나 설명해 드리겠습니다

13, 21번째 줄의  <aop:config>는 여기는 aop 설정하는 곳이다 라고 선언하는거라 생각하시면 됩니다

 

14번줄의 aop:pointcut은  expression의 조건에 걸리는 메소드들을 포인트컷으로 선언하겠다 라는 말입니다.

 

저 execution() 안의 조건에 해당되는 모든 메소드가 포인트 컷이 되고 id로 구분합니다

cf) . .으로 패키지내의 전부에 적용하는 것도 가능하다는데 이건 구글링하시면 될거에요

 

15번째 줄 aop:aspect ref="빈(Bean) 객체명(맨첫글자 소문자)" <-여기에 들어가는 빈 객체안에있는 메소드들을 아래 before, after-returning, after-throwing, after 메소드에서 설정 가능하고

16,17,18,19번째 줄의 pointcut-ref에는 위에 설정한 포인트컷을 기준으로 실행된다는 뜻입니다

 

요런 느낌

 

After-returning은 정상적으로 pointcut이 종료 되었을때 실행되는것

After-throwing은 예외가 터진경우 실행되는 것이라고 했는데요

그러면 예외를 하나 만들어서 실험 해보고 이번에는 Pointcut에 들어가는 메소드의 반환타입이 void가 아니라 Integer인 경우를 한번에 살펴볼게요

이 부분은 코드를 그냥 한번 보시면 될 것 같습니다

xml에서는 빨간 부분이 바뀝니다

xml에서는 빨간 박스 부분을 수정하시면 됩니다 returning이랑 throwing 뒤에는 pointcut에서 던지는 매개변수를 어떤 이름으로 받을지가 나와있어요

 

테스트 클래스는 직접 여러번 실행시켜서 예외가 안나온 경우와 나온 경우를 비교해보세요

 

이렇게 Spring AOP를 xml로 설정하는 방법을 알아봤습니다

 

밑에 참고용은 제가 볼려고 넣어놨습니다 around()로 설정하기는 많이 쓴다니까 알아두셔도 좋아요

다음 포스팅에서 봐요

 

 

 

 

참고용) around()로 설정하기

before, after-returning, after-throwing, after 말고

around로 한방에 처리하는 방법도 있습니다

 

빨간 박스 삭제하세요

pom.xml에서 일단 위의 빨간 부분 삭제해 주세요

 

MyAspect에서 around() 메소드를 추가하겠습니다

pjt.proceed()에 핵심관심사항을 실행한다 생각하면 아까 봤던 구조랑 비슷하죠?

 

이거 한 줄 추가

끝~

 

 

참고용) 타겟 객체를 인터페이스가 아닌 클래스로 프록시를 실행시킬 때

 

Person(인터페이스) -> Student(클래스)

스프링 AOP는 기본적으로 타겟 객체를 인터페이스로 받아 표준 JDK dynamic proxy를 사용합니다.

그렇지 않고 클래스로 받는 경우 CGLIP 프록시를 사용하는데 이런 경우 따로 설정을 해줘야합니다.

 

설정안하면 오류가 떠요
빨간 박스 추가하면 완성

빨간 박스를 추가하면 해결 됩니다.

728x90

'개발공부노트 > Spring' 카테고리의 다른 글

Spring 12. Spring Java Config  (0) 2022.10.22
Spring 11. AOP 04  (0) 2022.10.22
Spring 09. AOP 02  (0) 2022.10.21
Spring 08. AOP(Aspect Oriented Programming) 01  (0) 2022.10.21
Spring 07. Spring 환경 설정 3  (0) 2022.10.20
Comments