작성목표
장고 프로젝트 생성부터 github와 연결 그리고 git commit template 설정 하는 방법과 lint와 formatter pre-commit 설정하는 내용까지의 흐름과 설정하는 위치 그리고 대략적인 설명등을 정리합니다. 이렇게 하는 과정을 정리하고 새로운 프로젝트를 시작할때마다 수행하게되는 내용을 미리 저장해놓아 초기 프로젝트 셋팅에 걸리는 시간을 줄이도록 합니다.
- [Mac OS] M1 기준으로 작성 되었습니다
Boiler plate란?
보일러 플레이트(boiler plate)는 일반적으로 소프트웨어 프로젝트에서 반복적으로 사용되는 코드나 구조물을 의미합니다. 즉, 이는 매번 새로운 프로젝트를 시작할 때마다 일반적으로 필요한 코드를 다시 작성하는 불필요한 작업을 줄이는 것을 목적으로 합니다.
보일러 플레이트 코드는 일반적으로 다양한 프로그래밍 언어에서 사용되며, 프로젝트에 따라 다양한 형태로 나타날 수 있습니다. 예를 들어, 웹 개발에서는 보일러 플레이트 코드가 HTML, CSS 및 JavaScript 파일에 자주 사용됩니다.
보일러 플레이트 코드는 일반적으로 재사용 가능하며, 많은 개발자들이 공개된 코드를 참고하여 직접적으로 사용하거나 수정하여 자신의 프로젝트에 적용합니다. 이는 개발 프로세스를 가속화하고 일관성을 유지하는 데 도움이 됩니다.
** 가상환경에 대하여
- 기본적으로 현재 프로젝트 진행에 venv를 많이 사용하고 있지만 파이썬의 가상환경이 여러가지가 있다는 것을 강의 또는 다른 정보를 통하여 이미 많이 접하고 있을 것이라고 생각합니다.
- 머신러닝 프로젝트등을 진행할때 많이 사용되는 anaconda 가상환경과 venv와 비슷한 virtualenv 그리고 이 virtualenv를 베이스로 만들어진 pipenv등의 가상환경이 있을 것이라고 생각되는데 이 Boilerplate 만드는 내용에서는 pipenv를 사용할 예정이며 이것에 대한 추가적인 설명을 하고 다른 가상환경에대한 내용이 더 궁금하다면 참고링크에서 확인을 하도록 하겠습니다.
pipenv 란?
Pipenv는 파이썬 의존성 관리 도구로, pip와 virtualenv를 대체할 수 있는 툴입니다. 이를 사용하면 파이썬 프로젝트의 의존성 패키지를 관리하고, 가상 환경을 생성하고, 프로젝트 환경을 관리하는 일련의 작업을 쉽게 수행할 수 있습니다.
Pipenv는 Pipfile과 Pipfile.lock 파일 두 개의 파일을 사용하여 의존성을 관리합니다. Pipfile은 프로젝트의 의존성 패키지를 명시하고, Pipfile.lock은 현재 패키지 상태를 기록합니다. 이를 통해 다른 환경에서 동일한 의존성 패키지를 설치할 수 있으며, 의존성 버전 충돌 문제를 방지할 수 있습니다.
Pipenv는 기본적으로 가상 환경을 자동으로 생성하며, 필요한 패키지를 설치하고, 관리합니다. 이를 통해 각 프로젝트에서 독립된 환경을 유지할 수 있습니다. 또한, Pipenv는 Pipfile에 명시된 패키지가 이미 설치되어 있으면 다시 설치하지 않으며, 필요한 패키지만 설치합니다. 이로써 의존성 설치 시간을 단축하고, 불필요한 의존성 패키지를 설치하지 않아도 되는 장점이 있습니다.
Pipenv는 사용이 쉽고, 의존성 관리를 편리하게 할 수 있는 파이썬 개발자들 사이에서 인기 있는 도구 중 하나입니다.
- 참고자료
https://devbull.xyz/python-create-environment/
https://pipenv.pypa.io/en/latest/
1. 가상환경 만들기 : pipenv
- 1-1 작업 폴더 만들기 : mkdir 원하는폴더이름 ex: mkdir boilerplate
- 1-2 pipenv 설치하기 : 원하는 폴더 안으로 진입한 후에 `pip install pipenv`
pip install pipenv
- 1-3 가상환경 생성/제거
- 처음 pipenv를 설치만 한 상태로 `pipenv --venv`로 가상환경을 확인해보면 밑과 같이 아직 만들어지지 않았다는 내용을 확인할 수 있습니다,
- 여기서 우리는 가상환경을 생성해주어야 합니다.
pipenv --python 3.X
pipenv --rm
- 위의 명령어 pipenv --python 3.X는 pipenv 가상환경을 원하는 파이썬 버젼으로 생성해주는 명령어입니다.
- 테스트는 Python 3.9 version을 만드는 방식으로 수행했고 python 3.X의 부분에서 파이썬 버젼을 고를 수 있습니다.
- pipenv --rm 은 위에 만든 가상환경을 삭제하는 명령어 입니다.
- 1-4 가상환경 실행/종료
- 가상환경의 실행은 `pipenv shell`을 이용하여 실행시킬 수 있습니다
pipenv shell
- 그리고 종료는 터미널에 간단하게 `exit` 를 입력하면 되겠습니다.
2. Django project 만들기
- 2-1 django-admin 설치 : `pip install django`로 django 설치를 진행
pip install django
- 2-2 django 프로젝트 생성
- django 설치 후 작업하려는 폴더의 위치에서 밑의 명령어를 입력하면 되겠습니다
- 보통 다른 자료들을 보면 django-admin startproject 프로젝트명을 입력하는데 밑의 내용은 현재 폴더를 프로젝트 자체로 쓰겠다는 내용이고 프로젝트 이름으로 하위폴더를 만들지 않고 현재 위치에 필요 요소들을 만들어줍니다. 그리고 처음 생성되는 앱 자체도 config로 만들어주어서 추가적인 설정 변경 없이 바로 사용 가능합니다.
django-admin startproject config .
3. 패키지 설치
- 3-1 DRF 패키지 설치 : pip install 을 하는 방식과 유사하게 pipenv 라는 명령어를 이용하여 설치 합니다.
- 여기부터 스크린샷은 pycharm의 터미널에서 수행 했습니다.
pipenv install djangorestframework
- 이렇게 실행하게 되면 기존에 pipenv가 만들어질때 같이 만들어진 Pipfile 이외에 Pipfile.lock 파일이 같이 생성된 것을 보실 수있습니다.
- Pipfile은 사용자가 확인하기 쉽게 requirements.txt 파일에 패키지명들이 기록되었던 것처럼 패키지가 기록되어있는 파일이고 Pipfile.lock은 install한 패키지들을 자동으로 암호화하여 저장한 파일입니다. 이런 암호화하고 저장하는 과정은 자동으로 수행됩니다
- 3-2 isort, black, flake8 설치하기
- 이 3가지에 대해서 왜 사용하는지에 대한 궁금증 부터 간략하게 해결하고 진행하겠습니다.
** isort는 파이썬 코드의 import 구문을 자동으로 정렬해주는 도구 입니다. 이를 사용하면 import 구문을 조금 더 일괄적이고 가독성이 좋게 그리고 알파뱃순 유형별 섹션별 자동 정렬까지도 진행해 줍니다.
** black은 파이썬 포맷터로 코드의 들여쓰기 공백 줄 바꿈등을 자동 조정해주고 일관된 코드 스타일로 변환 시켜줍니다 이것은 PEP8을 기준으로 설정되도록 되어있습니다.
** flake8은 코드스타일 문제 문법 오류 잠재적인 버그등을 확인해주는 도구입니다.
이런 것들을 이용해서 코드 품질을 향상 시키고 협업시의 코드 작성 스타일 등에 따른 충돌 문제등을 예방할 수 있습니다.
설치는 간단합니다
pipenv install isort
pipenv install black
pipenv install flake8
실행은 간단하게 각 명령어의 뒤에 '.' 을 입력해서 실행이 가능합니다. 예를 들어가면서 어떤 내용을 수정해주는지 확인 해보겠습니다.
- isort 예시 : 위의 설명처럼 import 부분에 대해 자동 정렬 합니다
- black 실행 예시 : 띄어쓰기 문단간격 ' => " 변경등을 수행
- flake8 실행 예시 : 어느 위치에 대해서 문제가 있는지를 확인 밑의 내용에서는 해당 위치의 문장이 너무 길게 작성되어있다는 것을 경고중
4. isort, black, flake8 환경 설정
- 위와 같이 코드 스타일을 일관되게 만들어주는 것에서 pep8과 같은 일반적인 기준이 있다고는 하지만 무조건 어떻게 해야한다는 기준이 있는 것은 아닙니다. 이렇듯 위에 사용하는 isort와 black과 flake8도 원하는 방향으로 설정을 변경하여 사용할 수 있습니다.
설정파일을 만들고 설정하는 방법은 여러 방법이 있겠지만 여기서는 isort와 black을 pyproject.toml로 설정하고 flake8의 설정은 .flake8으로 설정하였습니다.
- 4-1 flake8 설정
- 위 예시를 보면 E501에 대해서 flake8의 기준에서 문제가 있다는 내용을 알려주고 있다는 것을 알 수 있다. 이렇듯 flake8이 코드를 검사하는 기준이 여러가지가 있는데 이것은 밑의 flake8의 룰에 대한 공식문서에 자세히 나와있다.
- 위 E501 를 찾아보니 물론 에러 메세지에도 있는 내용이지만 문장의 길이가 79 character를 넘지 않는 것을 권장하고 있다는 내용이 나오고 내가 판단하였을때 이 내용은 별로 크리티컬한 내용이 아니라고 생각되므로 해당 기준을 바꿔보도록 하겠습니다.
- flake8 설정 파일 만들기 : 설정파일의 이름은 .flake8 입니다. 폴더의 구조는 밑을 참고하세요
- 해당 파일에 밑의 내용을 입력해주세요
[flake8]
max-line-length = 120
exclude =
.git,
.gitignore,
*/migrations/*,
__pycache__,
ignore =
E203,
E501,
E712,
E722,
black-config = pyproject.toml
- max-line-length : 문장의 길이가 얼마 이하일때 경고를 띄워주는지에 대한 기준
- exclude : flake8이 검토를 하지 않는 파일들의 유형
- ignore : 표시하지 않을 Error 목록
- black-config : black에 대한 설정은 pyproject.toml에서 설정
- isort, black 설정 파일 만들기 : 설정파일의 이름은 pyproject.toml 입니다. 폴더의 구조는 밑을 참고하세요
- 해당 파일에 밑의 내용을 입력해주세요
[tool.black]
line-length = 120
target-version = ['py39']
exclude = '''
\.git
| \.hg
| \.mypy_cache
| \.tox
| \.venv
| _build
| buck-out
| build
| dist
| ^.*\b(migrations)\b.*$
'''
[tool.isort]
multi_line_output = 3
include_trailing_comma = true
force_grid_wrap = 0
use_parentheses = true
line_length = 120
skip = [".gitignore", "migrations"]
- 내용이 조금 달라보이긴 하지만 flake8 설정 내용과 별다른 것이 없습니다.
- 위 파일 한개에 black과 isort에 대한 설정을 해주는 내용입니다.
5. pre-commit 설치 및 설정하기
- pre-commit 은 단어의 뜻으로 유추해볼 수 있듯이 commit 전에 자동으로 수행될 수 있게 하는 패키지 입니다. 이것은 기본적으로 제공해주는 것이 아니므로 당연히 설치를 해주어야합니다.
- 5-1 pre-commit 설치 하기
- `pipenv install pre-commit` 으로 설치합니다.
pipenv install pre-commit
- 5-2 pre-commit 설정 파일 생성하고 설정하기
- 설정파일의 이름은 `.pre-commit-config.yaml` 입니다. 위치는 밑의 사진을 참고합니다
- 이곳에 밑의 코드를 넣어줍니다. 내용은 isort black flake8을 순서대로 실행하겠다는 내용입니다.
repos:
- repo: https://github.com/PyCQA/isort
rev: 5.10.1
hooks:
- id: isort
exclude: ^.*\b(migrations)\b.*$
- repo: https://github.com/ambv/black
rev: 22.6.0
hooks:
- id: black
exclude: ^.*\b(migrations)\b.*$
- repo: https://github.com/pycqa/flake8
rev: 4.0.1
hooks:
- id: flake8
exclude: ^.*\b(migrations)\b.*$
- 5-3 pre-commit hook 생성 : pre-commit hook을 생성하도록 합니다
pre-commit install
- 이것을 수행할때 에러가 날 수 있습니다 이것은 git init이 되어있지 않은 상태여서 그렇습니다. `git init`을 해주도록 합니다
git init
여기까지 진행되었으면 git add 후 git commit 을 수행할때 pre-commit에 설정된 내용이 먼저 실행되게 되고 통과가 되지 않는다면 commit이 되지 않는 상태로 설정이 되게 됩니다.
*** 일반적인 내용은 간단하게 지나가겠습니다.
6. github 연결하기
- 6-1 github에서 원하는 이름으로 저장소 만들기
- 6-2 gitignore 파일 만들기
- gitignore 파일 공유
# Created by https://www.toptal.com/developers/gitignore/api/python,pycharm,visualstudiocode,vim,macos,linux,zsh
# Edit at https://www.toptal.com/developers/gitignore?templates=python,pycharm,visualstudiocode,vim,macos,linux,zsh
### Linux ###
*~
# temporary files which can be created if a process still has a handle open of a deleted file
.fuse_hidden*
# KDE directory preferences
.directory
# Linux trash folder which might appear on any partition or disk
.Trash-*
# .nfs files are created when an open file is removed but is still being accessed
.nfs*
### macOS ###
# General
.DS_Store
.AppleDouble
.LSOverride
# Icon must end with two \r
Icon
# Thumbnails
._*
# Files that might appear in the root of a volume
.DocumentRevisions-V100
.fseventsd
.Spotlight-V100
.TemporaryItems
.Trashes
.VolumeIcon.icns
.com.apple.timemachine.donotpresent
# Directories potentially created on remote AFP share
.AppleDB
.AppleDesktop
Network Trash Folder
Temporary Items
.apdisk
### PyCharm ###
# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider
# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
# User-specific stuff
.idea/**/workspace.xml
.idea/**/tasks.xml
.idea/**/usage.statistics.xml
.idea/**/dictionaries
.idea/**/shelf
# AWS User-specific
.idea/**/aws.xml
# Generated files
.idea/**/contentModel.xml
# Sensitive or high-churn files
.idea/**/dataSources/
.idea/**/dataSources.ids
.idea/**/dataSources.local.xml
.idea/**/sqlDataSources.xml
.idea/**/dynamic.xml
.idea/**/uiDesigner.xml
.idea/**/dbnavigator.xml
# Gradle
.idea/**/gradle.xml
.idea/**/libraries
# Gradle and Maven with auto-import
# When using Gradle or Maven with auto-import, you should exclude module files,
# since they will be recreated, and may cause churn. Uncomment if using
# auto-import.
# .idea/artifacts
# .idea/compiler.xml
# .idea/jarRepositories.xml
# .idea/modules.xml
# .idea/*.iml
# .idea/modules
# *.iml
# *.ipr
# CMake
cmake-build-*/
# Mongo Explorer plugin
.idea/**/mongoSettings.xml
# File-based project format
*.iws
# IntelliJ
out/
# mpeltonen/sbt-idea plugin
.idea_modules/
# JIRA plugin
atlassian-ide-plugin.xml
# Cursive Clojure plugin
.idea/replstate.xml
# SonarLint plugin
.idea/sonarlint/
# Crashlytics plugin (for Android Studio and IntelliJ)
com_crashlytics_export_strings.xml
crashlytics.properties
crashlytics-build.properties
fabric.properties
# Editor-based Rest Client
.idea/httpRequests
# Android studio 3.1+ serialized cache file
.idea/caches/build_file_checksums.ser
### PyCharm Patch ###
# Comment Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-215987721
# *.iml
# modules.xml
# .idea/misc.xml
# *.ipr
# Sonarlint plugin
# https://plugins.jetbrains.com/plugin/7973-sonarlint
.idea/**/sonarlint/
# SonarQube Plugin
# https://plugins.jetbrains.com/plugin/7238-sonarqube-community-plugin
.idea/**/sonarIssues.xml
# Markdown Navigator plugin
# https://plugins.jetbrains.com/plugin/7896-markdown-navigator-enhanced
.idea/**/markdown-navigator.xml
.idea/**/markdown-navigator-enh.xml
.idea/**/markdown-navigator/
# Cache file creation bug
# See https://youtrack.jetbrains.com/issue/JBR-2257
.idea/$CACHE_FILE$
# CodeStream plugin
# https://plugins.jetbrains.com/plugin/12206-codestream
.idea/codestream.xml
### Python ###
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
*$py.class
# C extensions
*.so
# Distribution / packaging
.Python
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
wheels/
share/python-wheels/
*.egg-info/
.installed.cfg
*.egg
MANIFEST
# PyInstaller
# Usually these files are written by a python script from a template
# before PyInstaller builds the exe, so as to inject date/other infos into it.
*.manifest
*.spec
# Installer logs
pip-log.txt
pip-delete-this-directory.txt
# Unit test / coverage reports
htmlcov/
.tox/
.nox/
.coverage
.coverage.*
.cache
nosetests.xml
coverage.xml
*.cover
*.py,cover
.hypothesis/
.pytest_cache/
cover/
# Translations
*.mo
*.pot
# Django stuff:
*.log
local_settings.py
db.sqlite3
db.sqlite3-journal
# Flask stuff:
instance/
.webassets-cache
# Scrapy stuff:
.scrapy
# Sphinx documentation
docs/_build/
# PyBuilder
.pybuilder/
target/
# Jupyter Notebook
.ipynb_checkpoints
# IPython
profile_default/
ipython_config.py
# pyenv
# For a library or package, you might want to ignore these files since the code is
# intended to run in multiple environments; otherwise, check them in:
# .python-version
# pipenv
# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
# However, in case of collaboration, if having platform-specific dependencies or dependencies
# having no cross-platform support, pipenv may install dependencies that don't work, or not
# install all needed dependencies.
#Pipfile.lock
# poetry
# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
# This is especially recommended for binary packages to ensure reproducibility, and is more
# commonly ignored for libraries.
# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
#poetry.lock
# PEP 582; used by e.g. github.com/David-OConnor/pyflow
__pypackages__/
# Celery stuff
celerybeat-schedule
celerybeat.pid
# SageMath parsed files
*.sage.py
# Environments
.env
.venv
env/
venv/
ENV/
env.bak/
venv.bak/
# Spyder project settings
.spyderproject
.spyproject
# Rope project settings
.ropeproject
# mkdocs documentation
/site
# mypy
.mypy_cache/
.dmypy.json
dmypy.json
# Pyre type checker
.pyre/
# pytype static type analyzer
.pytype/
# Cython debug symbols
cython_debug/
# PyCharm
# JetBrains specific template is maintainted in a separate JetBrains.gitignore that can
# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
# and can be added to the global gitignore or merged into this file. For a more nuclear
# option (not recommended) you can uncomment the following to ignore the entire idea folder.
.idea/
### Vim ###
# Swap
[._]*.s[a-v][a-z]
!*.svg # comment out if you don't need vector files
[._]*.sw[a-p]
[._]s[a-rt-v][a-z]
[._]ss[a-gi-z]
[._]sw[a-p]
# Session
Session.vim
Sessionx.vim
# Temporary
.netrwhist
# Auto-generated tag files
tags
# Persistent undo
[._]*.un~
### VisualStudioCode ###
.vscode/*
!.vscode/settings.json
!.vscode/tasks.json
!.vscode/launch.json
!.vscode/extensions.json
!.vscode/*.code-snippets
# Local History for Visual Studio Code
.history/
# Built Visual Studio Code Extensions
*.vsix
### VisualStudioCode Patch ###
# Ignore all local history of files
.history
.ionide
# Support for Project snippet scope
### Zsh ###
# Zsh compiled script + zrecompile backup
*.zwc
*.zwc.old
# Zsh completion-optimization dumpfile
*zcompdump*
# Zsh zcalc history
.zcalc_history
# A popular plugin manager's files
._zinit
.zinit_lstupd
# zdharma/zshelldoc tool's files
zsdoc/data
# robbyrussell/oh-my-zsh/plugins/per-directory-history plugin's files
# (when set-up to store the history in the local directory)
.directory_history
# MichaelAquilina/zsh-autoswitch-virtualenv plugin's files
# (for Zsh plugins using Python)
# Zunit tests' output
/tests/_output/*
!/tests/_output/.gitkeep
# End of https://www.toptal.com/developers/gitignore/api/python,pycharm,visualstudiocode,vim,macos,linux,zsh
my_settings.py
# ec2
static/
server.pid
nginx/django.crt
nginx/django.key
- 6-3 my_settings.py 파일 생성 및 설정 : secrets key 분리
- 6-4 git remote 연결
git remote add origin 자기저장소주소
- 6-5 main 브랜치로 설정 : master to main
git branch -M main
- 여기까지 진행한 상태에서 평소와 같이 git add와 git commit 수행을 하게되면 밑과 같이 설정해둔 pre-commit이 실행되는 것을 확인 가능합니다.
여기까지 보일러 플레이트 만드는 법에 대한 내용 정리를 마칩니다.
해당 내용에 대한 github 주소를 밑에 공유합니다.
https://github.com/nmdkims/boilerplate/new/main?readme=1
2. commit message template, pull request template 설정으로 이어집니다.
'DevLog' 카테고리의 다른 글
[개발환경셋팅] 3. git action을 이용한 간단한 ci 맛보기 (0) | 2023.05.08 |
---|---|
[개발환경셋팅] 2. commit message template, pull request template 설정 (0) | 2023.05.08 |
[개념완성] Django INSTALLED_APPS 앱등록 (0) | 2023.05.01 |
[개념완성] get_object_or_404 (0) | 2023.04.21 |
[고찰] 'NamedTuple' 클래스의 해결되지 않은 속성 참조 'multi_hand_landmarks' (0) | 2023.03.06 |