Skip to content

fix: LeaveaTrace의 PathMatcher 주입 조건 극성 수정 - #294

Open
z3rotig4r wants to merge 1 commit into
eGovFramework:mainfrom
z3rotig4r:fix/leaveatrace-matcher-injection
Open

fix: LeaveaTrace의 PathMatcher 주입 조건 극성 수정#294
z3rotig4r wants to merge 1 commit into
eGovFramework:mainfrom
z3rotig4r:fix/leaveatrace-matcher-injection

Conversation

@z3rotig4r

Copy link
Copy Markdown
Contributor

문제

LeaveaTrace.trace()는 등록된 TraceHandlerService에 기본 PathMatcher(필드 pm, AntPathMatcher)를 넘겨줍니다. 그런데 조건이 if (traceHandlerService.hasReqExpMatcher())로 되어 있어 matcher가 이미 있을 때 덮어쓰고 없을 때는 넣지 않습니다. 판정이 뒤집혀 있어 결함이 두 갈래로 나타납니다.

  • matcher를 설정하지 않은 경우: pm이 계속 null이므로 DefaultTraceHandleManager.trace()가 첫 줄 if (!enableMatcher()) return false;에서 바로 돌아옵니다. 패턴 매칭에 도달하지 못해 등록한 TraceHandler가 한 번도 호출되지 않습니다.
  • matcher를 직접 설정한 경우: setReqExpMatcher()는 조건 없이 대입하는 setter입니다. trace()를 호출할 때마다 사용자가 넣은 matcher를 기본 AntPathMatcher로 덮어씁니다.

같은 모듈의 ExceptionTransfer.processHandling()은 동일한 자리에서 if (!ehm.hasReqExpMatcher())를 씁니다. 예외 처리 쪽 코드가 원래 의도를 그대로 보여줍니다.

수정

조건을 if (!traceHandlerService.hasReqExpMatcher())로 반전했습니다(한 줄). matcher가 없는 매니저에만 기본 matcher를 주입하고 이미 설정된 matcher는 건드리지 않습니다. 위 두 결함이 함께 해소됩니다.

검증

LeaveaTraceMatcherInjectionTest 3건을 추가했습니다.

  • matcher 미설정 매니저: 기본 matcher가 주입되어 핸들러가 1회 호출되고 메시지가 전달되는지 확인
  • 사용자 matcher 설정: 그 matcher의 match()가 실제로 호출되고 교체되지 않는지 확인(AntPathMatcher를 상속한 스파이로 기록)
  • 패턴 불일치: 핸들러 미호출

LeaveaTrace의 한 줄만 되돌리면 앞의 두 건이 실패합니다. 사용자 matcher가 덮어써지는 쪽은 핸들러 호출 횟수만으로는 드러나지 않아 스파이의 match() 호출 여부를 함께 검증했습니다. 모듈 전체 mvn test 29건 green입니다.

영향 범위

변경은 org.egovframe.rte.fdl.cmmn 안으로 한정되고 공개 API 시그니처는 그대로입니다.

다만 한 가지 덧붙입니다. matcher를 명시하지 않은 기존 설정에서는 지금까지 leaveaTrace 후처리 핸들러가 조용히 실행되지 않았습니다. 이 수정 이후에는 설정대로 실행됩니다. 버전을 올릴 때 없던 핸들러 동작·로그가 새로 나타나는 형태로 관찰됩니다.

TraceHandlerService 에 PathMatcher 가 이미 있을 때만 다시 주입하도록
조건이 반대로 걸려 있었다. 그 결과 관리자 빈에 PathMatcher 를 명시
주입하지 않은 설정에서는 매니저의 pm 이 계속 null 로 남아
AbstractTraceHandleManager.enableMatcher() 가 false 를 반환하고,
DefaultTraceHandleManager.trace() 가 즉시 종료되어 leaveaTrace 후처리
핸들러가 한 번도 실행되지 않았다. LeaveaTrace 가 가진 기본
AntPathMatcher 필드도 사용되지 않는 상태였다.

같은 프레임워크의 예외 처리 경로인 ExceptionTransfer.processHandling()
은 hasReqExpMatcher() 가 false 일 때 주입하므로 그 규칙에 맞춘다.
사용자가 명시 주입한 PathMatcher 가 기본 matcher 로 덮어써지던 문제도
함께 해소된다.

matcher 미주입 구성과 사용자 지정 matcher 구성을 각각 검증하는 단위
테스트를 추가했다. 기존 CmmnTestConfig 는 setReqExpMatcher() 를 명시
호출해 이 결함이 드러나지 않으므로 신규 테스트에서 matcher 를 주입하지
않은 매니저를 직접 구성했다.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant