티스토리 뷰

프로젝트를 진행 중 주소지를 마스킹해야되는 상황이 생겼습니다. 물론 DB에 주소지 컬럼만 있었다면, 금방 끝날 작업이었지만, 문서전체를 탐색 후 주소지로 확인이 된다면, 마스킹처리를 해야해서 조금 폼이 들어갔습니다.

최초의 정규식은 아래와 같습니다.

String addReg= "(" +
        "(([가-힣]+(d|)+(구|동))+([가-힣]+(d|)+(동|로|길|호)))" +
        "|([가-힣]+(아파트|빌라|빌딩))"+
        "|(\\d)+(호)"+
        ")";

하지만 먼저 OR처리를 많이 하다보니 마스킹처리를 하지 않을 문장들도 마스킹처리가 되었고, 마스킹 처리를 ***동 ***호 형태로 작업할 예정이기에, 원하는 형태의 출력도 쉽지 않았습니다.

그래서 아래와 같이 세분화를 통한 작업을 진행했습니다. 정규식은 아래와 같습니다.

        String addReg1 = "(([가-힣]|\\d)+(동))+(([가-힣]|\\d)+(호))";
        
        Pattern pattern1 = Pattern.compile(addReg1);
        Matcher matcher1 = pattern1.matcher(idCode);

 

 

그 뒤에 Pattern으로 등록하고, Matcher를 통해서 일치하는 정보들을 담았습니다. 

원래는 그냥 하드 코딩으로 ***동 ****호로 하고싶었는데 조금 욕심이나서, 글자 수에 맞게 변경된다면 어떨까? 라는 생각이 들었습니다.  그래서 다음과 같이 matcher1에 일치하는 문장이 find가 true인 동안 계속해서 동작하도록 하고, 제대로 주소값이 출력되는지 확인해봤습니다.

문제없이 잘확인이 됐습니다

제가 테스트로 넣어둔 주소값은 총 4개이고, 모두 원하는 대로 잘 나왔습니다.

while (matcher1.find()){
    System.out.println(matcher1.group());
}

문제없이 잘확인이 됐습니다.  그럼 다음으로는 이제 동과 호를 제외한 값들은 전부 마스킹 작업을 하려합니다. 

먼저 하나하나 replaceAddress라는 공간에 변경된 값을 담아줬습니다.

while (matcher1.find()){
    String replaceAddress;
    replaceAddress = matcher1.group().replaceAll("[^동호]","*");

}​

다음으로는 address 에 변경된 값을 넣어줬습니다. 하나 주의하실 점은

replace 함수를 변수안에 담기 위해서는 무조건 재정의를 통해서 작업해주셔야합니다. 

replace함수는 return값이 String이라 바뀐 후에 다시 저장해야 하기 때문입니다... 이런 기본적인 부분을 실수했네요

while (matcher1.find()){
    String replaceAddress;
    replaceAddress = matcher1.group().replaceAll("[^동호]","*");
    address = address.replace(matcher1.group(),replaceAddress);
}

한번 테스트 문자로 테스트 해봅시다.

#테스트문자

안녕도안녕시동작구안녕동파크아파트101동101호

#결과

******동****동********동****호

일단 동작구라는 부분은 마스킹이 조금 아쉽지만, 다른 부분은 정상적으로 작동한 것 같습니다. 이제 좀더 구체적으로 하기 위해서 가장 신경쓰이는 아파트 부분을 마스킹 해제 하려 합니다.  하는 김에 아파트와 **구**동 형식도 추가해줍니다.

String addReg1 = "(([가-힣]|\\d)+(동))+(([가-힣]|\\d)+(호))" +
                 "|([가-힣]+(아파트))" +
                 "|([가-힣])+(구)+([가-힣])+(동)";

그리고 replace문을 다음과 같이 수정합니다. 원래는 아파트라는 단어만 제외하고 하고 싶었는데, 이게 폼이 좀 들어서, 일단 보류로 했습니다.

while (matcher1.find()){
    String replaceAddress;
    replaceAddress = matcher1.group().replaceAll("[^동호구아파트]","*");
    address = address.replace(matcher1.group(),replaceAddress);
}

그리고 아래와 같은 테스트 문구를 입력했습니다.

태권도아잉시동작구기모동모찌아파트101동101호

다음과 같이 마스킹 처리가 되는 것을 볼 수 있었습니다.

 

다만 불안전형태로 마스킹이 됩니다. 언급했듯이 주소란이 따로 마련되어 있어, 주소형태만 있다면 큰 문제가 없지만, 일단 Pattern이 매칭만 된다면, Replace문을 시작 하기에 정규식의 정교화 혹은 ML를 통해서 학습을 시켜야했습니다.  추후에 업데이트 예정이지만, 일단 제 실력으로는 딱 여기까지 진행할 수 있었습니다.

 

감사합니다

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함