Skip to content

perf: RteGenericValidator 검증 정규식 반복 컴파일 제거 — 입력·비밀번호 검증 2~4.7배 (실측 벤치)#278

Open
EricSeokgon wants to merge 1 commit into
eGovFramework:mainfrom
EricSeokgon:perf-rte-validator-regex-hoisting
Open

perf: RteGenericValidator 검증 정규식 반복 컴파일 제거 — 입력·비밀번호 검증 2~4.7배 (실측 벤치)#278
EricSeokgon wants to merge 1 commit into
eGovFramework:mainfrom
EricSeokgon:perf-rte-validator-regex-hoisting

Conversation

@EricSeokgon

Copy link
Copy Markdown

문제 (재현)

ptl.mvcRteGenericValidator는 폼 입력·비밀번호 검증에 쓰이는 유틸인데, 상수 정규식을 메서드 호출마다 다시 컴파일합니다.

  • isHtmlTag() — 매 호출 Pattern.compile("<[^<|>]*>")
  • isMoreThan2CharTypeComb() — 매 호출 조합 검증 패턴 컴파일 (특수문자 집합 ~!@#$%^&*?은 고정)
  • isMoreThan3CharTypeComb() — 동상

세 패턴 모두 입력과 무관하게 상수이므로 클래스 로딩 시 1회만 컴파일하면 됩니다. (파라미터가 들어가는 isRepeatedNTimes()의 패턴은 가변이므로 이 PR 대상에서 제외했습니다.)

수정

세 정규식을 private static final Pattern으로 호이스팅했습니다. 공개 API·검증 결과 변화 없음.

private static final String ALLOWED_SPECIAL_CHAR = "~!@#$%^&*?";
private static final Pattern HTML_TAG_PATTERN = Pattern.compile("<[^<|>]*>");
private static final Pattern MORE_THAN_2_TYPE_PATTERN = Pattern.compile(...);
private static final Pattern MORE_THAN_3_TYPE_PATTERN = Pattern.compile(...);

검증

1) 동작 동일성 — 수정 전/후 로직을 나란히 두고 경계 입력 9종(한글·태그·이메일·각종 비밀번호 조합·빈문자열)에 대해 3개 메서드 전부 결과 일치(불일치 0) 확인.

2) 컴파일 — JDK 17.0.19로 수정본 컴파일 성공(BUILD OK). 변경 파일 1개(+14 −14), 공개 시그니처 불변.

3) 성능 (JDK 17.0.19, 워밍업 30만 회 후 200만 회 반복):

method old ns/op new ns/op 개선
isHtmlTag 546 115 x4.7
isMoreThan2CharTypeComb 1,722 760 x2.3
isMoreThan3CharTypeComb 2,006 981 x2.0

재현 하네스는 요청 주시면 바로 공유하겠습니다.

영향

  • 입력·비밀번호 검증은 로그인·회원가입·비밀번호 변경마다 호출되는 경로라, 요청이 몰릴수록 이득이 커집니다
  • 검증 결과·공개 API 변화 없음 (위 동일성 검증)
  • 참고(별도 사안): isHtmlTag"<[^<|>]*>"는 문자클래스 안의 |가 리터럴로 제외 대상에 포함됩니다. 원저자 의도가 [^<>]였을 가능성이 있으나, 이 PR은 성능만 다루므로 기존 정규식 의미를 그대로 보존했습니다.

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