package egovframework.util; import lombok.extern.slf4j.Slf4j; import org.springframework.util.AntPathMatcher; /** * Utility class for URL pattern matching */ @Slf4j public class PathMatcherUtil { private static final AntPathMatcher pathMatcher = new AntPathMatcher(); /** * Check if URL pattern matches the request URI * * @param pattern URL pattern * @param uri Request URI * @return true if matches, false otherwise */ /** * URL 패턴이 URI와 일치하는지 확인 * 콤마로 구분된 여러 패턴이 전달된 경우 각 패턴을 개별적으로 처리 * * @param pattern URL 패턴 (콤마로 구분된 여러 패턴일 수 있음) * @param uri 요청 URI * @return 일치 여부 */ public static boolean match(String pattern, String uri) { if (pattern == null || uri == null) { return false; } // 패턴 전처리 - 앞뒤 공백 제거 String trimmedPattern = pattern.trim(); // 패턴에 콤마가 포함된 경우 (여러 패턴이 하나의 문자열로 전달된 경우) if (trimmedPattern.contains(",")) { //log.debug("콤마로 구분된 여러 패턴이 발견되었습니다: [{}]", trimmedPattern); // 콤마로 패턴을 분리하여 각각 처리 String[] patterns = trimmedPattern.split(","); for (String singlePattern : patterns) { String trimmedSinglePattern = singlePattern.trim(); if (!trimmedSinglePattern.isEmpty()) { // 개별 패턴으로 재귀 호출 if (match(trimmedSinglePattern, uri)) { return true; } } } return false; } // 단일 패턴 처리 try { // AntPathMatcher는 패턴에 따라 다르게 동작함 // 1. 정확한 경로 매칭 (/system/user/list.do) // 2. 경로 변수 매칭 (/system/user/{id}.do) // 3. 와일드카드 매칭 (/system/user/*.do, /system/user/**/list.do) boolean isMatch = pathMatcher.match(trimmedPattern, uri); //log.debug("URL 패턴 매칭 시도: 패턴=[{}], URI=[{}], 결과=[{}]", trimmedPattern, uri, isMatch); // 매칭되지 않았을 경우 추가 디버깅 정보 if (!isMatch && (trimmedPattern.contains("*") || trimmedPattern.contains("?"))) { //log.debug("와일드카드 패턴 매칭 실패: 패턴=[{}], URI=[{}]", trimmedPattern, uri); } return isMatch; } catch (Exception e) { log.error("URL 패턴 매칭 중 오류 발생: 패턴=[{}], URI=[{}], 오류=[{}]", trimmedPattern, uri, e.getMessage(), e); return false; } } }