Computer >> 컴퓨터 >  >> 프로그래밍 >> MySQL

MySQL에서 데이터 필드 마스킹하기: CONCAT()과 REPEAT() 함수 활용법

MySQL에서 데이터 필드의 값을 외부에 노출되지 않도록 숨기고 싶을 때 마스킹(masking) 기법을 사용할 수 있습니다. 이 글에서는 CONCAT() 함수와 REPEAT() 함수를 조합하여 비밀번호처럼 민감한 데이터를 '#' 문자로 마스킹하는 방법을 실제 예제와 함께 살펴보겠습니다.

1. 테이블 생성하기

먼저 마스킹 연습에 사용할 테이블을 생성합니다. 비밀번호 값을 저장할 Password 컬럼 하나로 구성된 간단한 테이블입니다.

mysql> create table DemoTable1410
   -> (
   -> Password varchar(80)
   -> );
Query OK, 0 rows affected (0.51 sec)

2. 샘플 데이터 삽입하기

INSERT 문을 사용해 테이블에 몇 개의 레코드를 추가합니다.

mysql> insert into DemoTable1410 values('John12345678');
Query OK, 1 row affected (0.15 sec)
mysql> insert into DemoTable1410 values('Carol_897');
Query OK, 1 row affected (0.20 sec)
mysql> insert into DemoTable1410 values('David_5647383');
Query OK, 1 row affected (0.17 sec)

3. 현재 데이터 확인하기

SELECT 문으로 테이블의 모든 레코드를 조회해 보겠습니다.

mysql> select * from DemoTable1410;

실행 결과는 다음과 같습니다.

+---------------+
| Password      |
+---------------+
| John12345678  |
| Carol_897     |
| David_5647383 |
+---------------+
3 rows in set (0.00 sec)

4. 데이터 마스킹 쿼리 실행하기

이제 핵심인 마스킹 쿼리입니다. SUBSTR()로 앞 5자리만 남기고, 나머지 자릿수만큼 REPEAT('#', ...)으로 '#' 문자를 반복 생성한 뒤 CONCAT()으로 두 부분을 연결합니다.

mysql> update DemoTable1410
   -> set Password=concat(substr(Password, 1, 5), repeat('#', char_length(Password) - 5));
Query OK, 3 rows affected (0.16 sec)
Rows matched: 3  Changed: 3 Warnings: 0

여기서 CHAR_LENGTH()는 문자열의 전체 길이를 반환하므로, '전체 길이 - 5' 만큼의 '#'가 뒤에 덧붙여지는 구조입니다.

5. 마스킹 결과 확인하기

업데이트 후 테이블을 다시 조회해 보겠습니다.

mysql> select * from DemoTable1410;

결과를 보면 앞 5자리를 제외한 나머지 값이 모두 '#'로 대체된 것을 확인할 수 있습니다.

+---------------+
| Password      |
+---------------+
| John1#######  |
| Carol####     |
| David######## |
+---------------+
3 rows in set (0.00 sec)

정리

이처럼 MySQL에서는 CONCAT(), SUBSTR(), REPEAT(), CHAR_LENGTH() 함수를 조합하면 별도의 프로그래밍 로직 없이 SQL만으로 손쉽게 데이터를 마스킹할 수 있습니다. 이 방법은 비밀번호, 전화번호, 계좌번호 등 민감한 정보를 화면에 표시하거나 로그로 남길 때 유용하게 활용될 수 있습니다. 노출하고 싶은 자릿수를 조절하고 싶다면 SUBSTR()의 세 번째 인자와 REPEAT()의 반복 횟수 계산식에서 숫자 5를 원하는 값으로 변경하면 됩니다.