프로그래밍의 네이밍 컨벤션 — camelCase, snake_case, 그리고 그 너머
처음으로 코드베이스를 열었을 때 같은 파일에서 getUserName, get_user_name, GetUserName을 모두 발견합니다. 즉시 무언가 잘못되었다는 것을 알 수 있습니다. 네이밍 컨벤션은 팀에서 일하기 전까지는 사소해 보이지만, 그 순간부터 필수적인 것이 됩니다.
일관된 명명은 개인적인 선호의 문제가 아닙니다. 다음에 그 코드를 만질 사람 — 종종 6개월 후의 자기 자신 — 이 읽을 수 있게 만드는 것입니다.
네이밍 컨벤션이 중요한 이유
프로젝트에 일관된 명명이 없으면 세 가지가 무너집니다:
- 가독성이 떨어진다 — 변수 스타일이 몇 줄마다 바뀌면 두뇌가 로직을 이해하는 대신 형식을 파싱하는 데 사이클을 낭비합니다
- 팀 협업이 분열된다 — 풀 리퀘스트가 내용이 아닌 스타일에 대한 전쟁터가 됩니다. 예측 가능한 패턴이 없어 새로운 개발자 온보딩에 시간이 더 걸립니다
- 도구가 제대로 작동하지 않는다 — 린터, 자동완성, 코드 생성기, 리팩토링 도구 모두 예측 가능한 명명 패턴에 의존합니다
어떤 컨벤션을 선택하느냐보다 하나를 선택하고 그것을 지키는 것이 훨씬 중요합니다. 일관된 snake_case가 있는 코드베이스가 세 가지 다른 스타일을 혼합한 것보다 무한히 좋습니다.
네이밍 컨벤션 완전 가이드
camelCase
첫 번째 단어는 소문자이고 이후 각 단어는 대문자로 시작합니다. 구분자가 없습니다.
// JavaScript / TypeScript
const userName = "Alice";
let itemCount = 42;
function getUserProfile(userId) {
return fetchData(`/users/${userId}`);
}
사용되는 곳: JavaScript, TypeScript, Java는 변수, 함수명, 메서드명에 camelCase를 사용합니다. Swift에서도 로컬 변수와 함수 매개변수의 기본값입니다.
PascalCase
모든 단어가 대문자로 시작합니다. UpperCamelCase라고도 합니다.
// TypeScript / C#
class UserProfile {
firstName: string;
lastName: string;
}
interface DatabaseConnection {
host: string;
port: number;
}
// React 컴포넌트
function NavigationBar({ items }: NavProps) {
return <nav>{/* ... */}</nav>;
}
사용되는 곳: C#은 공개 항목 거의 전부에 PascalCase를 사용합니다 — 클래스, 메서드, 속성. TypeScript와 JavaScript는 클래스, 인터페이스, 타입 별칭, 열거형에 사용합니다. React는 JSX가 컴포넌트와 HTML 요소를 구분해야 하기 때문에 컴포넌트 이름에 PascalCase를 의무화합니다.
Go에서 PascalCase는 특별한 의미를 갖습니다: 대문자로 시작하는 식별자는 내보내기(공개)됩니다.
snake_case
모든 단어가 소문자이고 밑줄로 구분됩니다.
# Python
user_name = "Alice"
item_count = 42
def get_user_profile(user_id):
return fetch_data(f"/users/{user_id}")
class UserProfile:
def __init__(self, first_name, last_name):
self.first_name = first_name
self.last_name = last_name
사용되는 곳: Python은 클래스 이름을 제외한 거의 모든 것에 snake_case를 사용합니다. Ruby도 같은 패턴을 따릅니다. Rust는 변수, 함수, 모듈에 snake_case를 사용합니다. 데이터베이스 스키마는 거의 보편적으로 테이블과 컬럼 이름에 snake_case를 사용합니다.
SCREAMING_SNAKE_CASE
전부 대문자에 밑줄 구분. 절대 변경해서는 안 되는 상수와 값에 예약되어 있습니다.
// 대부분의 언어에서의 상수
const MAX_RETRY_COUNT = 3;
const API_BASE_URL = "https://api.example.com";
const DEFAULT_TIMEOUT_MS = 5000;
사용되는 곳: 거의 모든 언어가 상수에 SCREAMING_SNAKE_CASE를 사용합니다. 전체 대문자 형식은 "이 값을 재할당하지 마세요"라는 보편적인 신호입니다.
kebab-case
전부 소문자에 하이픈을 구분자로 사용.
/* CSS 클래스 이름 */
.navigation-bar {
background-color: #1a1a2e;
}
.user-profile-card {
border-radius: 8px;
}
# CLI 플래그
npm install --save-dev eslint
git commit --no-verify
사용되는 곳: CSS와 HTML은 kebab-case를 강력히 선호합니다. URL 슬러그에 사용됩니다. CLI 도구와 커맨드라인 플래그도 이를 따릅니다.
대부분의 프로그래밍 언어에서 하이픈이 빼기 연산자로 해석되므로 kebab-case를 변수 이름에 사용할 수 없습니다.
dot.case
단어를 점으로 구분합니다.
// Java 패키지 이름
package com.example.userservice.controllers;
import org.springframework.boot.SpringApplication;
사용되는 곳: Java 패키지 명명, 파일 확장자, Spring Boot 등의 프레임워크 설정 속성 키.
Title Case
각 주요 단어가 대문자로 시작합니다. "and", "the", "of" 같은 부차적인 단어는 구문을 시작하지 않는 한 소문자로 유지됩니다.
사용되는 곳: UI 제목, 페이지 타이틀, 메뉴 항목, 문서 섹션, 고유 명사.
path/case
단어를 슬래시로 구분하며 파일 시스템이나 네임스페이스 컨벤션을 따릅니다.
사용되는 곳: 파일 시스템 경로, 모듈 경로, 네임스페이스 계층, URL 라우팅 구조.
언어별 컨벤션 표
| 언어 | 변수 / 함수 | 클래스 / 타입 | 상수 | 파일 |
|---|---|---|---|---|
| JavaScript / TypeScript | camelCase | PascalCase | SCREAMING_SNAKE_CASE | kebab-case 또는 camelCase |
| Python | snake_case | PascalCase | SCREAMING_SNAKE_CASE | snake_case |
| Go | camelCase (비공개) | PascalCase (공개) | PascalCase 또는 ALL_CAPS | snake_case |
| Rust | snake_case | PascalCase | SCREAMING_SNAKE_CASE | snake_case |
| Java | camelCase | PascalCase | SCREAMING_SNAKE_CASE | PascalCase |
| C# | camelCase (비공개) | PascalCase (공개) | PascalCase | PascalCase |
| Ruby | snake_case | PascalCase | SCREAMING_SNAKE_CASE | snake_case |
| CSS | kebab-case | — | — | kebab-case |
| SQL | snake_case (컬럼) | — | 대문자 (키워드) | snake_case |
| PHP | camelCase | PascalCase | SCREAMING_SNAKE_CASE | PascalCase |
흔한 실수와 해결 방법
1. 같은 스코프에서 컨벤션 혼합
// ❌ 비일관적
const user_name = "Alice";
const itemCount = 42;
const MaxRetries = 3;
// ✅ 일관된 camelCase
const userName = "Alice";
const itemCount = 42;
const maxRetries = 3;
2. 언어에 맞지 않는 컨벤션 사용
# ❌ Python에서 camelCase 사용
def getUserProfile(userId):
userName = fetchUser(userId)
return userName
# ✅ Python이 기대하는 snake_case 사용
def get_user_profile(user_id):
user_name = fetch_user(user_id)
return user_name
3. 약어와 두문자어
// ❌ 두문자어 처리 비일관
const XMLParser = new XmlParser();
const htmlToJSON = convert(HTMLString);
// ✅ 두문자어를 단어로 처리
const xmlParser = new XmlParser();
const htmlToJson = convert(htmlString);
4. is/has/can 접두사 없는 불리언 이름
// ❌ 모호한 불리언
const active = true;
// ✅ 명확한 불리언 의도
const isActive = true;
컨벤션 간 자동 변환
언어를 넘나들며 작업할 때 네이밍 컨벤션을 수동으로 변환하는 것은 지루하고 오류가 발생하기 쉽습니다.
우리의 문자열 케이스 변환기가 이를 자동으로 처리합니다. 아무 식별자나 붙여넣고 한 번의 클릭으로 camelCase, PascalCase, snake_case, kebab-case 등으로 변환하세요.
관련 글
- JSON 포맷팅 모범 사례 — 변수 명명만큼 깔끔하게 데이터를 구조화하기
- 정규표현식 치트시트 — 검증과 텍스트 처리를 위한 패턴 매칭 참조
- SQL 포맷팅 모범 사례 — 읽기 쉬운 SQL 쿼리 작성하기
네이밍 컨벤션을 자동으로 변환할 준비가 되셨나요? 문자열 케이스 변환기를 사용해 보세요 — 아무 식별자나 붙여넣고 camelCase, snake_case, PascalCase, kebab-case 등으로 변환하세요. 가입 불필요, 서버로 데이터 전송 없음, 완전 무료.