아래 소스코드는 주어진 문자열을 특정 유형에 따라 마스킹(일부 또는 전체 문자를 숨김 처리)하는 메서드와 이를 활용하는 메인 메서드로 이루어져 있습니다.
마스킹 규칙
Name (이름)
-길이가 2인 경우: 첫 번째 문자를 '*'로 대체합니다.
-길이가 3인 경우: 두 번째 문자를 '*'로 대체합니다.
-길이가 4 이상인 경우: 가운데 두 문자를 '*'로 대체합니다.
Mobile (휴대폰 번호)
-길이가 8에서 10 사이인 경우: 앞부분 4자리는 그대로 두고 나머지를 '*'로 대체합니다.
-길이가 11 이상인 경우: 앞부분 5자리는 그대로 두고 뒤에 4자리를 '*'로 대체합니다.
Email (이메일 주소)
-길이가 1 또는 2인 경우: '@' 이전의 문자를 '*'로 대체합니다.
-길이가 3 또는 4인 경우: '@' 이전의 두 번째 문자를 '*'로 대체합니다.
-길이가 5 이상인 경우: '@' 이전의 세 번째 이후의 문자를 '***'로 대체합니다.
Address (주소)
-문자열의 모든 문자 중 공백을 제외한 문자를 '*'로 대체합니다.
BankName (은행 이름)
길이가 2 이상인 경우: 앞부분 2자리를 '*'로 대체합니다.
길이가 2 미만인 경우: '**'로 대체합니다.
AccountNumber (계좌 번호)
-길이가 7 이상인 경우: 앞부분 6자리는 그대로 두고 나머지를 '*'로 대체합니다.
Year (연도)
-모든 문자를 '*'로 대체합니다.
Month (월)
-모든 문자를 '*'로 대체합니다.
import org.apache.commons.lang.StringUtils;
public class TT {
public enum MaskingType {
Name,
Mobile,
Email,
Address,
BankName,
AccountNumber,
Year,
Month
}
public static String maskAs(String value, MaskingType maskingType ) {
if (StringUtils.isEmpty(value) || value.trim().length() == 0) return value;
String maskingValue = value;
switch (maskingType) {
case Name:
if (value.length() == 2)
maskingValue = "*"+value.substring(1);
else if (value.length() == 3)
maskingValue = value.substring(0,1)+"*"+value.substring(2);
else if (value.length() >= 4)
maskingValue = value.substring(0,1)+"**"+value.substring(3);
break;
case Mobile:
if (value.length() >= 8 && value.length() <= 10)
maskingValue = (value.length() == 8) ? value.substring(0,4)+"****" : value.substring(0,4)+"****"+value.substring(8);
else if (value.length() >= 11)
maskingValue = value.substring(0,5)+"****"+value.substring(9);
// what about length 1 to 7
break;
case Email:
if (!value.substring(0).equals("@") && value.contains("@")){
String emailValue = value.split("@")[0];
if (emailValue.length() == 1 || emailValue.length() == 2)
maskingValue = (emailValue.length() == 1) ? value.replaceAll("(?<=.{0}).(?=.*@)", "*") : "*"+ emailValue.substring(1,2)+"@"+value.split("@")[1];
else if (emailValue.length() == 3 || emailValue.length() == 4)
maskingValue = (emailValue.length() == 3) ? value.replaceAll("(?<=.{1}).(?=.*@)", "*") : emailValue.substring(0,1)+ "**" + emailValue.substring(3)+"@"+ value.split("@")[1];
else if (emailValue.length() > 4)
maskingValue = emailValue.substring(0,1)+ "***" + emailValue.substring(4)+"@"+ value.split("@")[1];
}
break;
case Address:
StringBuilder address = new StringBuilder();
for (int i =0; i < value.length(); i++) {
char item = value.charAt(i);
address.append(Character.isWhitespace(item) ? item : '*');
}
maskingValue = address.toString();
break;
case BankName:
if(value.length() > 2) {
maskingValue = "**" + value.substring(2);
}else {
maskingValue = "**";
}
break;
case AccountNumber:
StringBuilder accountNumber = new StringBuilder();
int length = maskingValue.length();
if(length > 6) {
accountNumber.append(value.substring(0,6)); //what if a/c no length is less than 7
}
for (int i = 0; i <= length - 7; i++) {
accountNumber.append("*");
}
maskingValue = accountNumber.toString();
break;
case Year:
StringBuilder year = new StringBuilder();
for (int i =0; i < value.length(); i++) {
char item = value.charAt(i);
year.append(Character.isWhitespace(item) ? item : '*');
}
maskingValue = year.toString();
break;
case Month:
StringBuilder month = new StringBuilder();
for (int i =0; i < value.length(); i++) {
char item = value.charAt(i);
month.append(Character.isWhitespace(item) ? item : '*');
}
maskingValue = month.toString();
break;
}
return maskingValue;
}
public static void main(String[] args) throws Exception {
String originalName = "홍길동";
String maskedName = maskAs(originalName, TT.MaskingType.Name);
String originalMobile = "01012345678";
String maskedMobile = maskAs(originalMobile, TT.MaskingType.Mobile);
String originalEmail = "abcde@testemail.com";
String maskedEmail = maskAs(originalEmail, TT.MaskingType.Email);
String originalAddress = "서울특별시 중구 세종대로 110 서울특별시청";
String maskedAddress = maskAs(originalAddress, TT.MaskingType.Address);
String originalBankName = "국민은행";
String maskedBankName = maskAs(originalBankName, TT.MaskingType.BankName);
String originalAccountNumber = "1234567890123456";
String maskedAccountNumber = maskAs(originalAccountNumber, TT.MaskingType.AccountNumber);
String originalYear = "2023";
String maskedYear = maskAs(originalYear, TT.MaskingType.Year);
String originalMonth = "December";
String maskedMonth = maskAs(originalMonth, TT.MaskingType.Month);
// Print the masked values
System.out.println("Original Name: " + originalName + ", Masked Name: " + maskedName);
System.out.println("Original Mobile: " + originalMobile + ", Masked Mobile: " + maskedMobile);
System.out.println("Original Email: " + originalEmail + ", Masked Email: " + maskedEmail);
System.out.println("Original Address: " + originalAddress + ", Masked Address: " + maskedAddress);
System.out.println("Original Bank Name: " + originalBankName + ", Masked Bank Name: " + maskedBankName);
System.out.println("Original Account Number: " + originalAccountNumber + ", Masked Account Number: " + maskedAccountNumber);
System.out.println("Original Year: " + originalYear + ", Masked Year: " + maskedYear);
System.out.println("Original Month: " + originalMonth + ", Masked Month: " + maskedMonth);
}
}
'개발이야기 > Java' 카테고리의 다른 글
[Java] 금액, 숫자를 한글로 변환하기 (0) | 2023.11.20 |
---|---|
[Java] 파일명 확장자 추출하고 확인하기 (0) | 2023.11.18 |
[Java] StringUtils 클래스 메서드 사용법, 예제 (isEmpty, isNotEmpty, isBlank, isNotBlank) (0) | 2023.11.13 |
[Java] 문자열 오른쪽, 왼쪽 자릿수만큼 특정문자 채우기 (0) | 2023.11.08 |
[Java] 문자열 자르기, 추출하기 (substring(), split()) (0) | 2023.11.08 |
댓글