SSAFY11th-book-study / book-study

SSAFY 11기 6반의 '토비의 스프링 스터디'
0 stars 0 forks source link

[6.4.1] Pointcut 사용시 메소드 선정 방식 #67

Open sootudio opened 7 months ago

sootudio commented 7 months ago

6.4.1장에서는 OCP 원칙을 제대로 지키지 못하는 InvocationHandler 부분을, 메소드를 선정하는 Pointcut과 부가기능 코드가 있는 Advice로 나누고, 하나 이상의 어드바이스와 포인트컷을 묶어 Advisor 오브젝트를 만들어 사용하고 있습니다. image

이 때, PointcutAdvisor() 테스트에서 NameMatchPointcut 이라는 포인트컷 객체를 사용해서 mappedName 프로퍼티 값을 이용해 메소드의 이름을 비교하는 방식으로 부가기능을 부여할 대상 메소드를 선정했습니다.

NameMatchMethodPointcut pointcut = new NameMatchMethodPointcut();
pointcut.setMappedName("sayH*");

예제 코드에서는 위처럼 'sayH'로 시작하는 모든 메소드를 선택했고, 6.4 장의 나머지 내용에서 add나 get, update로 시작하는 모든 메소드들을 선정한다는 설명이나 코드가 나왔고, 6.4.2장에서는 적절한 메소드 명명 규칙을 활용하여 Pointcut으로 선정하라고 설명하고 있습니다. 또한 이후의 6.5장에서 Pointcut을 확장하고, 필터링을 추가할 때도 항상 와일드카드(*)를 사용한 메소드의 이름을 기준으로 메소드를 찾는 방식을 선택하고 있습니다.

여기서 몇 가지 궁금한 점이 생겨 질문 올립니다!

  1. Pointcut을 활용할 때, 메소드를 선정하는 방식은 여러가지가 있다고 알고 있습니다(메소드명, 파라미터 타입, 리턴 타입 등...) 그런데, 대부분의 코드 예시나 설명이 메소드의 이름을 기준으로 선정하는 방식으로 나오는 이뉴는 이 방식이 가장 많이 사용되어서 일까요? 그렇다면 메소드 이름을 기준으로 선정을 하면 어떤 이점이 있을지 궁금합니다. (단순하게 생각하기로는 메소드의 앞부분이 같으면, 기능이 같을 것이기 때문에 같이 묶기 편하다고 생각했는데, 그만큼 같은 기능을 가진 메소드들에 같은 부가기능을 붙여 줘야 할 일이 많기 때문일까요?)
  2. 실제로 Pointcut을 만들 때는, 메소드 이름이라는 한 가지 기준 기준으로 선정을 하는 것이 좋을까요, 아니면 파라미터 타입이나 리턴 타입, 패키지 정보 등 다양한 기준을 섞어서 만드는게 좋을까요? 전자의 경우에는 Pointcut을 사용하는 코드가 조금 더 간결하고 가독성이 좋을 것 같습니다. 다만 하나의 정보를 수정하는 메소드에만 부가기능을 붙여 주고 싶은데, 메소드명이 update도 있고, updateAll도 있다면, 이름만으로는 구별하는 것이 힘들거라고 생각했습니다. 후자의 경우에는 메소드 선정에서 예외가 발생할 확률이 적겠지만, Pointcut을 사용하는 코드가 더 복잡해진다고 생각했습니다.
hj-k66 commented 7 months ago
  1. 제 생각엔 메소드 이름을 기준으로 선정하는게 가장 간편하고, 저희 책 예시에서는 부가 기능이 트랜잭션으로 메소드 단위로 AOP를 적용해야 하기 때문에 메소드 이름을 기준으로 선정한 것 같습니다.

실제로 AOP에서 포인트컷을 선택할 때 주로 고려하는 기준은 다음과 같다고 합니다.

1. 기능적 요구사항: 가장 중요한 기준 중 하나는 어떤 기능을 구현하고자 하는지에 따라서이다. 어떤 로직을 어느 부분에 적용하고자 하는지를 고려하여 포인트컷을 선택할 수 있다.
2. 적용 범위: 어떤 부분에 AOP를 적용할지 결정하는 것도 중요하다. 전체 애플리케이션에 대한 AOP 적용인지, 특정 패키지 또는 모듈에만 적용할지를 고려할 수 있다.
3. 애플리케이션 아키텍처: 애플리케이션의 아키텍처를 고려하여 포인트컷을 선택할 수 있다. 예를 들어, 서비스 레이어, 데이터 액세스 레이어 등과 같은 특정 아키텍처 구성요소에 AOP를 적용할 수 있다.
4. 장애 관리: 특정 기능에 대한 에러 처리나 로깅과 같은 장애 관리 기능을 위해 포인트컷을 선택할 수 있다. 이를 통해 예외 처리나 로깅을 일괄적으로 적용할 수 있다.
5. 유지보수와 확장성: 포인트컷을 선택할 때 유지보수성과 확장성도 고려해야 한다. 변경이 잦거나 확장이 필요한 부분에 대해서는 유연한 포인트컷을 선택하는 것이 좋다.
  1. 제 생각엔 메소드 이름만 기준으로 하는 것이 아닌, 메소드 시그니처나 패키지 정보 등을 같이 고려하는게 좋을 것 같습니다. 왜냐하면 메소드 이름은 자주 변경될 수 있기 때문에 이름 자체로는 메소드의 작업이나 역할을 충분히 설명하지 못하고, 유연성이 떨어지며 유지보수가 어려워질 수 있을 수 있다 생각합니다.
sootudio commented 7 months ago

p. 521 참고 ...