0Pricing
Coding Interview Prep · 강의

LIKE, 와일드카드와 이스케이프

패턴 일치, 퍼센트 기호와 밑줄의 차이, 리터럴 와일드카드 문자를 이스케이프하는 방법을 알아봅니다.

LIKE, 와일드카드와 이스케이프은(는) CoddyKit의 무료 Coding Interview Prep 강의입니다. 이것은 4개 중 3번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Coding Interview Prep 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Coding Interview Prep 강의에는 총 4개의 강의가 포함되어 있습니다.

면접에서 집중 검증되는 패턴 일치

LIKE는 간단해 보이지만 세 가지 고전적인 면접 함정을 숨기고 있습니다. %와 _를 혼동하는 것, 데이터의 리터럴 퍼센트 기호나 밑줄에는 이스케이프가 필요하다는 점을 잊는 것, 데이터베이스마다 다른 대소문자 구분 방식에서 생기는 의외의 차이입니다.

이 레슨에서는 두 와일드카드, ESCAPE 절, 그리고 실제 검색 기능을 출시해 본 개발자와 주니어를 구분하기 위해 면접관이 확인하는 데이터베이스별 규칙을 집중적으로 다룹니다.

두 와일드카드

LIKE에는 정확히 두 개의 와일드카드 문자가 있습니다.

  • %는 문자를 0개 이상 일치시킵니다
  • _는 문자를 정확히 1개 일치시킵니다

따라서 'a%'는 a로 시작하는 모든 값을 찾고, 'a_'는 a로 시작하는 두 문자 문자열을 찾습니다. 이 둘을 혼동하는 것이 LIKE에서 가장 흔한 실수입니다.

SELECT *
FROM customers
WHERE name LIKE 'A%';
-- every name beginning with A

어디에나 쓰는 퍼센트 기호

일치가 시작되는 위치를 제어하려면 %의 위치를 조정하세요.

  • '%son'은 son으로 끝나는 값을 찾습니다(Johnson, Mason)
  • '%mary%'는 어디에든 mary가 포함된 값을 찾습니다
  • 'J%n'은 J로 시작하고 n으로 끝나는 값을 찾습니다

단독으로 사용한 '%'는 NULL이 아닌 모든 행과 일치합니다. NULL은 '%'를 포함한 어떤 LIKE 패턴과도 일치하지 않습니다.

SELECT *
FROM customers
WHERE email LIKE '%@gmail.com';

고정 길이에 사용하는 밑줄

_는 임의의 문자 하나와 일치하므로 고정 너비 코드에 유용합니다. 'A__'는 A로 시작하는 정확히 세 문자를 찾으며, 더 많거나 적은 문자는 찾지 않습니다.

면접관은 제품 코드나 국가 코드로 이를 확인합니다. A로 시작하는 세 문자 코드가 필요할 때 'A%'를 작성하는 지원자는 미묘하게 틀린 답을 내는 것입니다. 이 조건은 A로 시작하는 모든 값을 반환하기 때문입니다.

SELECT *
FROM products
WHERE sku LIKE 'A__';
-- A followed by exactly two more characters

데이터에 %와 _가 나타날 때

할인 라벨 '50% 할인'처럼 퍼센트 기호를 문자 그대로 포함하는 값을 찾으려면 어떻게 해야 할까요? LIKE '%50%%'라고 작성하면 실패합니다. 마지막 %가 리터럴이 아니라 와일드카드로 처리되기 때문입니다.

특정 문자 하나를 문자 그대로 취급한다고 SQL에 알려야 합니다. 이때 사용하는 것이 ESCAPE 절입니다.

ESCAPE 절

ESCAPE로 이스케이프 문자를 선언한 다음, 문자 그대로 처리할 와일드카드 앞에 붙이세요. 여기서는 !가 이스케이프 문자이므로 !%는 리터럴 퍼센트 기호를 의미합니다.

이렇게 하면 어디에든 문자 그대로의 50%가 포함된 값을 찾을 수 있습니다. 이스케이프 문자는 임의로 정할 수 있으므로 검색 텍스트에 나타나지 않는 문자를 선택하세요.

SELECT *
FROM promos
WHERE label LIKE '%50!%%' ESCAPE '!';
-- matches a literal '50%' anywhere in label

리터럴 밑줄 이스케이프하기

밑줄은 사용자 이름과 식별자에 숨어 있으며, 이스케이프하지 않은 _는 어떤 문자든 조용히 일치시킵니다. 'a_b'로 실제로 시작하는 이메일 주소를 찾으려면 밑줄을 이스케이프해야 합니다.

이스케이프하지 않으면 'a_b%'는 'axb', 'a9b' 등과도 일치합니다. 이스케이프하지 않은 쿼리도 그럴듯해 보이는 행을 반환하기 때문에 이 오류는 운영 환경에 계속 배포됩니다.

SELECT *
FROM users
WHERE handle LIKE 'a!_b%' ESCAPE '!';
-- handle starting with the literal text a_b

데이터베이스마다 대소문자 구분이 다름

LIKE가 대소문자를 구분하는지는 엔진과 데이터 정렬 규칙에 따라 다릅니다.

  • PostgreSQL: LIKE는 대소문자를 구분합니다. 대소문자를 구분하지 않으려면 ILIKE를 사용하세요
  • MySQL: 열의 데이터 정렬 규칙에 따라 다르며, 기본적으로 대소문자를 구분하지 않는 경우가 많습니다
  • SQL 서버: 데이터 정렬 설정에 따라 다릅니다

이식 가능하고 명시적인 방법은 양쪽을 모두 소문자로 바꾸는 것입니다.

SELECT *
FROM customers
WHERE LOWER(name) LIKE 'a%';

숨겨진 성능 비용

'%son'과 같은 선행 와일드카드는 일반적인 B-트리 인덱스를 사용할 수 없습니다. 인덱스는 접두사 순서로 정렬되는데 시작점이 고정되어 있지 않기 때문입니다. 따라서 엔진은 모든 행을 스캔해야 합니다.

'son%'은 후행 와일드카드와 고정된 접두사를 사용하므로 인덱스를 사용할 수 있습니다. 면접관은 LIKE 검색이 느린 이유를 자주 묻는데, 대개 답은 선행 %입니다.

-- index-friendly (anchored prefix):
WHERE name LIKE 'Smi%'
-- forces a scan (leading wildcard):
WHERE name LIKE '%mith'

LIKE를 넘어

LIKE만으로 충분하지 않을 때는 깊이 있는 이해를 보여 주기 위해 다음 대안을 언급하세요.

  • 실제 정규 표현식을 사용하려면 PostgreSQL에서 SIMILAR TO와 POSIX 정규식(~, ~*)을 사용할 수 있습니다
  • 대규모 자유 텍스트 데이터 집합을 위한 전문 검색 인덱스
  • 선행 와일드카드 검색을 빠르게 만드는 트라이그램 인덱스(pg_trgm)

이러한 대안을 언급하면 LIKE가 텍스트 검색의 최종 단계가 아니라 최저선이라는 점을 알고 있음을 보여 줄 수 있습니다.

사용자 입력으로 LIKE 패턴을 안전하게 만들기

면접관은 자주 다음과 같이 질문합니다. 사용자가 입력한 용어를 LIKE로 오류 없이 검색하려면 어떻게 해야 할까요? 다음 두 가지 위험을 언급하십시오.

  • 주입 공격 — 값을 매개변수로 전달하고, 가공되지 않은 입력을 SQL 문자열에 절대 이어 붙이지 마십시오.
  • 이스케이프되지 않은 와일드카드 — 입력 자체에 %나 _가 포함되어 있다면 문자 그대로 일치하도록 이스케이프하십시오.

매개변수를 전달한 다음 쿼리에서 자체 와일드카드를 추가하십시오.

-- $1 is bound as a parameter; wildcards are added in SQL
SELECT *
FROM products
WHERE name LIKE '%' || replace(replace($1, '_', '\_'), '%', '\%') || '%' ESCAPE '\';

빠른 확인

두 와일드카드의 차이를 떠올려 보세요.

요약

핵심 내용:

  • %는 문자를 0개 이상 일치시키고, _는 정확히 하나를 일치시킵니다
  • 데이터에서 리터럴 % 또는 _를 찾으려면 ESCAPE 문자를 선언하고 와일드카드 앞에 붙이세요
  • 대소문자 구분은 엔진마다 다릅니다. 양쪽에 LOWER()를 적용하는 것이 이식 가능한 해결책입니다(PostgreSQL에서는 ILIKE를 사용할 수 있습니다)
  • 선행 와일드카드는 전체 스캔을 강제하지만, 시작점이 고정된 접두사는 인덱스를 사용할 수 있습니다

이스케이프하지 않은 _는 조용히 발생하는 오류입니다. 여전히 그럴듯한 행을 반환하기 때문입니다.

자주 묻는 질문

“LIKE, 와일드카드와 이스케이프” 강의는 무료인가요?

네 — “LIKE, 와일드카드와 이스케이프” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Coding Interview Prep 강의 전체를 잠금 해제할 수 있습니다. Coding Interview Prep 강의에는 총 4개의 강의가 포함되어 있습니다.

“LIKE, 와일드카드와 이스케이프”에서 뭘 배우나요?

패턴 일치, 퍼센트 기호와 밑줄의 차이, 리터럴 와일드카드 문자를 이스케이프하는 방법을 알아봅니다. 브라우저에서 직접 실행하는 실습 코드로 Coding Interview Prep을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

Coding Interview Prep을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 Coding Interview Prep은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 3번째 강의입니다.

“LIKE, 와일드카드와 이스케이프” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 Coding Interview Prep 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 Coding Interview Prep 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. AND와 OR의 우선순위 및 괄호 사용
  2. BETWEEN, IN과 포함 경계
  3. LIKE, 와일드카드와 이스케이프
  4. 계산된 값으로 필터링하기
← Coding Interview Prep(으)로 돌아가기