변수명 작성 가이드 접두사와 접미사 활용법칙

개요

개발에서 명확하고 일관성 있는 변수명은 코드의 가독성과 유지보수성을 크게 향상시킨다. 이때 변수명에 대해서 제대로 작성되지 않으면 유지보수가 매우 어렵다. 이를 위해서는 꼭 팀 내부적으로 결정해야하는접두사와 접미사들이 있다. 꼭 팀 내부적으로 결정하거나 최근에는 cursor rule이나 system.md로 만들어서 ai들에게도 공유가 필요하다.

1. Boolean 값을 나타내는 접두사

Boolean 변수는 true/false 값을 가지므로, 질문 형태의 접두사를 사용하여 직관적으로 표현합니다.

접두사사용 목적예제설명
is상태나 속성을 나타낼 때isLoading, isVisible, isActive, isValidated, isAuthenticated가장 일반적인 Boolean 접두사
has소유나 포함 관계를 나타낼 때hasPermission, hasDiscount, hasChildren, hasError, hasNextPage무언가를 가지고 있는지 표현
can능력이나 권한을 나타낼 때canEdit, canDelete, canAccess, canSubmit, canRefresh할 수 있는지 없는지를 표현

Boolean 접두사 사용 예시

// 상태 관리
const isLoading = true;
const isFormValid = checkFormValidation();
const hasUnsavedChanges = checkForChanges();
const canSubmitForm = isFormValid && !hasUnsavedChanges;

// 권한 체크
const canViewProfile = user.permissions.includes('view_profile');

2. 데이터 조작 함수의 접두사

데이터를 다루는 함수들은 그 동작 방식과 특성에 따라 접두사를 구분하여 사용합니다.

데이터 가져오기 (Retrieval)

접두사사용 목적예제상세 설명
get이미 존재하는 데이터를 즉시 반환getUserData(), getStoredValue(), getCurrentTime()동기적으로 즉시 사용 가능한 데이터
fetch외부 API나 원격 서버에서 데이터 요청fetchUserProfile(), fetchProducts(), fetchWeatherData()비동기적으로 네트워크 통신이 필요한 경우
load화면 렌더링이나 초기화와 함께 데이터 로딩loadDashboard(), loadUserInterface(), loadPageContent()UI 변경을 동반하는 데이터 로딩

데이터 수정하기 (Modification)

접두사사용 목적예제상세 설명
set값을 설정하거나 교체setUser(), setConfiguration(), setTheme()완전히 새로운 값으로 덮어쓰기
update기존 값의 일부를 수정updateProfile(), updateStatus(), updatePassword()부분적인 변경사항 적용

데이터 추가/제거 (Addition/Removal)

접두사사용 목적예제상세 설명
add새로운 데이터 추가addUser(), addToCart(), addComment()기존에 없던 새로운 항목 추가
remove데이터 제거removeUser(), removeFromCart()특정 항목을 찾아서 제거
delete데이터 완전 삭제deleteAccount(), deleteFile()영구적인 삭제 작업
clear전체 데이터 비우기clearCache(), clearForm(), clearHistory()모든 데이터를 한번에 제거

3. 조건과 필터링을 나타내는 접두사/접미사

데이터를 특정 조건에 따라 필터링하거나 그룹화할 때 사용하는 패턴입니다.

패턴사용 목적예제설명
by특정 기준으로 그룹화productsByCategory, usersByRole, ordersByDate, salesByRegion기준점을 명확히 표현
from특정 출처나 시점부터ordersFromLastMonth, usersFromKorea, dataFromAPI, messagesFromToday시작점이나 출처를 나타냄
to특정 대상이나 종점까지emailsToAdmin, transferToAccount, redirectToLogin목적지나 대상을 표현
above특정 값보다 큰scoresAboveAverage, pricesAbove100, usersAboveAge18초과 조건

필터링 예시

// 조건별 데이터 필터링
const productsByCategory = filterProductsByCategory('electronics');
const ordersFromLastWeek = getOrdersFromDateRange(lastWeek, today);
const highValueCustomers = getCustomersWithinSpendingRange(1000, 10000);
const recentActiveUsers = getUsersAboveActivityScore(80);

// 복합 조건 예시
const premiumUsersFromSeoul = users
  .filter(user => user.city === 'Seoul')
  .filter(user => user.subscriptionType === 'premium');

4. 컬렉션과 자료구조를 나타내는 접미사

데이터의 구조와 타입을 명확하게 표현하는 접미사들입니다.

접미사사용 목적예제설명
Array배열 구조 강조numberArray, stringArray, objectArray배열임을 명확히 표현
Map키-값 쌍의 맵 구조userMap, configMap, categoryMapMap 객체나 딕셔너리
Set중복 없는 집합uniqueIdsSet, tagSet, permissionSetSet 객체나 고유값 집합
Queue선입선출 구조taskQueue, messageQueue, printQueue큐 자료구조
Stack후입선출 구조operationStack, navigationStack스택 자료구조
Tree트리 구조categoryTree, organizationTree, menuTree계층적 구조
Graph그래프 구조relationshipGraph, networkGraph노드와 엣지로 구성된 그래프

컬렉션 접미사 사용 예시

// 명확한 자료구조 표현
const activeUserList = users.filter(user => user.isActive);
const productCategoryMap = new Map([
  ['electronics', electronicsProducts],
  ['clothing', clothingProducts]
]);

const uniqueTagsSet = new Set(allTags);
const taskQueue = new Queue();
const navigationStack = [];

// 복잡한 데이터 구조
const departmentTree = {
  name: 'Company',
  children: [
    { name: 'Engineering', children: [] },
    { name: 'Marketing', children: [] }
  ]
};

5. 상태와 단계를 나타내는 접미사

애플리케이션의 상태나 처리 단계를 표현할 때 사용하는 접미사들입니다.

접미사사용 목적예제설명
Status현재 상태connectionStatus, paymentStatus, orderStatus현재의 상태 정보
State상태 객체applicationState, gameState, formState상태를 관리하는 객체
Mode동작 모드editMode, viewMode, debugMode시스템의 동작 방식
Type타입이나 종류userType, messageType, errorType분류나 유형

6. 시간과 관련된 접두사/접미사

시간, 날짜, 기간과 관련된 변수명에 사용하는 패턴들입니다.

패턴사용 목적예제설명
start시작 시점startTime, startDate, sessionStart시작을 나타냄
end종료 시점endTime, endDate, sessionEnd종료를 나타냄
last마지막 또는 이전lastLogin, lastUpdate, lastModified가장 최근의 과거
next다음nextUpdate, nextSchedule, nextId앞으로 올 것
current현재currentTime, currentUser, currentPage지금 현재의 상태
previous이전previousValue, previousPage, previousUser바로 앞의 상태

시간 관련 예시

// 시간 관련 변수들
const sessionStartTime = new Date();
const loginTimeout = 30 * 60 * 1000; // 30분
const autoSaveInterval = 5 * 60 * 1000; // 5분
const lastBackupDate = getLastBackupDate();
const nextScheduledMaintenance = calculateNextMaintenance();

// 기간 계산
const sessionDuration = Date.now() - sessionStartTime;
const processingDelay = Math.random() * 1000; // 0-1초 랜덤 지연

7. 이벤트와 콜백 함수 네이밍

사용자 상호작용이나 시스템 이벤트를 처리하는 함수들의 명명 규칙입니다.

패턴사용 목적예제설명
on이벤트 핸들러onClick, onSubmit, onLoad, onError이벤트가 발생했을 때
handle이벤트 처리 함수handleClick, handleSubmit, handleError이벤트를 처리하는 함수
before사전 처리beforeSubmit, beforeClose, beforeSave작업 전에 실행
after사후 처리afterSubmit, afterLoad, afterSave작업 후에 실행
when조건부 실행whenReady, whenComplete, whenError특정 조건일 때

이벤트 핸들러 예시

// React 컴포넌트의 이벤트 핸들러
const handleFormSubmit = (event) => {
  event.preventDefault();
  validateForm();
};

const onUserLogin = (userData) => {
  updateUserState(userData);
  redirectToProfile();
};

// 생명주기 이벤트
const beforePageUnload = () => {
  saveUnsavedChanges();
};

const afterDataLoad = () => {
  hideLoadingSpinner();
  renderUserInterface();
};

8. 유틸리티와 헬퍼 함수

재사용 가능한 유틸리티 함수들의 명명 패턴입니다.

패턴사용 목적예제설명
format데이터 형식 변환formatDate, formatCurrency, formatPhoneNumber표시 형식으로 변환
parse문자열을 객체로 변환parseJSON, parseDate, parseURL파싱 작업
validate유효성 검사validateEmail, validatePassword, validateForm검증 함수
convert단위나 타입 변환convertToString, convertCurrency, convertUnit단위 변환
build복잡한 객체 구성buildQuery, buildComponent, buildConfiguration조립이나 구성

9. API와 네트워크 관련 네이밍

외부 서비스와의 통신이나 네트워크 작업에 사용하는 패턴들입니다.

패턴사용 목적예제설명
request요청 보내기requestUserData, requestPermissionAPI 요청
response응답 받기handleResponse, parseResponseAPI 응답 처리
callAPI 호출callUserAPI, callPaymentService서비스 호출
send데이터 전송sendMessage, sendAnalytics데이터 송신
receive데이터 수신receiveMessage, receiveUpdate데이터 수신
upload파일 업로드uploadImage, uploadDocument파일 업로드
download파일 다운로드downloadFile, downloadReport파일 다운로드
sync동기화syncData, syncUserPreferences데이터 동기화

API 관련 예시

// API 통신 관련 함수들
const requestUserProfile = async (userId) => {
  const response = await api.get(`/users/${userId}`);
  return response.data;
};

const uploadProfileImage = async (imageFile) => {
  const formData = new FormData();
  formData.append('image', imageFile);
  return await api.post('/upload/profile', formData);
};

const syncUserPreferences = async () => {
  const localPrefs = getLocalPreferences();
  const serverPrefs = await requestServerPreferences();
  return mergePreferences(localPrefs, serverPrefs);
};

10. 성능과 최적화 관련 네이밍

성능 향상이나 최적화와 관련된 변수명 패턴들입니다.

패턴사용 목적예제설명
cache캐시 관련userCache, imageCache, cacheKey캐싱 시스템
buffer버퍼 관련dataBuffer, audioBuffer, writeBuffer임시 저장소
pool객체 풀connectionPool, threadPool, objectPool재사용 가능한 자원들
lazy지연 로딩lazyLoadImages, lazyInitialization필요할 때 로딩
preload사전 로딩preloadAssets, preloadNextPage미리 로딩
throttle실행 제한throttledUpdate, throttleApiCalls실행 빈도 제한
debounce실행 지연debouncedSearch, debounceInput연속 실행 방지
memo메모이제이션memoizedResult, memoizeFunction결과 캐싱

11. 에러와 예외 처리 네이밍

오류 처리와 예외 상황을 다루는 변수명 패턴들입니다.

패턴사용 목적예제설명
error에러 객체validationError, networkError, authError에러 정보
exception예외 상황handleException, customException예외 처리
fail실패 관련onFail, failureCallback, failedAttempts실패 상황
retry재시도 관련retryCount, retryAttempt, maxRetries재시도 로직
fallback대안 방법fallbackValue, fallbackFunction대체 방안
recovery복구 관련recoveryMode, dataRecovery오류 복구

에러 처리 예시

// 에러 처리 패턴
const maxRetryAttempts = 3;
let currentRetryCount = 0;

const handleNetworkError = (error) => {
  if (currentRetryCount < maxRetryAttempts) {
    currentRetryCount++;
    retryRequest();
  } else {
    showFallbackContent();
  }
};

const fallbackUserData = {
  name: 'Guest',
  role: 'visitor'
};

12. 보안과 권한 관련 네이밍

보안, 인증, 권한과 관련된 변수명 패턴들입니다.

패턴사용 목적예제설명
auth인증 관련authToken, authStatus, authUser인증 정보
permission권한 관련userPermissions, hasPermission권한 체크
role역할 관련userRole, adminRole, roleBasedAccess사용자 역할
secret보안 정보apiSecret, secretKey (주의: 실제로는 환경변수 사용)민감한 정보
token토큰 관련accessToken, refreshToken, jwtToken인증 토큰
secure보안 관련secureConnection, secureStorage보안 기능
encrypted암호화 관련encryptedData, encryptedPassword암호화된 데이터

13. 실무에서의 네이밍 베스트 프랙티스

일관성 유지하기

// 좋은 예: 일관된 패턴
const fetchUserData = async () => { /* API 호출 */ };
const fetchProductData = async () => { /* API 호출 */ };
const fetchOrderData = async () => { /* API 호출 */ };

// 나쁜 예: 혼재된 패턴
const getUserData = async () => { /* API 호출 */ };
const fetchProductData = async () => { /* API 호출 */ };
const loadOrderData = async () => { /* API 호출 */ };

의미 있는 구체성

// 좋은 예: 구체적이고 명확한 이름
const submitPaymentForm = () => { /* 결제 양식 제출 */ };
const validateEmailAddress = (email) => { /* 이메일 검증 */ };
const calculateShippingCost = (weight, distance) => { /* 배송비 계산 */ };

// 나쁜 예: 모호하고 일반적인 이름
const submit = () => { /* 무엇을 제출하는지 불명확 */ };
const validate = (input) => { /* 무엇을 검증하는지 불명확 */ };
const calculate = (a, b) => { /* 무엇을 계산하는지 불명확 */ };

팀 컨벤션 따르기

팀에서 합의된 네이밍 컨벤션을 문서화하고 일관되게 적용하는 것이 중요합니다. 코드 리뷰 시에도 네이밍 컨벤션을 체크 포인트로 포함시켜 품질을 유지할 수 있습니다.

결론

체계적인 변수명 작성은 코드의 가독성과 유지보수성을 크게 향상시킵니다. 위에서 제시한 패턴들을 참고하여 프로젝트의 성격에 맞는 네이밍 컨벤션을 정립하고, 팀 전체가 일관되게 적용한다면 더욱 품질 높은 코드를 작성할 수 있을 것입니다.

중요한 것은 한 번 정한 컨벤션을 지속적으로 유지하고, 새로운 팀원이 합류했을 때도 쉽게 이해할 수 있도록 문서화하는 것입니다.

위 내용 기반 커서rule

Overview

You MUST follow these naming conventions when generating code. Consistent variable naming significantly improves code readability and maintainability.

1. Boolean Variable Naming (MANDATORY)

Use ONLY these 3 prefixes:

// ✅ Correct Boolean naming
const isLoading = true;           // state/property
const hasPermission = false;      // ownership/inclusion
const canEdit = true;            // ability/permission

// ❌ FORBIDDEN
const shouldUpdate = true;        // replace with is or can
const willComplete = false;       // predictions are inaccurate
const wasModified = true;         // focus on current state

Patterns:

  • is + adjective: state or property (isActive, isVisible, isValid)
  • has + noun: ownership or inclusion (hasChildren, hasError, hasData)
  • can + verb: ability or permission (canDelete, canAccess, canSubmit)

2. Data Manipulation Function Naming

Data Retrieval

// ✅ Clear distinctions
const getUserData = () => { /* synchronous, immediate return */ };
const fetchUserProfile = async () => { /* asynchronous, API call */ };
const loadDashboard = () => { /* loading with UI changes */ };

Data Modification/Manipulation

// ✅ Correct verb usage
const setUser = (user) => { /* complete replacement */ };
const updateProfile = (changes) => { /* partial modification */ };
const addToCart = (item) => { /* add new item */ };
const removeFromCart = (itemId) => { /* remove specific item */ };
const deleteAccount = () => { /* permanent deletion */ };
const clearHistory = () => { /* clear everything */ };

3. Conditional and Filtering Naming

// ✅ Clear conditional expressions
const productsByCategory = filterProducts('category', 'electronics');
const ordersFromLastWeek = getOrders({ startDate: lastWeek });
const emailsToAdmin = messages.filter(msg => msg.recipient === 'admin');
const scoresAboveAverage = scores.filter(score => score > average);

Patterns:

  • by + criteria: grouping criteria
  • from + source/timepoint: starting point or source
  • to + target: destination or target
  • above/below + reference: comparison conditions

4. Collection Type Specification

// ✅ Clearly express data structures
const userArray = [user1, user2, user3];
const categoryMap = new Map([['id1', 'Electronics']]);
const uniqueTagsSet = new Set(['react', 'javascript']);
const taskQueue = new Queue();
const navigationStack = [];
const menuTree = { name: 'root', children: [] };
const socialGraph = { nodes: [], edges: [] };

Available suffixes:

  • Array: general arrays
  • Map: key-value pair structure
  • Set: unique value collection
  • Queue: first-in-first-out structure
  • Stack: last-in-first-out structure
  • Tree: hierarchical structure
  • Graph: network structure

5. State Management Naming

// ✅ Specify state types
const connectionStatus = 'connected';  // current state value
const applicationState = { user, cart, preferences }; // state object
const editMode = true;                 // operation mode
const userType = 'premium';           // classification/type

6. Time-Related Naming

// ✅ Clearly express time relationships
const startTime = new Date();
const endDate = '2024-12-31';
const lastLogin = user.lastLoginAt;
const nextUpdate = calculateNextUpdate();
const currentUser = getCurrentUser();
const previousPage = history.back();

7. Event Handler Naming

// ✅ Event handling patterns
const onClick = (event) => { /* event handler */ };
const handleFormSubmit = (data) => { /* processing function */ };
const beforeSave = () => { /* pre-processing */ };
const afterLoad = () => { /* post-processing */ };
const whenReady = () => { /* conditional execution */ };

8. Utility Function Naming

// ✅ Clear action expression
const formatCurrency = (amount) => `$${amount}`;
const parseUserInput = (input) => JSON.parse(input);
const validateEmail = (email) => /\S+@\S+\.\S+/.test(email);
const convertToString = (value) => String(value);
const buildApiUrl = (endpoint) => `${baseUrl}/${endpoint}`;

9. API/Network Naming

// ✅ Specify network operations
const requestUserData = async (id) => { /* API request */ };
const handleApiResponse = (response) => { /* response handling */ };
const callAuthService = () => { /* service call */ };
const sendAnalytics = (data) => { /* data transmission */ };
const uploadProfileImage = (file) => { /* file upload */ };
const downloadReport = (id) => { /* file download */ };
const syncUserPreferences = () => { /* synchronization */ };

10. Performance Optimization Naming

// ✅ Specify performance-related elements
const userCache = new Map();
const imageBuffer = new ArrayBuffer(1024);
const connectionPool = createPool();
const lazyLoadComponent = () => import('./Component');
const preloadNextPage = () => { /* preloading */ };

11. Error Handling Naming

// ✅ Clearly express error situations
const validationError = new Error('Invalid input');
const maxRetryAttempts = 3;
const fallbackUserData = { name: 'Guest' };
const handleNetworkError = (error) => { /* error handling */ };

12. Security-Related Naming

// ✅ Specify security elements (use environment variables for actual values)
const authToken = process.env.AUTH_TOKEN;
const userPermissions = ['read', 'write'];
const adminRole = 'administrator';
const secureConnection = createSecureConnection();

MANDATORY RULES (Cursor MUST follow)

  1. Boolean variables MUST start with is, has, can ONLY
  2. Data retrieval: distinguish get(sync), fetch(API), load(with UI)
  3. Arrays/collections MUST use type suffixes (Array, Map, Set, etc.)
  4. Event handlers MUST start with on or handle
  5. Time-related variables MUST use start, end, current, last, next
  6. Conditional data MUST use by, from, to, above patterns

FORBIDDEN PRACTICES

  • ❌ Ambiguous Boolean prefixes like should, will, was
  • ❌ Generic variable names like data, info, item
  • ❌ Abbreviations or shortened forms (e.g., usr instead of user)
  • ❌ Hungarian notation (e.g., strName, intCount)
  • ❌ Collections without clear type (e.g., users instead of userArray)

Example: Complete Component

// ✅ Correct naming convention applied
const UserProfile = () => {
  const [isLoading, setIsLoading] = useState(false);
  const [hasError, setHasError] = useState(false);
  const [canEdit, setCanEdit] = useState(false);
  
  const userPermissions = useUserPermissions();
  const profileDataCache = useMemo(() => new Map(), []);
  
  const fetchUserProfile = async (userId) => {
    setIsLoading(true);
    try {
      const userData = await requestUserData(userId);
      return userData;
    } catch (validationError) {
      setHasError(true);
      return fallbackUserData;
    } finally {
      setIsLoading(false);
    }
  };
  
  const handleFormSubmit = (formData) => {
    if (canEdit && validateUserInput(formData)) {
      updateUserProfile(formData);
    }
  };
  
  return (
    <div>
      {isLoading && <LoadingSpinner />}
      {hasError && <ErrorMessage />}
      <form onSubmit={handleFormSubmit}>
        {/* form content */}
      </form>
    </div>
  );
};

You MUST strictly adhere to these rules to generate consistent and readable code.