재사용 코드 코딩 컨벤션
02-reusable-code/(TypeScript/React),02-reusable-code-python/(Python),02-reusable-code-java/(Java/Spring Boot) 공통 규칙
공통 규칙
파일 메타데이터
모든 커스텀 파일에 출처·버전 메타데이터를 포함한다.
TypeScript — JSDoc 헤더:
/**
* 파일 설명
*
* @source 출처-프로젝트명
* @extracted YYYY-MM-DD
* @version X.Y.Z
*
* @dependencies 의존성 목록
*/
Python — 모듈 독스트링:
"""
한줄 요약 - 모듈의 핵심 기능 설명
@source 출처-프로젝트명
@extracted YYYY-MM-DD
@version X.Y.Z
의존성:
- 패키지명 (필수/권장/선택)
- 패키지명 (pip install 패키지명)
사용법:
from module import function
result = function(args)
"""
@source: 코드가 추출된 원본 프로젝트명@extracted: 추출 날짜@version: 시맨틱 버전- Python은 의존성(필수/권장/선택 구분)과 사용법(최소 1개 실행 가능 예제) 포함
주석 언어
- 한국어 사용
- 에러 메시지 문자열은 영어 허용
import 순서 원칙
그룹 간 빈 줄로 구분:
| 순서 | TypeScript | Python |
|---|---|---|
| 1 | 외부 패키지 | 표준 라이브러리 |
| 2 | type import | 서드파티 |
| 3 | 상대 경로 | 로컬 |
TypeScript / React 규칙
일반 규칙
| 항목 | 규칙 | 비고 |
|---|---|---|
| 따옴표 | 커스텀 코드: 작은따옴표 ' / shadcn: 큰따옴표 " 유지 | shadcn 업스트림 유지 |
| 세미콜론 | 커스텀 코드: 사용 / shadcn: 생략 유지 | |
| export 패턴 | export function, export const (Named Export만) | export default 지양 |
| type vs interface | 객체 형태: interface / 유니온·유틸리티: type | |
| type import | import type { X } (최상위 분리) | import { type X } 지양 |
| 컴포넌트 선언 | export function ComponentName() | 화살표 함수 지양 |
| 파일명 | hooks: camelCase (useDebounce.ts) / 나머지: kebab-case | |
| 섹션 구분선 | // ============================================ | 유니코드 박스문자 지양 |
| 'use client' | 커스텀: 'use client'; / shadcn: "use client" |
shadcn 컴포넌트 예외 정책
01-ui-components/shadcn-*하위 개별 컴포넌트 파일은 업스트림 스타일 유지- 이유: 향후 업스트림 업데이트 시 diff/merge 용이
index.ts배럴 파일만 한국어 주석 + 출처 표시
Python 규칙
import 순서
PEP8 기준, 그룹 간 빈 줄:
# 1. 표준 라이브러리
import logging
import zipfile
from pathlib import Path
# 2. 서드파티
import numpy as np
import pandas as pd
# 3. 로컬
from .utils import helper_function
타입 힌트
Python 3.10+ 내장 타입 문법 사용:
# 올바른 예
def process(items: list[str]) -> dict[str, int]: ...
def load(path: str | Path) -> bytes | None: ...
# 금지 (구식)
from typing import Dict, List, Tuple, Union
dict,list,tuple,set→ 내장 타입 사용Union[A, B]→A | B사용Optional[T]→T | None사용Any→ typing에서 import 허용 (대안 없음)
독스트링 (함수/클래스)
Google 스타일, 한국어:
def function_name(param: str, count: int = 0) -> list[str]:
"""함수 한줄 요약
Args:
param: 매개변수 설명
count: 매개변수 설명 (기본값: 0)
Returns:
반환값 설명
Raises:
ValueError: 발생 조건
"""
로깅
모든 모듈에 로거 설정:
import logging
logger = logging.getLogger(__name__)
- 메시지는 한국어
print()금지 (__main__블록 제외)- 레벨:
debug(디버그),info(정상 동작),warning(주의),error(오류)
에러 처리
try:
result = risky_operation()
except SpecificError as e:
logger.error("작업 실패: %s", e)
raise # 또는 적절한 복구
- 범용
except Exception최소화 - 리소스는
try/finally또는 컨텍스트 매니저로 반드시 정리 - 파일 존재/유효성 검증은 호출자 책임 (모듈 내부에서 중복 검증하지 않음)
네이밍 규칙
| 대상 | 규칙 | 예시 |
|---|---|---|
| 함수/변수 | snake_case | read_excel_file, file_path |
| 클래스 | PascalCase | WhisperSTTEngine, SQLiteSessionManager |
| 상수 | UPPER_SNAKE_CASE | MIMETYPE, VERSION_XML |
| 프라이빗 | _ 접두사 | _instance, _parse_row |
따옴표
- 큰따옴표
"사용
줄 길이
- 기준: 88자 (Black 기본값)
- 함수 시그니처가 길 경우 매개변수별 줄바꿈:
def generate_section_xml(
title: str,
content: str,
tables: list[dict[str, Any]] | None = None,
header_org: str = "기본값",
) -> str:
__init__.py
- 명시적 import +
__all__리스트 필수 - 모듈 독스트링 포함 (메타데이터 태그)
"""
패키지 설명
@source 출처
@extracted YYYY-MM-DD
@version X.Y.Z
"""
from .module import function_a, function_b
__all__ = [
"function_a",
"function_b",
]
싱글톤 패턴
모듈 레벨 _instance + get_*() 팩토리 함수:
_instance: MyClass | None = None
def get_instance(**kwargs) -> MyClass:
"""싱글톤 인스턴스 반환"""
global _instance
if _instance is None:
_instance = MyClass(**kwargs)
return _instance
리소스 관리
- 파일/네트워크/DB 연결은 반드시
with또는try/finally로 정리 read_only=True워크북도 반드시.close()호출
# 올바른 예
wb = load_workbook(path, read_only=True)
try:
return wb.sheetnames
finally:
wb.close()
Java / Spring Boot 규칙
파일 메타데이터
Javadoc 헤더:
/**
* 파일 설명 (한국어)
*
* @source 출처-프로젝트명
* @extracted YYYY-MM-DD
* @version X.Y.Z
*
* @dependencies 의존성 목록
*/
패키지 규칙
- 범용 패키지:
com.example.app.*(실제 프로젝트 적용 시 변경) - 카테고리별 하위 패키지:
config,security,exception,util,service,domain
네이밍 규칙
| 대상 | 규칙 | 예시 |
|---|---|---|
| 클래스 | PascalCase | SecurityConfig, FileUtil |
| 메서드/변수 | camelCase | uploadFile, maxFileSize |
| 상수 | UPPER_SNAKE_CASE | ALLOWED_MIME_TYPES, USER_PRINCIPAL |
| 패키지 | lowercase | com.example.app.config |
주석 언어
- 한국어 사용 (Javadoc, 인라인 주석 모두)
- 에러 메시지 문자열은 영어 허용
import 순서
그룹 간 빈 줄로 구분:
// 1. java/jakarta 표준 라이브러리
import java.time.LocalDateTime;
import jakarta.servlet.http.HttpServletRequest;
// 2. Spring 프레임워크
import org.springframework.stereotype.Service;
import org.springframework.security.core.userdetails.UserDetails;
// 3. 서드파티
import com.github.benmanes.caffeine.cache.Caffeine;
import lombok.RequiredArgsConstructor;
// 4. 프로젝트 내부
import com.example.app.domain.User;
import com.example.app.exception.BusinessException;
Lombok 사용 규칙
@RequiredArgsConstructor+private final필드 (생성자 주입)@Getter,@Builder허용@Data지양 (DTO에만 제한적 허용)@Setter금지 (도메인 엔티티)
예외 처리
// 비즈니스 예외는 커스텀 예외 사용
throw new BusinessException("유효하지 않은 요청입니다");
// 리소스 미발견
throw new ResourceNotFoundException("사용자를 찾을 수 없습니다: " + id);
설정 파일 패턴
@Value또는@ConfigurationProperties로 외부 설정 주입- 하드코딩 금지 (URL, 포트, 경로, 자격증명)
- 프로파일별 설정 분리 (
application-{profile}.yml)
버전 전략
시맨틱 버전 (@version)
| 변경 유형 | 버전 업 | 예시 |
|---|---|---|
| 버그 수정, 주석 수정 | Patch (1.0.x) | 타입 오류 수정 |
| 기능 추가 (하위 호환) | Minor (1.x.0) | 새 옵션 파라미터 추가 |
| 파라미터 변경, API 변경 | Major (x.0.0) | 함수 시그니처 변경 |
shadcn 컴포넌트 버전
@version은 shadcn/ui 릴리스 버전을 따름 (현재 v4)- 커스텀 수정 시
@version 4.0.0-custom.1형태 사용
호환성
| 항목 | 최소 버전 |
|---|---|
| TypeScript | 5.0+ |
| React | 18+ |
| Next.js | 14+ (App Router) |
| Python | 3.10+ |
| Node.js | 18+ |
| Java | 21+ |
| Spring Boot | 3.0+ |
적용 이력
| 날짜 | 내용 |
|---|---|
| 2026-02-16 | 초판 작성. 메타데이터 헤더 통일, 주석 한국어화, 세미콜론/따옴표/export 통일 적용 |
| 2026-02-16 | TS + Python 단일 문서로 통합. Optional[T] → T | None 통일, 중복 규칙 공통 섹션으로 병합 |
| 2026-02-16 | 버전 전략·호환성 섹션 추가. docs/conventions/ → docs/rules/로 이동 |
| 2026-03-08 | Java / Spring Boot 섹션 추가. 패키지·Lombok·예외·설정 규칙 포함 |