❐ Description
[Regex 뿌시기]에서 정규 표현식에 대해서 집중적으로 공부했었다.
공부하면서 든 생각 🤔💭
‣ 컴파일한 Pattern 객체를 캐싱해서 사용할까?
물론 주어진 과제는 1회성 기능이기 때문에 캐싱이 필수적이지는 않지만, 나는 이 프로그램이 현재 많은
사용자들이 사용한다고 가정하고 리팩토링을 진행해보려고 한다.
❐ 캐싱을 하는 이유는?
Java에서는 Pattern 클래스가 컴파일된 정규 표현식 객체를 나타내며, 이를 이용해 여러 번 패턴 매칭을 할 수 있다.
정규 표현식을 매번 컴파일하는 것은 성능상 비효율적일 수 있기 때문에, 한 번 컴파일된 Pattern 객체를 재사용하는
것이 좋다. 다음과 같은 장점들이 있을 것 같다.
1. 성능 향상
매번 새로운 정규 표현식을 컴파일하는 것은 시간이 걸리기 때문에, 한 번 컴파일한 Pattern 객체를 재사용하면
성능을 크게 향상시킬 수 있다. 동일한 패턴으로 매칭 작업을 여러 번 수행할 때 유용할 것 같다.
2. 리소스 절약
정규 표현식을 반복적으로 컴파일하면 CPU와 메모리 리소스가 불필요하게 소모될 수 있다. 한 번 컴파일한
Pattern 객체를 재사용하면 이런 리소스 낭비를 줄일 수 있다.
3. 유지보수성
정규 표현식을 별도의 유틸리티나 클래스에 모아서 관리하면, 나중에 수정하거나 확장할 때도 코드 유지보수가
더 용이할 것으로 보인다. 한 곳에서만 수정하면 여러 군데에서 사용하는 패턴이 자동으로 적용되기 때문이다.
❐ 리팩토링
1. Before
최초에 작성된 코드는 정규식 표현을 RegexPattern(Enum)으로 관리하고, 도메인 로직에서 정규식을
컴파일하는 흐름이였다.
public enum RegexPattern {
CUSTOM_DELIMITER_COUNT_REGEX("(//.*?)\\\\n"),
CUSTOM_DELIMITER_POSITION_REGEX("^(//.*?)\\\\n"),
CUSTOM_DELIMITER_PARSE_REGEX("^//(.*?)\\\\n"),
CUSTOM_DELIMITER_PARSE_CONDITION_REGEX("^//.*?"),
WHITE_SPACE("\\s");
//... 이하 생략
}
// Separator.class
public boolean canParseCustomDelimiter(String source) {
Matcher matcher = createMatcher(source, customDelimiterStartCondition());
return matcher.find();
}
private Matcher createMatcher(String source, String regex) {
// 정규식 컴파일
Pattern pattern = Pattern.compile(regex);
return pattern.matcher(source);
}
2. After
리팩토링 후에는 정규식 컴파일도 Enum에서 관리하도록 구조를 변경하였다.
public enum RegexPattern {
CUSTOM_DELIMITER_COUNT_REGEX("//.*?\\\\n"),
CUSTOM_DELIMITER_PARSE_REGEX("^//(.*?)\\\\n"),
WHITE_SPACE_REGEX("\\s"),
OR_REGEX("|");
private final String value;
RegexPattern(String value) {
this.value = value;
}
//...이하 생략
}
public enum RegexCompileCache {
CUSTOM_DELIMITER_COUNT(compile(customDelimiterCountRegex())),
CUSTOM_DELIMITER_PARSE(compile(customDelimiterParseRegex())),
REPLACE_CONDITION(compile(replaceConditionRegex()));
private final Pattern pattern;
RegexCompileCache(Pattern pattern) {
this.pattern = pattern;
}
//...이하 생략
}
리팩토링 과정에서 RegexPattern에 정의한 정규식을 RegexCompileCacahe로 옮길까라는
생각도 해봤다. 하지만 정규식을 조합해서 사용하는 경우가 있어서 서로 다른 Enum에서 관리
하기로 결정하였다.
'우테코 7기 > 1주차' 카테고리의 다른 글
[JUnit5] 입력 값을 mockking할 수 있을까? (0) | 2024.10.21 |
---|---|
[Java] 객체를 복사해보자 (0) | 2024.10.19 |
Regex 뿌시기 (0) | 2024.10.17 |
1주차 회고 (0) | 2024.10.17 |
문자열 덧셈 계산기 (0) | 2024.10.14 |