본문 바로가기

Spring

"Spring @Around 이해할 수 있나요?"

AOP @Around 이해하기 

<SampleAdvice> - AOP 기능 클래스 

@Component - 스프링의 빈으로 인식 되기 위해 설정 

root-context.xml 인식할 수 있게 scan될 수 있도록 패키지 입력 

<context:component-scan base-package="com.encore.aop"></context:component-scan>

@Aspect - AOP 기능을 하는 클래스를 선언

@Before("execution(* com.encore.service.MsgService*.*(..))") - service 패키지 안의 MsgService 클래스 중 메소드가 실행되기 전에 실행된다 


ARC에서 실행하면 controller를 거쳐서 메소드 addMsg가 실행되는데 SampleAdvice에서 startLog 메소드가 실행되고 addMsg가 실행된다. 

<ARC>


<MsgController> 

<MsgServiceImpl>

Controller에서 addMsg를 호출하고 service.addMsg(msg); 를 실행하면 MsgServiceImpl의 메소드 addMsg가 실행된다 tbl_msg에 데이터를 넣어주고 tbl_user에 userpoint에 senderid에 10점을 추가한다

<출력값>


SampleAdvice의 startLog 메소드가 실행되고 MsgController의 addMsg가 실행되고 MsgServiceImpl addMsg메소드가 실행되면서 addMsg>> (이하 생략) 이 나오게 된 것이다.


----------------------------------------------------------------------------------------

<ARC> 

SEND를 누르면??



<MsgController>


readMsg메소드를 실행할려고 하면 AOP의 timeLog메소드가 실행된다 Around는 메소드 호출 이전과 이후 모두 적용이 된다

<SampleAdvice>

jp.proceed(); 는 targetMethod를 실행하라는 의미!! @Around가 표시된 메소드가 Controller에서 호출된 메소드 앞과 뒤에 배치되는 것이 아니라 jp.proceed(); 코드 전이 호출 되기 전 실행하는 부분이고 그 뒤가 메소드가 호출 되고 나서 실행되는 부분인 것이다. 



<MsgServiceImpl>

Controller에서 readMsg가 실행되면 serviceImpl의 readMsg가 실행되고 readMsg>>gildong,2가 찍힌다 메소드 실행이 끝나면 @Around로 돌아가서 나머지 부분을 출력한다


result결과 값은 serviceImpl의 readMsg의 결과 값을 받은 것으로 MsgVo이다