텍스트 Slugify (URL)

텍스트를 URL에 친화적인 slug로 정규화합니다. 소문자 변환, 구분자 지정, 사용자 정의 불용어 제거를 지원합니다.

파라미터 및 입력

- 또는 _를 사용하는 것이 권장되며, 길이는 1~3자로 설정하세요

결과

왜 Slugify가 필요한가요?

🔍 SEO 최적화

URL 내 키워드는 검색 엔진이 페이지 내용을 이해하고 순위를 높이는 데 도움이 됩니다. 예: example.com/blog/how-to-learn-javascript 는 example.com/blog/123 보다 더 친화적입니다.

👁️ 가독성 및 공유

사용자는 URL만 보고도 콘텐츠를 바로 파악할 수 있으며, 소셜 미디어 공유 시 더 친화적이고 기억하기 쉽고 수동 입력도 편리합니다.

💻 시스템 호환성

특수 문자로 인한 파일명/URL 오류를 방지하고, Windows/Linux/Mac 등 다양한 플랫폼에서 호환되며 인코딩 문제를 피합니다.

🗄️ 데이터베이스 친화적

사용자명, 태그 등 고유 식별자로 사용 시 SQL 인젝션 리스크를 줄이고, 인덱싱 및 쿼리가 용이합니다.

Slugify란 무엇인가요?

Slug는 텍스트를 표준화하여 URL, 파일명, 식별자로 사용하는 짧은 문자열입니다. 일반적인 처리 방법으로는 대소문자 통일, 구두점 제거, 단어 간 구분자 연결이 있습니다.

  • ASCII 우선: 악센트 및 기호를 최대한 제거하고 알파벳, 숫자, 공백만 유지
  • Unicode 호환: 대부분의 언어 문자를 NFKD 표준화 후 처리
  • URL 친화적: 결과는 알파벳, 숫자, 구분자만 포함되어 경로에 바로 사용 가능

사용 사례

블로그 글 URL

자바스크립트를 어떻게 배우나요?

how-to-learn-javascript

파일명

제품 요구사항 문서 v2.0.docx

product-requirements-v2-0.docx

데이터베이스 식별자

사용자-张三

user-zhang-san

자주 묻는 질문

Q: 중국어 문자는 어떻게 처리되나요?

A: 기본적으로 음표는 제거되고 핑inyin 문자만 유지됩니다. 완전한 중국어는 빈 문자열이 될 수 있으므로, slugify 전에 먼저 수동으로 핑inyin으로 변환하거나 중국어 핑inyin 변환 도구를 사용하는 것을 권장합니다.

Q: 결과가 비어 있는 이유는 무엇인가요?

A: 입력된 내용이 모두 문장 부호/기호/공백일 수 있으며, 정지어 필터링을 활성화한 후 남은 단어가 없을 수도 있습니다. 정지어 옵션을 비활성화하거나 입력 내용을 조정해 보세요.

Q: 구분자로 - 와 _ 중 어떤 것을 사용해야 하나요?

A: SEO 관점에서는 - (하이픈)을 사용하는 것이 좋습니다. Google은 이를 공백으로 인식하지만, _ (밑줄)은 연결 기호로 인식되어 단어 분리에 불리합니다. 파일명의 경우 어느 것을 사용해도 상관없습니다.

Q: Slug의 길이에 제한이 있나요?

A: 기술적으로 제한은 없지만, URL 표시 및 SEO를 위해 50자 이내로 유지하는 것이 좋습니다. 너무 긴 slug는 검색 엔진에 의해 자르힐 수 있습니다.

최선의 실천 방법

권장 사항

  • 짧게 유지하세요 (50자 미만 권장)
  • 특수 문자는 사용하지 말고, 알파벳, 숫자, 구분자만 사용하세요
  • 대소문자 민감성 문제를 피하기 위해 소문자로 변환하세요
  • 의미 밀도를 높이기 위해 정지어를 제거하세요

피해야 할 사항

  • 민감한 정보(예: ID, 이메일, 비밀번호)를 포함하지 마세요
  • 특수 문자(@#$%^&*)를 사용하지 마세요
  • 공백이나 연속된 구분자를 유지하지 마세요
  • 같은 단어를 반복해서 사용하지 마세요

기술 설명

유니코드 정규화:

NFKD 분해 + 조합 음표(\p{M}) 제거를 사용하여 Café를 Cafe로 변환합니다. 대부분의 라틴어 계열 문자를 지원합니다.

정지어 목록:

영어 일반 단어(a/an/the/and/or/of/to/in/on/for/at/by/with) 기반으로 구성되며, 사용자가 확장할 수 있습니다. 중국어 정지어는 별도 처리가 필요합니다.

브라우저 호환성:

ES6+ 및 유니코드 정규식(\p{...}) 지원이 필요합니다. 최신 브라우저(Chrome 64+, Firefox 78+, Safari 11.1+)는 모두 지원합니다.

프로그래밍 언어를 사용하여 Slug를 생성하는 방법

JavaScript

function slugify(text) {
  return text
    .toLowerCase()
    .normalize("NFKD")
    .replace(/[\u0300-\u036f]/g, "")
    .replace(/[^\w\s-]/g, "")
    .trim()
    .replace(/[\s_-]+/g, "-")
    .replace(/^-+|-+$/g, "");
}

PHP

function slugify($text) {
  $text = mb_strtolower($text);
  $text = iconv("UTF-8", "ASCII//TRANSLIT", $text);
  $text = preg_replace("/[^\w\s-]/", "", $text);
  $text = preg_replace("/[\s_-]+/", "-", $text);
  return trim($text, "-");
}

Python

import re
import unicodedata

def slugify(text):
    text = text.lower()
    text = unicodedata.normalize("NFKD", text)
    text = text.encode("ascii", "ignore").decode("ascii")
    text = re.sub(r"[^\w\s-]", "", text)
    text = re.sub(r"[\s_-]+", "-", text)
    return text.strip("-")

Go

import (
    "regexp"
    "strings"
    "golang.org/x/text/unicode/norm"
)

func Slugify(text string) string {
    text = strings.ToLower(text)
    text = norm.NFKD.String(text)
    re := regexp.MustCompile(`[^\w\s-]`)
    text = re.ReplaceAllString(text, "")
    re = regexp.MustCompile(`[\s_-]+`)
    text = re.ReplaceAllString(text, "-")
    return strings.Trim(text, "-")
}

Ruby

require "unicode"

def slugify(text)
  text = text.downcase
  text = Unicode.nfkd(text).gsub(/[^\x00-\x7F]/, "")
  text = text.gsub(/[^\w\s-]/, "")
  text = text.gsub(/[\s_-]+/, "-")
  text.strip.gsub(/^-+|-+$/, "")
end

Java

import java.text.Normalizer;

public static String slugify(String text) {
    text = text.toLowerCase();
    text = Normalizer.normalize(text, Normalizer.Form.NFKD);
    text = text.replaceAll("[^\\w\\s-]", "");
    text = text.replaceAll("[\\s_-]+", "-");
    return text.replaceAll("^-+|-+$", "");
}