2026. 1. 22. 11:08ㆍ공부/Java
CASE
코드를 사용하는 데이터가 있는데, 기존대로라면 쿼리에서 서브쿼리로 가지고 왔어야 할 것을, DB 서버가 달라서 가져오지 못하는 문제가 생겼다.
다른 때였다면 그냥
쿼리결과 List로 받기 -> API를 사용해서 codelist map으로 조회 -> foreach로 매칭시켜주기
// API로 조회해 온 codeMap
Map<String, String> codeMap = apiReulst.getData();
// 쿼리 조회
List<Dto> resultList = repository.selectList();
// 코드 값 세팅
for(Dto dto : resultList) {
String codeName = codeMap.get(dto.getCode());
dto.setCodeName(codeName);
}
이런식으로 진행을 했을텐데
// API로 조회해 온 codeMap
Map<String, String> codeMap = apiReulst.getData();
// 쿼리 조회
List<Dto> resultList = repository.selectList();
// 코드 값 세팅
for(Dto dto : resultList) {
String resultString = dto.getResultString(); // 제목:안녕, code:A0101, 작성자:민주대장
}
이번에는 이런 식으로 조합을 해서 값이 오는 상태...
저 resultString의 code를 찾아서 codeList와 매핑해서 replace하는 방법이 없나 찾아보다가 Pattern, Matcher Class 를 사용해보게되었다
분명교수님이알려주셨을테지만... 교수님이거보시면안돼요
Pattern, Mather Class
Pattern Class
정규식을 다루기 위해 사용하는 클래스.
정규식으로 문자열을 검증할때 사용하는데 복잡한 정규식의 경우 성능 저하가 될 수 있는 점 참고해서 사용하면 될 듯 싶다.
Matcher Class
Pattern Class에서 반환한 값과 비교 대상 문자열의 전체 일치/부분 일치를 확인
SOLVE
내가 확인후 변환해야 할 코드명은 대문자 알파벳+숫자 네 개 조합이라는 패턴을 가지고 있었기에 하기 코드를 보면서 해당 사실을 참조하면 좋을 거 같다
// 알파벳 대문자 + 숫자 네글자 조합 정규식
Pattern pattern = Pattern.compile("[A-Z][0-9]{4}");
// 이 때 matcher의 값은 java.util.regex.Matcher[pattern=[A-Z][0-9]{4} region=0,258 lastmatch=]
Matcher matcher = pattern.matcher(resultString);
while(matcher.find()) {
String code = matcher.group();
String codeName = codeList.getOrDefault(code, '-');
// 스트링은 불변. 값을 다시 대입해줘야함
resultString = resultString.replace(code, codeName); // 제목:안녕, code:게시완료, 작성자:민주대장
}
설명
[pattern=[A-Z][0-9]{4} region=0,258 lastmatch=]
pattern = 현재 정규식(알파벳 대문자 + 숫자 네글자).
retgion = 비교 대상. resultString의 길이가 258이라는 뜻이고, 0부터 258까지 맞는 코드가 있는지 찾는다는 것.
lasterMatch = 찾은 결과. 현재 find() 메소드로 결과를 찾지 않았기 때문에 비어있음.
이렇게 조회하는 부분을 해결할 수 있었다!!
이제 반대인 검색하는 경우를 해결해야 하는 문제가 있지만...⭐ 이건 머리만 아플 뿐이지 어렵진 않기 때문에 또 열심히 하기로