본문으로 바로가기

[Oracle] 핸드폰번호 마스킹(휴대폰번호 마스킹)

category 4. Database/4_1 쿼리_Func_Proc 2020. 6. 16. 18:18
반응형

[Oracle] 핸드폰번호 마스킹(휴대폰번호 마스킹) 하기

안녕하세요. 갓대희 입니다. 이번 포스팅은 [ 정규식을 활용하여 핸드폰 번호 마스킹 처리하기 입니다. : ) 

 

0. 들어가기 앞서

개인정보와 관련하여 마스킹 처리할 일이 많이 있을 것이다. 이 마스킹은 대부분 싸이트에서는 공통으로 만든 Util을 통해 처리하지 않을까 싶지만 그래도 오늘은 오라클에서 마스킹 처리를 해보려 한다.

 

Javscript로 마스킹 하기 참고

2020/04/01 - [3. 웹개발/3_2_2 Javascript Function 모음] - [JavaScript ] 개인정보 마스킹 함수(이름 마스킹, 이메일 마스킹, 휴대폰 번호 마스킹, 주민번호 마스킹)

 

▶ 1. 휴대폰 번호 마스킹 하기

여러가지 상황에 따라 활용할 수 있도록 다양한 케이스를 고려하여 마스킹을 해보도록 하자.

 

※ 샘플 데이터

SELECT '010 - 1234 - 5678' AS HP FROM DUAL UNION ALL
SELECT '010)1234-5678' AS HP FROM DUAL UNION ALL
SELECT '010/3333/3333' AS HP FROM DUAL UNION ALL
SELECT '010 4372 1234' AS HP FROM DUAL UNION ALL
SELECT '016 123 1234' AS HP FROM DUAL

 

▶ 최종 결과물들을 보고 단계단계 보도록 하자.

WITH TMP AS
(
	SELECT 	REGEXP_REPLACE(REGEXP_REPLACE(HP, '[[:punct:]]'), '( ){1,}', '') AS HP
    FROM (
      SELECT '010 - 1234 - 5678' AS HP FROM DUAL UNION ALL
      SELECT '010)1234-5678' AS HP FROM DUAL UNION ALL
      SELECT '010/3333/3333' AS HP FROM DUAL UNION ALL
      SELECT '010 4372 1234' AS HP FROM DUAL UNION ALL
      SELECT '016 123 1234' AS HP FROM DUAL 
	)
)
SELECT 	HP
        , REGEXP_REPLACE(HP, '(.{3})(.*)(.{4})', '\1-\2-\3') HP1
        , REGEXP_REPLACE(HP, '(.{3})(.*)(.{4})', '\1-****-\3') HP2
        , REGEXP_REPLACE(REGEXP_REPLACE(HP, '(.{3})(.*)(.{4})', '\1-\2-\3'), '-(.*)-', '-'||LPAD('*',
            LENGTH(REGEXP_REPLACE(HP, '(.{3})(.*)(.{4})', '\2')), '*')||'-'
        ) HP3
        , RPAD(SUBSTR(HP, 0, 3), 3+LENGTH(REGEXP_REPLACE(HP, '(.{3})(.*)(.{4})', '\2')), '*') 
           || 
          SUBSTR(HP, 4 + LENGTH(REGEXP_REPLACE(HP, '(.{3})(.*)(.{4})', '\2')), LENGTH(HP)) HP4
        , REGEXP_REPLACE(
          RPAD(SUBSTR(HP, 0, 3), 3+LENGTH(REGEXP_REPLACE(HP, '(.{3})(.*)(.{4})', '\2')), '*') 
           || 
          SUBSTR(HP, 4 + LENGTH(REGEXP_REPLACE(HP, '(.{3})(.*)(.{4})', '\2')), LENGTH(HP)
          ),  '(.{3})(.*)(.{4})', '\1-\2-\3') HP5
FROM TMP;

 

 - Case 1 : 핸드폰번호에 특수 문자나 공백 등이 포함되어 데이터가 넘어 왔을때 특수문자 및 공백 제거

SELECT REGEXP_REPLACE(REGEXP_REPLACE(HP, '[[:punct:]]'), '( ){1,}', '') AS HP
FROM
	(
      SELECT '010 - 1234 - 5678' AS HP FROM DUAL UNION ALL
      SELECT '010)1234-5678' AS HP FROM DUAL UNION ALL
      SELECT '010/3333/3333' AS HP FROM DUAL UNION ALL
      SELECT '010 4372 1234' AS HP FROM DUAL UNION ALL
      SELECT '016 123 1234' AS HP FROM DUAL 
	)

 

 - Case 2 : 핸드폰 번호를 구분자(-)로 구분지어 표현 하여 준다.

1) 총 10자리 핸드폰 번호 : 000-000-0000

2) 총 11자리 핸드폰 번호 : 000-0000-0000

WITH TMP AS
(
	SELECT 	REGEXP_REPLACE(REGEXP_REPLACE(HP, '[[:punct:]]'), '( ){1,}', '') AS HP
    FROM (
      SELECT '010 - 1234 - 5678' AS HP FROM DUAL UNION ALL
      SELECT '010)1234-5678' AS HP FROM DUAL UNION ALL
      SELECT '010/3333/3333' AS HP FROM DUAL UNION ALL
      SELECT '010 4372 1234' AS HP FROM DUAL UNION ALL
      SELECT '016 123 1234' AS HP FROM DUAL 
	)
)
SELECT 	REGEXP_REPLACE(HP, '(.{3})(.*)(.{4})', '\1-\2-\3') HP
FROM TMP;

 

 - Case 3 : 가운데 부분 3~4 자리 *로 마스킹 처리

WITH TMP AS
(
	SELECT 	REGEXP_REPLACE(REGEXP_REPLACE(HP, '[[:punct:]]'), '( ){1,}', '') AS HP
    FROM (
      SELECT '010 - 1234 - 5678' AS HP FROM DUAL UNION ALL
      SELECT '010)1234-5678' AS HP FROM DUAL UNION ALL
      SELECT '010/3333/3333' AS HP FROM DUAL UNION ALL
      SELECT '010 4372 1234' AS HP FROM DUAL UNION ALL
      SELECT '016 123 1234' AS HP FROM DUAL 
	)
)
SELECT 	REGEXP_REPLACE(REGEXP_REPLACE(HP, '(.{3})(.*)(.{4})', '\1-\2-\3'), '-(.*)-', '-'||LPAD('*',
              LENGTH(REGEXP_REPLACE(HP, '(.{3})(.*)(.{4})', '\2')), '*')||'-'
          ) HP
FROM TMP;

 - Case4 : 또다른 방법으로도 마스킹해보자.

1) 구분자(-) 없는 경우

2) 구분자(-) 있는 경우

WITH TMP AS
(
	SELECT 	REGEXP_REPLACE(REGEXP_REPLACE(HP, '[[:punct:]]'), '( ){1,}', '') AS HP
    FROM (
      SELECT '010 - 1234 - 5678' AS HP FROM DUAL UNION ALL
      SELECT '010)1234-5678' AS HP FROM DUAL UNION ALL
      SELECT '010/3333/3333' AS HP FROM DUAL UNION ALL
      SELECT '010 4372 1234' AS HP FROM DUAL UNION ALL
      SELECT '016 123 1234' AS HP FROM DUAL 
	)
)
SELECT 	RPAD(SUBSTR(HP, 0, 3), 3+LENGTH(REGEXP_REPLACE(HP, '(.{3})(.*)(.{4})', '\2')), '*') 
           || 
          SUBSTR(HP, 4 + LENGTH(REGEXP_REPLACE(HP, '(.{3})(.*)(.{4})', '\2')), LENGTH(HP)) HP1
        , REGEXP_REPLACE(
          RPAD(SUBSTR(HP, 0, 3), 3+LENGTH(REGEXP_REPLACE(HP, '(.{3})(.*)(.{4})', '\2')), '*') 
           || 
          SUBSTR(HP, 4 + LENGTH(REGEXP_REPLACE(HP, '(.{3})(.*)(.{4})', '\2')), LENGTH(HP)
          ),  '(.{3})(.*)(.{4})', '\1-\2-\3') HP2
FROM TMP;

 

이외에도 여러 방법으로 핸드폰 번호 마스킹 처리하는 방법을 만들어 낼 수 있다.

 

본인이 원하는 방법으로 사용하던, 참고해서 사용하던 대량 트래픽 하에서만 수행하지 않으면 상관 없지 않을까?

 

※ 정규식 참고

 - ^ : 라인의 시작 부분에 표현식을 적용한다. 즉 해당 문자로 시작하는 라인 출력

 - $ : 라인의 종료 부분에 표현식을 적용한다. 즉 해당 문자로 끝나는 라인 출력

 - * : 모든. 0 or 이상 횟수로 매치 

 - ? : 0 회 또는 1 회 매치

 - + : 1 회 또는 그 이상 횟수로 매치

 - {m} : 정확히 m 회 매치

 - {m,} : 최소한 m 회 매치

 - {m, n} : 최소 m 회, 최대 n 회 매치

반응형

댓글을 달아 주세요

  1. Favicon of https://html6.tistory.com BlogIcon HTML6 2020.06.16 18:30 신고

    오늘도 잘 읽고 갑니다 ! ^_^