[Python, Java] 프로젝트 구조? 작성 규칙?

Junkyu_Kang·2025년 1월 6일

Python 규칙은 뭐가 있을까?
네이밍 규칙?
프로젝트 구성?
그외 등등?

궁금해서 한번 제너럴 한 내용을 찾아봤다

프로젝트 디렉토리 구성

Python

my_python_project/
├── .git/               # Git 저장소 (버전 관리)
├── .github/            # GitHub Actions (CI/CD 파이프라인)
├── venv/               # 가상 환경 (가상 환경 폴더)
├── docs/               # 프로젝트 문서 (예: README, API 문서)
│   ├── index.md
│   └── usage.md
├── src/                # 소스 코드 (핵심 애플리케이션 로직)
│   ├── __init__.py     # 패키지 초기화 파일
│   ├── main.py         # 진입점 (Entry Point)
│   ├── module1.py
│   └── module2.py
├── tests/              # 테스트 코드
│   ├── __init__.py
│   ├── test_module1.py
│   └── test_module2.py
├── scripts/            # 유틸리티 스크립트 (예: 데이터베이스 초기화, 배포 스크립트)
│   ├── deploy.sh
│   └── setup.py
├── requirements.txt    # 프로젝트 의존성 목록
├── setup.py            # 패키지 메타데이터 및 배포 설정 파일
├── .gitignore          # Git에서 무시할 파일 목록
└── README.md           # 프로젝트 설명 파일

📌 디렉토리 및 파일 설명
venv/: Python 가상 환경으로, 프로젝트 의존성이 격리됨.
src/: 애플리케이션의 핵심 소스 코드.
tests/: unittest, pytest 등으로 작성된 테스트 코드.
scripts/: 관리 및 배포 관련 스크립트.
setup.py: 패키징 및 배포 설정 파일.
requirements.txt: 필요한 라이브러리 목록.
README.md: 프로젝트 설명, 사용법, 설치 방법 안내.

FastAPI

my_fastapi_project/
├── app/
│   ├── __init__.py
│   ├── main.py          # FastAPI 엔트리 포인트
│   ├── api/             # 라우팅, 엔드포인트 정의
│   │   ├── v1/
│   │   │   ├── __init__.py
│   │   │   └── endpoints.py
│   ├── models/          # Pydantic 모델 정의
│   ├── schemas/         # 데이터 스키마 정의
│   ├── core/            # 핵심 설정 (예: config.py)
│   └── tests/           # 테스트 코드
├── .env                 # 환경 변수 파일
├── requirements.txt
└── README.md

Django

my_django_project/
├── myproject/           # Django 프로젝트 폴더
│   ├── __init__.py
│   ├── settings.py      # 설정 파일
│   ├── urls.py          # URL 라우팅
│   ├── wsgi.py          # WSGI 엔트리 포인트
│   ├── asgi.py          # ASGI 엔트리 포인트
├── apps/               # Django 앱 폴더
│   ├── app1/
│   │   ├── migrations/
│   │   ├── admin.py
│   │   ├── apps.py
│   │   ├── models.py
│   │   ├── tests.py
│   │   └── views.py
├── static/             # 정적 파일
├── templates/          # HTML 템플릿 파일
├── requirements.txt
└── manage.py           # Django 관리 명령어 도구

Java

Maven

my_java_project/
├── .git/               # Git 저장소
├── src/
│   ├── main/           # 애플리케이션 소스 코드
│   │   ├── java/       # Java 코드
│   │   │   └── com/example/app/
│   │   │       ├── App.java        # 메인 클래스
│   │   │       ├── controller/
│   │   │       ├── service/
│   │   │       ├── repository/
│   │   │       └── model/
│   │   ├── resources/ # 설정 파일, SQL 스크립트
│   │       ├── application.yml
│   │       ├── schema.sql
│   │       └── data.sql
│   ├── test/           # 테스트 코드
│   │   ├── java/
│   │   │   └── com/example/app/
│   │   │       ├── AppTest.java
│   │   ├── resources/ # 테스트 설정 파일
├── pom.xml             # Maven 프로젝트 설정 파일
└── README.md           # 프로젝트 설명

Gradle

my_gradle_project/
├── .git/
├── src/
│   ├── main/
│   │   ├── java/
│   │   │   └── com/example/app/
│   │   │       ├── App.java
│   │   │       ├── controller/
│   │   │       ├── service/
│   │   │       ├── repository/
│   │   │       └── model/
│   │   ├── resources/
│   │       ├── application.yml
│   ├── test/
│   │   ├── java/
│   │   │   └── com/example/app/
│   │   │       ├── AppTest.java
├── build.gradle        # Gradle 빌드 설정
└── README.md           # 프로젝트 설명

📌 디렉토리 및 파일 설명
src/main/java: 핵심 애플리케이션 소스 코드.
src/main/resources: 설정 파일, SQL 스크립트.
src/test/java: 단위 및 통합 테스트 코드.
pom.xml (Maven): 의존성 및 빌드 설정.
build.gradle (Gradle): Gradle 빌드 설정.

📚 1. 코드 스타일 가이드라인

✅ 1.1 들여쓰기 (Indentation)

4칸 공백(space) 사용 (탭 대신 공백 사용).
한 줄이 너무 길 경우 들여쓰기하여 가독성을 유지.
예시:

def my_function():
    print("Hello, world!")

✅ 1.2 최대 줄 길이 (Maximum Line Length)

한 줄은 최대 79자까지 사용합니다.
긴 코드는 \로 줄을 나누거나 괄호 안에 넣어서 나눕니다.

# 올바른 예
total = (first_variable + second_variable + third_variable
         + fourth_variable + fifth_variable)

✅ 1.3 공백 사용 (Whitespace in Expressions and Statements)

연산자 앞뒤로 공백을 사용합니다.
괄호 안에는 공백을 넣지 않습니다.

a = b + c
my_list = [1, 2, 3]
잘못된 예:

python
코드 복사
a=b+c
my_list = [ 1, 2, 3 ]

✅ 1.4 줄 바꿈 (Line Breaks)

함수나 클래스 정의 사이에는 두 줄 공백을 둡니다.
클래스 내 메서드 사이에는 한 줄 공백을 둡니다.

class MyClass:
    def method_one(self):
        pass

    def method_two(self):
        pass

🔑 2. 네이밍 규칙 (Naming Conventions)

✅ 2.1 변수 및 함수명 (Variables and Functions)

소문자 + 밑줄(_) 사용 (snake_case).
예시:

user_name = "Alice"
def calculate_sum(a, b):
    return a + b

✅ 2.2 클래스명 (Class Names)

PascalCase 사용 (단어의 첫 글자는 대문자).

class UserAccount:
    pass

✅ 2.3 상수 (Constants)

대문자 + 밑줄(_) 사용.

MAX_RETRY = 5
PI = 3.14159

🧠 3. 주석 (Comments)

✅ 3.1 주석 사용

주석은 코드의 목적이나 복잡한 부분을 설명하기 위해 사용합니다.
주석은 영어로 작성하는 것이 권장됩니다.

# Calculate the sum of two numbers
def add(a, b):
    return a + b

✅ 3.2 Docstrings (문서 문자열)

함수, 클래스, 모듈에는 """ """를 사용해 Docstrings를 작성합니다.

def add(a, b):
    """
    두 숫자를 더한 값을 반환합니다.

    Args:
        a (int): 첫 번째 숫자
        b (int): 두 번째 숫자

    Returns:
        int: 두 숫자의 합
    """
    return a + b

🛡️ 4. 예외 처리 (Exception Handling)

예외는 try-except 블록을 사용합니다.
구체적인 예외를 명시합니다.

try:
    value = int(input("Enter a number: "))
except ValueError:
    print("Invalid input. Please enter a valid number.")

🧪 5. 테스트 코드 (Unit Tests)

Python에서는 unittest 또는 pytest를 사용하여 테스트를 작성합니다.
테스트 파일은 test_*.py 형태로 작성합니다.

import unittest
from my_module import add

class TestAddFunction(unittest.TestCase):
    def test_add(self):
        self.assertEqual(add(2, 3), 5)

if __name__ == '__main__':
    unittest.main()

⚙️ 6. 모듈 및 패키지 구조

각 디렉터리에는 init.py를 포함합니다.
모듈명은 소문자 + 밑줄(_)로 작성합니다.

my_project/
├── __init__.py
├── module_one.py
└── module_two.py

🚀 7. 코드 스타일 검사 도구

✅ 7.1 코드 포매터 (Code Formatter)

Black: 코드 스타일 자동 정리
isort: import 순서 정리

pip install black isort
black my_project/
isort my_project/

✅ 7.2 코드 품질 검사 (Linting)
flake8: 코드 규칙 검사
pylint: 코드 품질 검사

pip install flake8 pylint
flake8 my_project/
pylint my_project/

📊 8. Python 코드 스타일 요약

항목규칙
들여쓰기4칸 공백
줄 길이최대 79자
네이밍변수/함수: snake_case, 클래스: PascalCase, 상수: UPPERCASE
주석Docstring 사용, 주석은 명확하고 간결하게 작성
모듈 구조패키지 초기화 파일 (__init__.py) 포함
테스트unittest 또는 pytest 사용
코드 포매팅Black, isort 사용
코드 린트flake8, pylint 사용
profile
강준규

0개의 댓글