2024.07.11 - [분류 전체보기] - AOP(Aspect Oriented Programming) / 관점 지향 프로그래밍
AOP(Aspect Oriented Programming) / 관점 지향 프로그래밍
[요약]1. 만들 클라스 - FreeBoardServiceImpl 클래스 - LogConsole 클래스 [내용 정리] 1. Why? (① DB 연동방식의 이해) - DB 연결 요청 시 커넥션의 개수가 계속 증가함으로 인한 메모리 부족을 방지 -
maverick11471.tistory.com
2024.07.11 - [분류 전체보기] - AOP(Aspect Oriented Programming) / 관점 지향 프로그래밍 / 동작 시점
AOP(Aspect Oriented Programming) / 관점 지향 프로그래밍 / 동작 시점
2024.07.11 - [분류 전체보기] - AOP(Aspect Oriented Programming) / 관점 지향 프로그래밍 이전 글에서 AOP를 실행해야 하는 이유와 설정 방법, 실행에 대해 알아보았다. 이번에는 동작 시점에 대해 공부해
maverick11471.tistory.com
이전 2개 글을 읽고 오길 권장한다.
이번 시간에는 AOP에서 JoinPoint에 대해 알아보겠다.
1. JoinPoint란?
- 포인트 컷이 될 수 있는 포인트 컷 후보 메서드.
[Chat GPT 답변]
스프링 AOP에서 Joinpoint는 주로 메서드 실행 시점을 가리키며, 이 지점에서 특정 관심사
(예: 로깅, 트랜잭션 관리 등)를 적용할 수 있습니다.
스프링 AOP에서 Joinpoint와 관련된 주요 개념들은 다음과 같습니다:
Advice: 특정 시점에 실행되는 코드입니다. Before, After, Around 등의 종류가 있습니다.
Pointcut: Joinpoint를 선택하는 표현식입니다. Pointcut을 통해 어떤 Joinpoint에서 Advice가 실행될지 지정할 수 있습니다.
Aspect: 여러 Advice와 Pointcut을 모아놓은 모듈입니다. 하나의 Aspect는 여러 관심사를 포함할 수 있습니다
[사용하는 메서드]
2. JointPoint 메서드
가. getSignature : 포인트컷 지정, 실행 되는 메소드의 시그니쳐(메소드명, 리턴타입, 매개변수)를 signature 객체를 담아 리턴
나. getTarget : 호출된 메소드를 소유하고 있는 객체 리턴
다. getArgs : 호출된 메소드의 매개변수 값 object 배열로 반환
3. Signature 메서드 (JoinPoint 메서드에서 getSignature 메서드를 사용한 대상에 대해 시행)
가. toShortString : 시그니쳐(메소드명, 리턴타입, 매개변수) -> 축약된 String
나. toLongString : 시그니쳐(메소드명, 리턴타입, 매개변수) -> 패키지 경로까지 포함된 String
다. getName : 비즈니스 로직 메소드의 메소드명 리턴
4. ProceedingJoinPoint 메서드 : 현재 진행중인 포인트컷 메서드 + proceed() 메소드를 통해 받아온 포인트컷 메소드
가. aop:before, after-returning, after-throwing, after -> JoinPoint 인터페이스 사용
나. aop:around -> proceedingJoinPoint 사용
5. How?
① AfterReturning 클래스 수정
public class AfterReturning {
// 두 번째 매개변수인 Object 타입의 변수는 메소드가 종료될 때 반환해주는 값을 담아주는 매개변수
// 두 번째 매개변수같은 매개변수를 바인딩 매개변수라고 부른다.(값을 자동으로 매핑해주는 매개변수)
public void afterReturningLog(JoinPoint joinPoint, Object returnObj) {
String methodName = joinPoint.getSignature().getName();
if(returnObj != null && returnObj instanceof BoardDto) {
BoardDto boardDto = (BoardDto) returnObj;
if(boardDto.getNickname().equals("비트캠프")) {
System.out.println("작성자는 비트캠프입니다.");
}
}
if(returnObj != null) {
System.out.println("[로그] " + methodName + "()의 리턴 값" + returnObj.toString());
} else {
System.out.println("[로그] " + methodName + "()은 리턴 값이 없습니다.");
}
}
}
* 중요사항: 2번째 매개변수가 중요
(BoardDto 형식으로 지정해 뒀기 때문에, List<BoardDto> 형식은 제한된다)
JoinPoint 매개변수:
JoinPoint는 스프링 AOP에서 어드바이스 메서드에 자동으로 전달되는 매개변수입니다. 이는 어드바이스가 적용되는 메서드의 실행 시점, 메서드의 이름, 인수 등 다양한 메타데이터를 제공합니다.
JoinPoint를 매개변수로 사용하려면, 어드바이스 메서드의 첫 번째 매개변수로 선언하면 됩니다.
returnObj 매개변수:
returnObj는 after-returning 어드바이스에서 타겟 메서드의 반환 값을 전달받는 매개변수입니다.
XML 설정에서 returning 속성을 사용하여 타겟 메서드의 반환 값을 매핑할 매개변수 이름을 지정해야 합니다. 예를 들어, returning="returnObj"는 타겟 메서드의 반환 값을 returnObj라는 이름의 매개변수에 바인딩하겠다는 의미입니다.
* 타겟 메서드란?
타겟 메서드(Target Method)는 AOP(Aspect-Oriented Programming)에서 공통 기능(어드바이스)이 적용되는 실제 비즈니스 로직을 담고 있는 메서드를 의미합니다. 다시 말해, AOP를 통해 특정 공통 기능(예: 로깅, 트랜잭션 관리, 예외 처리 등)을 주입하려는 대상 메서드입니다.
예를 들어, 서비스 계층의 메서드가 공통적인 로깅 기능을 필요로 한다고 가정해봅시다. 이때, 서비스 계층의 각 메서드가 로깅 기능을 적용받을 타겟 메서드가 됩니다.
② root-context.xml 수정
- 의미: FreeBoardServiceImpl에 있는 모든 메소드를 지정 / 시점은 after-returning으로 메서드 실행 후 로그 시행
<aop:config>
<!--aop:pointcut 공통적인 기능이 실행될 클래스와 메소드를 지정한다.-->
<aop:pointcut id="allpointcut" expression="execution(* com.bit.springboard.service..FreeBoardServiceImpl.*(..))"/>
<!--aop:aspect 공통 기능의 메소드와 실행될 메소드를 매핑하는 작업-->
<aop:aspect ref="afterReturning">
<aop:after-returning method="afterReturningLog" pointcut-ref="allpointcut"
returning="returnObj"/>
</aop:aspect>
</aop:config>
- 결과
5. How?
① AfterThrowing 클래스 수정
public class AfterThrowing {
public void afterThrowingLog(JoinPoint joinPoint, Exception exception) {
String methodName = joinPoint.getSignature().getName();
System.out.println("[예외 발생] " + methodName + "() 실행 중 발생한 예외 메세지: " + exception.getMessage());
}
}
② root-context.xml 수정
<aop:config>
<aop:pointcut id="allpointcut" expression="execution(* com.bit.springboard.service..FreeBoardServiceImpl.*(..))"/>
<aop:aspect ref="afterThrowing">
<aop:after-throwing method="afterThrowingLog" pointcut-ref="allpointcut"
throwing="exception"/>
</aop:aspect>
</aop:config>
③ FreeBoardServiceImpl클래스 수정(오류 추가)
@Override
public void post(BoardDto boardDto) {
if(boardDto.getId() == 0) {
throw new RuntimeException("id에 0은 입력될 수 없습니다.");
}
freeBoardDao.post(boardDto);
}
- 결과
'백엔드 > Spring Framework' 카테고리의 다른 글
AOP 에서 aspect와 advisor를 사용할 때의 차이점 / Joinpoint와 pointcut의 차이 (2) | 2024.07.14 |
---|---|
트랜잭션 처리 (0) | 2024.07.12 |
JDBC Template (0) | 2024.07.12 |
AOP(Aspect Oriented Programming) / 관점 지향 프로그래밍 / 동작 시점 (0) | 2024.07.11 |
AOP(Aspect Oriented Programming) / 관점 지향 프로그래밍 (0) | 2024.07.11 |