슬러그 생성기

모든 텍스트를 깔끔한 URL 친화적 슬러그로 변환

예시 시도
구분 기호

입력 텍스트

슬러그

로컬에서 실행 · 시크릿 붙여넣기 안전
슬러그가 여기 표시됩니다…

URL 슬러그란 무엇인가?

URL 슬러그는 웹 주소에서 특정 페이지를 사람이 읽을 수 있는 형태로 식별하는 부분입니다. https://example.com/blog/my-first-post라는 URL에서 슬러그는 my-first-post입니다. 슬러그 생성기는 페이지 제목이나 설명을 소문자, 숫자, 하이픈(또는 다른 선택한 구분 기호)만으로 구성된 문자열로 변환합니다. 이 과정에서 공백을 제거하고, 악센트와 발음 기호를 제거하며, 특수 문자를 삭제하고, 공백을 단일 구분 기호로 정규화합니다.

슬러그 생성은 콘텐츠 관리 시스템, 정적 사이트 생성기, 블로그 플랫폼, 그리고 사용자 입력에서 URL을 파생하는 모든 애플리케이션의 표준 단계입니다. WordPress, Ghost, Hugo, Next.js, Django는 모두 슬러그 생성 로직을 포함하고 있는데, 읽기 쉬운 URL이 사용성과 검색 엔진 최적화 모두를 향상시키기 때문입니다. 잘 구성된 슬러그는 링크를 클릭하기 전에 페이지의 내용이 무엇인지 사용자에게 알려줍니다.

"슬러그"라는 용어는 신문 출판에서 유래했으며, 제작 과정에서 기사를 식별하는 짧은 라벨을 가리켰습니다. 웹 개발에서 슬러그는 동일한 기능을 수행합니다. 더 긴 제목이나 이름에서 파생된 간결하고 고유한 URL 안전 식별자입니다. 슬러그는 프로그래밍적으로 파생되므로, 신뢰할 수 있는 슬러그 생성기는 모든 페이지와 로케일에서 일관성을 보장합니다.

이 슬러그 생성기를 사용해야 하는 이유

URL 슬러그를 수동으로 만드는 것은 오류가 발생하기 쉽습니다. 악센트 제거를 빠뜨리거나, 이중 하이픈을 남기거나, 유니코드 입력의 엣지 케이스를 놓치면 깨지거나 보기 흉한 URL이 생성될 수 있습니다. 이 도구는 그런 문제들을 자동으로 처리합니다.

즉각적인 변환
텍스트를 붙여넣거나 입력하면 슬러그가 실시간으로 업데이트됩니다. 폼 제출이나 페이지 새로고침이 필요 없습니다. 여러 기사 제목이나 상품명에 대한 슬러그가 필요할 때 유용합니다.
🔒
프라이버시 우선 처리
모든 슬러그 생성은 브라우저에서 실행됩니다. 텍스트가 페이지를 벗어나지 않으므로 초안 제목, 내부 프로젝트명, 미출시 상품명도 안전하게 변환할 수 있습니다.
⚙️
설정 가능한 출력
하이픈, 언더스코어, 점 구분 기호 중에서 선택하세요. 소문자 변환을 켜거나 끄세요. 다양한 프레임워크와 CMS에서 가장 일반적인 슬러그 규칙을 모두 지원합니다.
🌐
유니코드 및 악센트 처리
생성기는 NFD 정규화를 적용하여 악센트가 있는 문자에서 발음 기호를 제거합니다. Café는 cafe가 되고, naïve는 naive가 됩니다. 음역이 불가능한 비라틴 문자는 깔끔하게 제거됩니다.

슬러그 생성기 활용 사례

프론트엔드 개발자 — 라우트 계획
동적 라우트 세그먼트를 연결하기 전에 React Router, Next.js, Nuxt의 페이지 라우트에 사용할 일관된 슬러그를 생성하세요. 특수 문자가 포함된 제목이 깔끔한 경로를 생성하는지 확인하세요.
백엔드 엔지니어 — 데이터베이스 식별자
사람이 읽을 수 있는 식별자가 필요한 데이터베이스 레코드에 URL 안전 슬러그를 생성하세요. 슬러그는 /api/products/wireless-headphones 같은 REST API 엔드포인트에서 숫자 ID와 함께 보조 키로 잘 작동합니다.
DevOps — 설정 파일 이름 지정
서비스 이름이나 환경 레이블을 특수 문자가 허용되지 않는 설정 파일, Docker 이미지 태그, Kubernetes 리소스 이름에 사용할 파일 시스템 안전 문자열로 변환하세요.
QA 엔지니어 — 테스트 데이터 생성
테스트 케이스 제목에서 슬러그 변형을 빠르게 생성하여 스테이징 환경에서 URL 라우팅, 리다이렉트 규칙, 캐노니컬 태그 동작을 검증하세요.
데이터 엔지니어 — 컬럼 정규화
CSV 또는 Excel 가져오기의 지저분한 컬럼 헤더를 데이터베이스 스키마나 데이터 파이프라인에 사용할 일관된 snake_case 또는 kebab-case 식별자로 정규화하세요.
학생 — CMS 및 블로그 프로젝트
WordPress, Jekyll, 또는 직접 만든 CMS로 블로그를 구축할 때 슬러그 생성이 어떻게 작동하는지 배우세요. 이 도구를 사용하여 직접 만든 슬러그를 참조 구현과 비교해보세요.

슬러그 생성 규칙 및 문자 처리

슬러그 생성은 예측 가능한 변환 순서를 따릅니다. 각 단계를 이해하면 예상치 못한 출력을 디버깅하거나 직접 slugify 함수를 구축하는 데 도움이 됩니다.

  1. 1. 유니코드 정규화 (NFD)
    결합 문자를 기본 문자 + 결합 마크로 분해합니다. 예를 들어 é (U+00E9)는 e + 결합 예음 악센트 (U+0301)가 됩니다. 이로써 다음 단계에서 발음 기호를 제거할 수 있습니다.
  2. 2. 발음 기호 제거
    유니코드 결합 발음 기호 블록(U+0300–U+036F)의 모든 문자를 제거합니다. 이 단계 후 café는 cafe가 되고 Ñ은 N이 됩니다.
  3. 3. 특수 문자 제거
    문자, 숫자, 공백, 하이픈이 아닌 모든 문자를 공백으로 교체합니다. 구두점, 기호, ASCII에 해당하는 값이 없는 문자가 삭제됩니다.
  4. 4. 공백 정리 및 축소
    앞뒤 공백을 제거한 후, 연속된 공백, 언더스코어, 하이픈을 선택한 단일 구분 기호로 축소합니다.
  5. 5. 대소문자 및 구분 기호 적용
    소문자로 변환하고(선택 사항) 선택한 구분 기호 문자(하이픈(-), 언더스코어(_), 점(.))로 단어를 연결합니다.

문자 변환 참고표

아래 표는 슬러그 생성 중 일반적인 문자들이 어떻게 처리되는지 보여줍니다:

입력출력적용 규칙
Hello Worldhello-worldLowercase + space → hyphen
Café au Laitcafe-au-laitNFD normalization strips é → e
naïve résuménaive-resumeMultiple diacritics removed
Price: $9.99!price-9-99Symbols ($, !, :) removed
too many too-manyWhitespace trimmed and collapsed
one--two___threeone-two-threeMixed separators collapsed
Привет мирprivet-mirCyrillic (if transliteration) or removed
file_name.txtfile-name-txtDots and underscores replaced
React & Vuereact-vueAmpersand removed
2026-03-302026-03-30Digits and hyphens preserved

코드 예시

인기 있는 언어와 프레임워크에서의 슬러그 생성 예시입니다. 각 예시는 유니코드 정규화, 발음 기호 제거, 구분 기호 삽입을 처리합니다.

JavaScript
function slugify(text, separator = '-') {
  return text
    .normalize('NFD')                   // decompose accented chars
    .replace(/[\u0300-\u036f]/g, '')    // strip diacritics
    .toLowerCase()
    .replace(/[^\w\s-]/g, ' ')          // drop special chars
    .trim()
    .replace(/[\s_-]+/g, separator)     // collapse whitespace → separator

  // slugify('Café au Lait')      → "cafe-au-lait"
  // slugify('Hello World', '_')  → "hello_world"
}

// Node.js alternative using the `slugify` npm package:
// npm install slugify
// const slugify = require('slugify')
// slugify('Hello World', { lower: true, strict: true }) → "hello-world"
Python
import re
import unicodedata

def slugify(text: str, separator: str = '-') -> str:
    """Convert text to a URL-safe slug."""
    text = unicodedata.normalize('NFD', text)
    text = text.encode('ascii', 'ignore').decode('ascii')  # strip non-ASCII
    text = text.lower()
    text = re.sub(r'[^\w\s-]', ' ', text)
    text = text.strip()
    text = re.sub(r'[\s_-]+', separator, text)
    return text

# slugify('Café au Lait')      → "cafe-au-lait"
# slugify('Hello World', '_')  → "hello_world"

# Alternative: python-slugify (pip install python-slugify)
# from slugify import slugify
# slugify('Café au Lait')  → "cafe-au-lait"
Go
package main

import (
	"regexp"
	"strings"
	"unicode"

	"golang.org/x/text/unicode/norm"
	"golang.org/x/text/transform"
	"golang.org/x/text/runes"
)

func slugify(text string) string {
	// NFD normalize and strip diacritics
	t := transform.Chain(norm.NFD, runes.Remove(runes.In(unicode.Mn)), norm.NFC)
	result, _, _ := transform.String(t, text)

	result = strings.ToLower(result)
	re := regexp.MustCompile(`[^\w\s-]+`)
	result = re.ReplaceAllString(result, " ")
	result = strings.TrimSpace(result)
	re = regexp.MustCompile(`[\s_-]+`)
	result = re.ReplaceAllString(result, "-")
	return result
}

// slugify("Café au Lait") → "cafe-au-lait"
// slugify("Hello World")  → "hello-world"
PHP
function slugify(string $text, string $separator = '-'): string {
    // Transliterate non-ASCII characters
    $text = transliterator_transliterate(
        'Any-Latin; Latin-ASCII; Lower()', $text
    );
    // Remove anything that is not a word char, space, or hyphen
    $text = preg_replace('/[^\w\s-]/', ' ', $text);
    $text = trim($text);
    $text = preg_replace('/[\s_-]+/', $separator, $text);
    return $text;
}

// slugify('Café au Lait')      → "cafe-au-lait"
// slugify('Hello World', '_')  → "hello_world"

자주 묻는 질문

슬러그와 URL 경로의 차이점은 무엇인가요?
URL 경로는 도메인 이후의 전체 세그먼트입니다. 예를 들어 /blog/2026/my-post와 같습니다. 슬러그는 해당 경로 내에서 특정 리소스를 식별하는 사람이 읽을 수 있는 부분으로, 일반적으로 마지막 세그먼트인 my-post입니다. 슬러그는 주로 제목에서 파생되는 반면, 경로의 나머지 부분은 사이트의 라우팅 구조를 반영합니다.
슬러그 생성에서 한국어나 아랍어 같은 비라틴 문자는 어떻게 처리되나요?
NFD 정규화와 발음 기호 제거를 사용하는 표준 슬러그 생성기는 비라틴 문자를 음역할 수 없습니다. 한자나 아랍 문자는 ASCII에 해당하는 값이 없으므로 특수 문자 정리 단계에서 제거됩니다. 슬러그에 비라틴 콘텐츠를 보존하려면 limax(JavaScript), unidecode 백엔드를 사용하는 python-slugify, 또는 사용자 정의 매핑 테이블 같은 음역 라이브러리가 필요합니다.
URL 슬러그에 하이픈과 언더스코어 중 어떤 것을 사용해야 하나요?
Google은 하이픈을 단어 구분 기호로 처리하지만 언더스코어는 단어 연결 기호로 처리합니다. 슬러그 my-first-post는 세 단어(my, first, post)로 읽히는 반면, my_first_post는 하나의 토큰으로 읽힙니다. SEO 목적으로는 하이픈이 URL 슬러그의 표준 선택입니다. 언더스코어는 변수 안전 연결자로 사용되는 파일명, 데이터베이스 컬럼, 프로그래밍 식별자에서 일반적입니다.
URL 슬러그는 얼마나 길어야 하나요?
Google은 검색 결과에서 URL의 약 60자를 표시한 후 잘라냅니다. 짧은 슬러그가 읽고, 공유하고, 입력하기 더 쉽습니다. 3~6개의 단어를 목표로 하세요. 의미를 바꾸지 않는 불용어(the, a, an, and, or, in)를 제거하세요. how-to-build-nextjs-app이 how-to-build-a-next-js-app-in-2026보다 낫습니다.
슬러그 생성이 URL 인코딩과 같은 건가요?
아니요. URL 인코딩(퍼센트 인코딩)은 안전하지 않은 문자를 공백의 경우 %20처럼 퍼센트 기호 트리플렛으로 교체합니다. 슬러그 생성은 안전하지 않은 문자를 완전히 제거하거나 교체하여, 인코딩 아티팩트 없이 깔끔한 문자열을 생성합니다. 슬러그는 퍼센트 기호, 공백, 특수 문자를 절대 포함하지 않습니다. URL 인코딩은 원본 콘텐츠를 보존하는 반면, 슬러그 생성은 새로운 것으로 변환합니다.
두 개의 다른 제목이 같은 슬러그를 생성할 수 있나요?
네. 구두점, 악센트, 대소문자만 다른 제목은 종종 같은 슬러그로 축소됩니다. 예를 들어 Résumé Tips와 Resume Tips는 모두 resume-tips를 생성합니다. CMS 또는 데이터베이스 환경에서는 충돌이 발생할 때 숫자 접미사(resume-tips-2)를 추가하는 고유성 검사가 필요합니다.
WordPress 또는 Django에서 슬러그를 어떻게 생성하나요?
WordPress는 sanitize_title()을 사용하여 게시물 제목에서 자동으로 슬러그를 생성합니다. 게시물 편집기에서 슬러그를 수정할 수 있습니다. Django는 django.utils.text에 slugify() 함수를 제공하며, ASCII 입력을 잘 처리합니다. 유니코드 지원을 위해서는 allow_unicode=True를 전달하세요. 두 플랫폼 모두 전체 제목과 함께 데이터베이스에 슬러그를 저장합니다.