본문 바로가기

비개발자의 개발 일지

현장 팀장에서 수출 ERP까지 — AI와 함께 시스템을 만든 기록

시리즈 보기
php

MySQL REPEAT · REPLACE · REVERSE — 문자열 변형 완전 정리

by 왕진 2026. 6. 28.
반응형

 

 

Database · MySQL

REPEAT · REPLACE · REVERSE — 문자열 변형 완전 정리

문자열을 늘리고, 바꾸고, 뒤집는 세 가지 기본기
시작 오늘 분석할 코드

문자열 함수 중에서도 REPEAT, REPLACE, REVERSE는 이름 그대로 동작이 직관적이라 외우기는 쉽지만, 정작 "언제 왜 쓰는지"는 잘 안 다뤄지는 함수들이다. 아래 세 줄이 오늘 뜯어볼 원본 쿼리다.

SELECT REPEAT('이것이', 3); SELECT REPLACE ('이것이 MySQL이다', '이것이' , 'This is'); SELECT REVERSE ('MySQL');
실제 결과 미리보기
쿼리 결과
REPEAT('이것이', 3) 이것이이것이이것이
REPLACE('이것이 MySQL이다', '이것이', 'This is') This is MySQL이다
REVERSE('MySQL') LqSyM
용어 용어 정리
REPEAT(str, count)문자열 str을 count번 이어 붙여 반환
REPLACE(str, from, to)str 안의 from 문자열을 to로 전부 치환
REVERSE(str)문자열의 글자 순서를 거꾸로 뒤집어 반환
count반복 횟수. 0 이하면 빈 문자열, NULL이면 결과도 NULL
from_str / to_strREPLACE에서 찾을 대상 / 바꿔 넣을 대상 문자열
문자열 함수텍스트 값을 가공·변형해서 새 문자열을 만드는 내장 함수군
콜레이션(collation)문자열 비교 규칙. REPLACE의 대소문자 구분 여부를 좌우
NULL 전파인자 중 하나라도 NULL이면 함수 결과 전체가 NULL이 되는 성질

1 REPEAT() — 문자열을 반복해서 찍어내기
왜 REPEAT가 필요한가?

REPEAT는 "같은 문자열을 N번 이어붙이라"는 아주 단순한 명령이다. 그런데 이게 실무에서 은근히 자주 등장한다. 구분선을 그리거나, 들여쓰기를 표현하거나, 마스킹 처리할 때 별표(*)를 자릿수만큼 채우는 경우가 대표적이다. 직접 '--------'처럼 손으로 하이픈을 세어 쓰는 대신, REPEAT('-', 20)이라고 쓰면 개수가 바뀌어도 코드를 고칠 필요가 없다.

SELECT REPEAT('-', 20) AS divider; -- 결과: -------------------- SELECT REPEAT(' ', 2), '하위 항목'; -- 들여쓰기 2단계 표현
※ count가 0이거나 음수면 에러가 아니라 그냥 빈 문자열('')을 반환한다. count가 NULL이면 결과도 NULL이다.

2 REPLACE() — 문자열 안의 특정 부분 갈아끼우기
왜 REPLACE가 필요한가?

REPLACE는 문자열 안에서 일치하는 부분 문자열을 전부 찾아서 다른 문자열로 바꾼다. 정규식처럼 패턴을 쓰는 게 아니라 "이 글자 그대로"를 찾는다는 점이 핵심이다. 그래서 원문에서 등장하는 모든 위치가 한 번에 바뀐다 — 한 번만 바뀌는 게 아니다.

SELECT REPLACE('2026-07-03', '-', '/'); -- 결과: 2026/07/03 (하이픈이 전부 슬래시로) SELECT REPLACE(phone, ' ', '') FROM members; -- 전화번호에 섞인 공백을 전부 제거
※ 원본 예제처럼 REPLACE ('이것이 MySQL이다', '이것이', 'This is')는 문자열 안에 있는 첫 단어만 바꾸는 게 아니라, '이것이'가 나오는 모든 자리를 바꾼다. 문장에 '이것이'가 두 번 있었다면 두 번 다 바뀐다.

3 REVERSE() — 글자 순서를 거꾸로
왜 REVERSE가 필요한가?

REVERSE는 인자를 하나만 받는 가장 단순한 함수지만, 활용도는 의외로 넓다. 회문(palindrome) 판별처럼 "원본과 뒤집은 문자열이 같은가"를 비교하는 로직, 혹은 파일 확장자처럼 문자열 끝부분을 다룰 때 "뒤집고 - 앞에서 자르고 - 다시 뒤집는" 트릭으로 활용된다.

SELECT REVERSE('기러기') = '기러기' AS is_palindrome; -- 결과: 1 (참, 회문이다) SELECT REVERSE(SUBSTRING(REVERSE(filename), 1, LOCATE('.', REVERSE(filename)) - 1)); -- 확장자 뒤에서부터 잘라내는 고전적인 트릭
※ MySQL 5.5 이상 + utf8mb4 콜레이션을 쓰는 환경이라면 한글·이모지 같은 멀티바이트 문자도 글자 단위로 올바르게 뒤집힌다. 다만 오래된 latin1 계열 콜레이션에서는 바이트 단위로 깨질 수 있으니 인코딩을 먼저 확인하자.

 

반응형

 

4 실행 순서로 이해하기
MySQL은 함수를 어떤 순서로 계산할까?

세 함수를 조합해서 쓰다 보면 "지금 어디부터 계산되는 거지?"라는 순간이 반드시 온다. 규칙은 하나다 — 가장 안쪽 괄호부터, 안에서 바깥으로 계산된다. 아래처럼 하나의 파이프라인으로 그려보면 헷갈릴 일이 없다.

원본 문자열
REPLACE로 치환
REPEAT로 반복
최종 결과

REVERSE 역시 이 파이프라인 어느 단계에나 끼워 넣을 수 있다. "치환한 다음 뒤집을지" "뒤집은 다음 치환할지"에 따라 완전히 다른 결과가 나오므로, 조합 전에 항상 순서를 먼저 종이에 그려보는 습관을 들이자.


5 세 함수를 조합하기
왜 조합해서 쓰는가?

세 함수는 각자 단순하지만, 중첩하면 더 정교한 문자열 가공이 가능하다. 예를 들어 "치환한 결과를 반복해서 강조 배너를 만든다"거나 "반복해서 만든 패턴을 뒤집어 대칭 무늬를 만든다"는 식이다. 함수를 안에서 밖으로 겹겹이 쌓는 감각을 익히는 게 핵심이다.

SELECT REPEAT(REPLACE('-2026-', '2026', '*'), 3); -- 1단계 REPLACE: '-*-' 2단계 REPEAT: '-*--*--*-' SELECT CONCAT(REPEAT('AB', 2), REVERSE(REPEAT('AB', 2))); -- 'ABAB' + 'BABA' = 'ABABBABA' (좌우 대칭 문자열 생성)
읽는 순서: 함수는 항상 가장 안쪽부터 실행되고, 그 결과가 바깥 함수의 인자로 전달된다. 괄호를 하나씩 벗겨가며 "지금 이 값이 뭐가 됐을까"를 손으로 따라가 보면 헷갈리지 않는다.

6 실무 활용 사례
어디에 실제로 쓰이나?

세 함수가 단독으로 화면에 노출되는 일은 드물지만, 데이터 가공·리포트 출력·간단한 마스킹 로직에서는 꾸준히 쓰인다.

REPEAT — 진행률 막대
REPEAT('■', percent/10)로 진행률을 텍스트 막대 그래프처럼 표현. 별도 차트 라이브러리 없이 관리자 페이지에서 즉석 시각화 가능.
REPLACE — 개인정보 마스킹
REPLACE(card_no, SUBSTRING(card_no,5,8), '********')처럼 카드번호 가운데 자리를 별표로 가려서 조회 결과에 노출.
1
REVERSE로 회문 검증사용자 입력값이 좌우 대칭인지 REVERSE(val) = val 한 줄로 즉시 판별
2
REPLACE로 데이터 정제(cleaning)엑셀에서 내보낸 데이터에 섞인 탭·개행·전각공백을 일괄 치환해 정규화
3
REPEAT로 고정폭 포맷 맞추기로그·리포트 출력 시 컬럼 폭을 맞추기 위한 여백·구분선 생성
이웃 문자열 함수와 함께 알아두기

REPEAT · REPLACE · REVERSE는 혼자 쓰이기보다 LPAD, RPAD, TRIM, SUBSTRING 같은 다른 문자열 함수와 짝지어 쓰일 때가 많다. 역할이 겹치는 듯 보이지만 쓰임새는 분명히 다르므로 간단히 정리해둔다.

함수 역할 REPEAT/REPLACE/REVERSE와 차이
LPAD(str, len, pad) 왼쪽을 pad로 채워 길이 len에 맞춤 REPEAT처럼 반복하지만 목표 "길이"가 기준, 문자열 앞쪽만 채움
RPAD(str, len, pad) 오른쪽을 pad로 채워 길이 len에 맞춤 LPAD과 방향만 반대, 역시 목표 길이가 기준
TRIM(str) 양쪽 공백(또는 지정 문자) 제거 REPLACE는 "치환"이고 TRIM은 "제거", 목적 자체가 다름
SUBSTRING(str, pos, len) 문자열의 일부만 잘라냄 REVERSE와 조합해 "뒤에서부터 자르기" 트릭에 자주 함께 쓰임

7 주의사항 — NULL, 인코딩, 성능
알아두지 않으면 나중에 발목 잡히는 것들

세 함수 모두 사용법은 쉽지만, 프로덕션 쿼리에 넣기 전에 짚어야 할 함정이 있다.

실전 체크리스트
  • NULL 전파: REPEAT(NULL, 3), REPLACE(col, NULL, 'x') 모두 결과가 NULL이 된다 — IFNULL()로 방어할지 먼저 결정
  • 대소문자 구분: REPLACE는 컬럼/서버의 콜레이션을 따른다. _ci(case-insensitive) 콜레이션이면 대소문자 구분 없이 치환되므로 의도와 다를 수 있다
  • 큰 문자열 반복: REPEAT(str, count)에서 count가 매우 크면 max_allowed_packet 한도에 걸릴 수 있다
  • REVERSE는 인덱스를 타지 않는다 — WHERE REVERSE(col) = ... 형태는 풀스캔을 유발하므로 WHERE 절에 남발하지 말 것

8 자주 하는 실수
실수 증상 해결
REPLACE의 두 번째·세 번째 인자 순서를 헷갈림 (찾을 값과 바꿀 값을 반대로 씀) 의도와 정반대로 치환되거나 원본이 그대로 남음 REPLACE(대상, 찾을값, 바꿀값) 순서를 항상 "찾고→바꾼다"로 암기
REPEAT의 count에 음수나 소수를 넣음 에러 없이 조용히 빈 문자열이 반환돼 원인 파악이 늦어짐 count 계산식에 GREATEST(n, 0)이나 FLOOR()를 씌워 방어
REVERSE로 정렬·검색 조건을 만들면서 인덱스가 걸릴 거라 기대 대용량 테이블에서 쿼리가 갑자기 느려짐 함수 기반 조건 대신 별도 컬럼에 미리 뒤집은 값을 저장하거나 인덱스를 재설계
REPLACE가 정규식처럼 부분 패턴·와일드카드를 지원한다고 착각 특수문자를 넣었는데 문자 그대로 취급돼 치환이 안 됨 패턴 매칭이 필요하면 REGEXP_REPLACE()를 사용
NULL이 섞인 컬럼에 REPLACE·REPEAT를 그대로 적용 일부 행만 결과가 NULL로 나와 데이터 누락처럼 보임 IFNULL(col, '')로 먼저 감싸서 NULL 전파를 차단
REPLACE·REPEAT·REVERSE를 중첩할 때 괄호 짝을 잘못 닫음 문법 오류이거나, 엉뚱한 인자가 잘못된 함수로 전달됨 가장 안쪽 함수부터 하나씩 작성해 결과를 확인한 뒤 바깥 함수로 감싸는 순서로 작성

핵심 한 줄 요약

REPEAT(str, count)문자열을 count번 이어붙인다 — 구분선·들여쓰기·진행률 표현에 활용
REPLACE(str, from, to)일치하는 모든 부분 문자열을 치환 — 정규식이 아니라 완전일치 방식
REVERSE(str)글자 순서를 뒤집는다 — 회문 판별·끝문자 추출 트릭에 활용
공통 주의NULL 전파, 콜레이션 대소문자 구분, 인덱스 미적용을 항상 염두에 둘 것

Tags

#MySQL #REPEAT #REPLACE #REVERSE #문자열함수 #문자열변형 #SQL #데이터베이스 #DB #쿼리 #문자열치환 #문자열반복 #웹개발 #티스토리 #백엔드
▼ 티스토리 태그 입력란 복사용
MySQL, REPEAT, REPLACE, REVERSE, 문자열함수, 문자열변형, SQL, 데이터베이스, DB, 쿼리, 문자열치환, 문자열반복, 웹개발, 티스토리, 백엔드
반응형

댓글