{"id":5574,"date":"2025-12-29T08:58:34","date_gmt":"2025-12-28T23:58:34","guid":{"rendered":"https:\/\/secondlife.lol\/?p=5574"},"modified":"2025-12-29T08:59:05","modified_gmt":"2025-12-28T23:59:05","slug":"requirements-dev-setup-cfg-for-quality-tools","status":"publish","type":"post","link":"https:\/\/secondlife.lol\/ja\/requirements-dev-setup-cfg-for-quality-tools\/","title":{"rendered":"\ucd08\ubcf4\uc790\ub97c \uc704\ud55c \ud488\uc9c8 \ucee4\ub9e8\ub4dc 4\ud3b8: requirements-dev.txt + setup.cfg\ub85c \uac1c\ubc1c\uc6a9 \ucf54\ub4dc \ud488\uc9c8 \ub3c4\uad6c \uc138\ud2b8 \uafb8\ub9ac\uae30"},"content":{"rendered":"<style>.kb-image5574_c88bea-a9 .kb-image-has-overlay:after{opacity:0.3;}<\/style>\n<div class=\"wp-block-kadence-image kb-image5574_c88bea-a9\"><figure class=\"aligncenter size-large\"><img decoding=\"async\" width=\"600\" height=\"360\" src=\"https:\/\/secondlife.lol\/wp-content\/uploads\/2025\/12\/image-15-4-600x360.jpg\" alt=\"\" class=\"kb-img wp-image-5614\" srcset=\"https:\/\/secondlife.lol\/wp-content\/uploads\/2025\/12\/image-15-4-600x360.jpg 600w, https:\/\/secondlife.lol\/wp-content\/uploads\/2025\/12\/image-15-4-300x180.jpg 300w, https:\/\/secondlife.lol\/wp-content\/uploads\/2025\/12\/image-15-4-768x461.jpg 768w, https:\/\/secondlife.lol\/wp-content\/uploads\/2025\/12\/image-15-4-18x12.jpg 18w, https:\/\/secondlife.lol\/wp-content\/uploads\/2025\/12\/image-15-4.jpg 1200w\" sizes=\"(max-width: 600px) 100vw, 600px\" \/><\/figure><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">1. \uc65c \u201c\uac1c\ubc1c\uc6a9 requirements\u201d\ub97c \ub530\ub85c \ub450\ub294 \uac78\uae4c?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\uc9c0\uae08\uae4c\uc9c0\ub294<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/secondlife.lol\/quality-check-bat-for-beginners\/\" data-type=\"post\" data-id=\"5570\">2\ud3b8<\/a>: <code>quality_check.bat<\/code> \uc548\uc5d0\uc11c \ubb34\uc2a8 \uc77c\uc774 \ub3cc\uc544\uac00\ub294\uc9c0<\/li>\n\n\n\n<li><a href=\"https:\/\/secondlife.lol\/python-syntax-check-py-compile-all\/\">3\ud3b8<\/a>: <code>py_compile_all.py<\/code>\ub85c <strong>Python \uad6c\ubb38 \uccb4\ud06c<\/strong>\ub97c \uc5b4\ub5bb\uac8c \ud558\ub294\uc9c0<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\ub97c \uc0b4\ud3b4\ubd24\uc8e0.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774\ubc88 4\ud3b8\ubd80\ud130\ub294 <strong>\u201c\ud488\uc9c8 \ucee4\ub9e8\ub4dc\ub97c \uc9c0\uc6d0\ud574 \uc8fc\ub294 \ub3c4\uad6c\ub4e4\u201d<\/strong> \uc774\uc57c\uae30\ub97c \ud569\ub2c8\ub2e4.<br>\ud2b9\ud788 \ub450 \uac00\uc9c0 \ud30c\uc77c\uc5d0 \uc9d1\uc911\ud560 \uac70\uc608\uc694.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>requirements-dev.txt<\/code><\/li>\n\n\n\n<li><code>setup.cfg<\/code><\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\uba3c\uc800 \uc774\ub7f0 \uace0\ubbfc\ubd80\ud130 \ud574\ubcfc\uac8c\uc694.<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\u201c\uc6b4\uc601 \uc11c\ubc84\uc5d0\uc11c \uaf2d \ud544\uc694\ud55c \ud328\ud0a4\uc9c0\u201d\ub791<br>\u201c\uac1c\ubc1c\ud560 \ub54c\ub9cc \uc4f0\ub294 \ucf54\ub4dc \ud488\uc9c8 \ub3c4\uad6c\ub4e4\u201d<br><strong>\uac19\uc740 \ud30c\uc77c\uc5d0 \uc11e\uc5b4\ub450\uba74 \uc5b4\ub5a8\uae4c?<\/strong><\/p>\n<\/blockquote>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\uc6b4\uc601 \uc11c\ubc84\uc5d0\ub294 <a href=\"https:\/\/pypi.org\/project\/black\/\" target=\"_blank\" rel=\"noopener\">black<\/a>, <a href=\"https:\/\/pycqa.github.io\/isort\/\" target=\"_blank\" rel=\"noopener\">isort<\/a>, <a href=\"https:\/\/flake8.pycqa.org\/\" target=\"_blank\" rel=\"noopener\">flake8<\/a>, <a href=\"https:\/\/pypi.org\/project\/mypy\/\" target=\"_blank\" rel=\"noopener\">mypy<\/a>\uac00 \uc0ac\uc2e4 \ud544\uc694 \uc5c6\uc744 \uc218 \uc788\uace0<\/li>\n\n\n\n<li><a href=\"https:\/\/bandit.readthedocs.io\/\" target=\"_blank\" rel=\"noopener\">bandit<\/a>, <a href=\"https:\/\/coverage.readthedocs.io\/\" target=\"_blank\" rel=\"noopener\">coverage<\/a>\ub3c4 <strong>\uac1c\ubc1c \ub2e8\uacc4\uc6a9<\/strong> \ub3c4\uad6c\uc8e0.<\/li>\n\n\n\n<li>\uadf8\ub7f0\ub370 \uc774\uac78 \uc804\ubd80 <code>requirements.txt<\/code> \ud558\ub098\uc5d0 \uc11e\uc5b4\ub450\uba74,\n<ul class=\"wp-block-list\">\n<li>\uc6b4\uc601 \uc11c\ubc84\ub3c4 \uc4f8\ub370\uc5c6\uc774 \ub2e4 \uc124\uce58\ud574\uc57c \ud558\uace0<\/li>\n\n\n\n<li>\uc124\uce58 \uc2dc\uac04, \uc774\ubbf8\uc9c0 \ud06c\uae30(\ub3c4\ucee4), \uc758\uc874\uc131 \ucda9\ub3cc \uc704\ud5d8\ub3c4 \ucee4\uc9d1\ub2c8\ub2e4.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\uadf8\ub798\uc11c \ubcf4\ud1b5\uc740 \uc774\ub807\uac8c \uc815\ub9ac\ud569\ub2c8\ub2e4.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>requirements.txt<\/code> \u2192 <strong>\uc6b4\uc601\uc5d0 \ud544\uc694\ud55c \ucd5c\uc18c \ud328\ud0a4\uc9c0<\/strong><\/li>\n\n\n\n<li><code>requirements-dev.txt<\/code> \u2192 <strong>\uac1c\ubc1c + \ud488\uc9c8 \ub3c4\uad6c \uc804\uc6a9 \ud328\ud0a4\uc9c0<\/strong><\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\uc624\ub298\uc758 \ud3ec\ucee4\uc2a4\ub294 \ubc14\ub85c \uc774 \ub450 \ubc88\uc9f8,<br><strong>\uac1c\ubc1c\uc6a9 \ucf54\ub4dc \ud488\uc9c8 \ub3c4\uad6c \uc804\uc6a9 \ub9ac\uc2a4\ud2b8<\/strong>\uc778 <code>requirements-dev.txt<\/code>\uc785\ub2c8\ub2e4.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">2. requirements-dev.txt \uc548\uc5d0\ub294 \ub204\uac00 \uc0b4\uace0 \uc788\uc744\uae4c?<\/h2>\n\n\n<style>.kb-image5574_280898-94 .kb-image-has-overlay:after{opacity:0.3;}<\/style>\n<div class=\"wp-block-kadence-image kb-image5574_280898-94\"><figure class=\"aligncenter size-large\"><img decoding=\"async\" width=\"600\" height=\"419\" src=\"https:\/\/secondlife.lol\/wp-content\/uploads\/2025\/12\/image-15-5-600x419.jpg\" alt=\"requirements-dev tools image\" class=\"kb-img wp-image-5615\" srcset=\"https:\/\/secondlife.lol\/wp-content\/uploads\/2025\/12\/image-15-5-600x419.jpg 600w, https:\/\/secondlife.lol\/wp-content\/uploads\/2025\/12\/image-15-5-300x210.jpg 300w, https:\/\/secondlife.lol\/wp-content\/uploads\/2025\/12\/image-15-5-768x536.jpg 768w, https:\/\/secondlife.lol\/wp-content\/uploads\/2025\/12\/image-15-5-18x12.jpg 18w, https:\/\/secondlife.lol\/wp-content\/uploads\/2025\/12\/image-15-5.jpg 988w\" sizes=\"(max-width: 600px) 100vw, 600px\" \/><\/figure><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\uc608\uc2dc\ub85c, <code>requirements-dev.txt<\/code> \uc548\uc5d0 \ub4e4\uc5b4\uac08 \uc218 \uc788\ub294 \ud488\uc9c8 \ub3c4\uad6c\ub4e4\uc744 \uc815\ub9ac\ud574 \ubcfc\uac8c\uc694.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\ud83d\udce6 \ud488\uc9c8 \ub3c4\uad6c \ud6c4\ubcf4\ub4e4<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>black==23.12.1<\/code> \u2192 \ucf54\ub4dc \uc790\ub3d9 \ud3ec\ub9e4\ud130<\/li>\n\n\n\n<li><code>isort==5.13.2<\/code> \u2192 import \uc815\ub82c\uae30<\/li>\n\n\n\n<li><code>flake8==7.0.0<\/code> \u2192 \ucf54\ub4dc \uc2a4\ud0c0\uc77c \uac80\uc0ac\uae30<\/li>\n\n\n\n<li><code>pylint<\/code> \u2192 \uc880 \ub354 \uc5c4\uaca9\ud55c \uc815\uc801 \ubd84\uc11d\uae30<\/li>\n\n\n\n<li><code>mypy<\/code> \u2192 \ud0c0\uc785 \ud78c\ud2b8 \uac80\uc0ac\uae30<\/li>\n\n\n\n<li><code>bandit==1.7.6<\/code> \u2192 \ubcf4\uc548 \ucde8\uc57d\uc810 \ud328\ud134 \uac80\uc0ac<\/li>\n\n\n\n<li><code>coverage<\/code> \u2192 \ud14c\uc2a4\ud2b8 \ucee4\ubc84\ub9ac\uc9c0 \uce21\uc815<\/li>\n\n\n\n<li><code>pre-commit<\/code> \u2192 git \ucee4\ubc0b \uc804\uc5d0 \uc790\ub3d9\uc73c\ub85c \ub3c4\uad6c \uc2e4\ud589<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774 \ub3c4\uad6c\ub4e4\uc774 \ud558\ub294 \uc77c\uc740 \uac01\uac01 \uc870\uae08\uc529 \ub2e4\ub974\uc9c0\ub9cc,<br>\ud55c \uc904\ub85c \uc815\ub9ac\ud558\uba74 \uc774\ub807\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\u201c\ub0b4 \ucf54\ub4dc\ub97c \ub354 \uc548\uc804\ud558\uac8c, \uc77d\uae30 \uc88b\uac8c, \uc720\uc9c0\ubcf4\uc218\ud558\uae30 \uc27d\uac8c \ub9cc\ub4e4\uc5b4\uc8fc\ub294 \ub3c4\uc6b0\ubbf8\ub4e4\u201d<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774\uac78 <strong>\ud55c \ud30c\uc77c\uc5d0 \ubaa8\uc544\uc11c \uad00\ub9ac<\/strong>\ud558\ub294 \uac8c <code>requirements-dev.txt<\/code>\uc608\uc694.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">3. \ucd08\ubcf4\uc790 \uc785\uc7a5\uc5d0\uc11c \ubcf4\ub294 \uc0ac\uc6a9 \ud750\ub984<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><code>requirements-dev.txt<\/code>\ub97c \ub9cc\ub4e4\uc5c8\uc744 \ub54c,<br>\uc2e4\uc81c \uc0ac\uc6a9\ud558\ub294 \ud750\ub984\uc740 \ubcf4\ud1b5 \uc774\ub807\uac8c \ub429\ub2c8\ub2e4.<br>(\uae43\uc744 \uc0ac\uc6a9\ud55c\ub2e4\uace0 \ud588\ub2e4\ub294 \uac00\uc815\ud558\uc5d0 \uc6b4\uc601\uacfc \uac1c\ubc1c \uac01\uac01 \ubd84\ub9ac\ub418\uc5c8\ub2e4\uba74)<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\uac1c\ubc1c \ud658\uacbd(\ub85c\uceec PC, \uac00\uc0c1\ud658\uacbd \ub4f1)\uc744 \uc0c8\ub85c \ub9cc\ub4e4\uc5c8\ub2e4.<\/li>\n\n\n\n<li>\ud504\ub85c\uc81d\ud2b8\ub97c git clone \ud588\ub2e4.<\/li>\n\n\n\n<li>\ub2e4\uc74c \ub450 \uc904\ub9cc \uc2e4\ud589\ud558\uba74 \ub41c\ub2e4.<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-code\"><code>pip install -r requirements.txt\npip install -r requirements-dev.txt<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uadf8\ub7ec\uba74<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\uc6b4\uc601\uc5d0 \ud544\uc694\ud55c \uae30\ubcf8 \ud328\ud0a4\uc9c0 +<\/li>\n\n\n\n<li>\uac1c\ubc1c\uc6a9 \ud488\uc9c8 \ub3c4\uad6c \uc138\ud2b8\uae4c\uc9c0<br><strong>\ud55c \ubc88\uc5d0 \uc900\ube44 \uc644\ub8cc<\/strong> \ud83c\udf89<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\ucd08\ubcf4\uc790 \uc785\uc7a5\uc5d0\uc11c\ub294,<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\u201c\uac1c\ubc1c \ud658\uacbd \uc138\ud305 = requirements \ub450 \uac1c\ub97c \uc21c\uc11c\ub300\ub85c \uc124\uce58\ud558\uba74 \ub41c\ub2e4\u201d<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">\ub294 \uad49\uc7a5\ud788 \ub2e8\uc21c\ud55c \ub8f0\uc774 \uc0dd\uae41\ub2c8\ub2e4.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">4. setup.cfg <\/h2>\n\n\n<style>.kb-image5574_05f17a-7c .kb-image-has-overlay:after{opacity:0.3;}<\/style>\n<div class=\"wp-block-kadence-image kb-image5574_05f17a-7c\"><figure class=\"aligncenter size-large\"><img decoding=\"async\" width=\"600\" height=\"316\" src=\"https:\/\/secondlife.lol\/wp-content\/uploads\/2025\/12\/image-15-6-600x316.jpg\" alt=\"requirements-dev image 2\" class=\"kb-img wp-image-5617\" srcset=\"https:\/\/secondlife.lol\/wp-content\/uploads\/2025\/12\/image-15-6-600x316.jpg 600w, https:\/\/secondlife.lol\/wp-content\/uploads\/2025\/12\/image-15-6-300x158.jpg 300w, https:\/\/secondlife.lol\/wp-content\/uploads\/2025\/12\/image-15-6-768x404.jpg 768w, https:\/\/secondlife.lol\/wp-content\/uploads\/2025\/12\/image-15-6-18x9.jpg 18w, https:\/\/secondlife.lol\/wp-content\/uploads\/2025\/12\/image-15-6.jpg 1200w\" sizes=\"(max-width: 600px) 100vw, 600px\" \/><\/figure><\/div>\n\n\n\n<p class=\"wp-block-paragraph\"><code>requirements-dev.txt<\/code>\uac00<br>\u201c\ub3c4\uad6c \ubaa9\ub85d\u201d\uc774\ub77c\uba74,<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>setup.cfg<\/code>\ub294<br>\u201c<strong>\uc774 \ub3c4\uad6c\ub4e4\uc744 \uc5b4\ub5bb\uac8c \uc0ac\uc6a9\ud560\uc9c0\uc5d0 \ub300\ud55c \uacf5\ud1b5 \uaddc\uce59\uc11c<\/strong>\u201d\uc785\ub2c8\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc5ec\uae30\uc5d0\ub294 \uc608\ub97c \ub4e4\uc5b4 \uc774\ub7f0 \uac83\ub4e4\uc744 \uc801\uc5b4\ub458 \uc218 \uc788\uc5b4\uc694.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">4-1. flake8 \uc124\uc815<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\ucd5c\ub300 \ub77c\uc778 \uae38\uc774: 120\uc790<\/li>\n\n\n\n<li>\uc77c\ubd80 \uaddc\uce59\uc740 \ubb34\uc2dc(E203, W503 \ub4f1)\n<ul class=\"wp-block-list\">\n<li>\uc608: \ube14\ub799(black) \ud3ec\ub9e4\ud130\uc640 \ucda9\ub3cc\ud558\ub294 \uc2a4\ud0c0\uc77c \uaddc\uce59\ub4e4<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\uc608\uc2dc \ub290\ub08c<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&#91;flake8]\nmax-line-length = 120\nextend-ignore = E203, W503\nexclude =\n    .venv,\n    migrations,\n    __pycache__\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774\ub807\uac8c \ud574\ub450\uba74<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\ud300\uc6d0 \ub204\uad6c\ub4e0 <code>flake8<\/code>\uc744 \ub3cc\ub9ac\uba74<br><strong>\uac19\uc740 \uaddc\uce59<\/strong>\uc73c\ub85c \uac80\uc0ac\ud569\ub2c8\ub2e4.<\/li>\n\n\n\n<li>\u201c\ub0b4 flake8\uc774\ub791 \ub124 flake8\uc774\ub791 \uacb0\uacfc\uac00 \uc65c \ub2ec\ub77c?\u201d<br>\uc774\ub7f0 \ub9d0\uc774 \uc5c6\uc5b4\uc838\uc694.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">4-2. isort \uc124\uc815<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">isort\ub294 <strong>import \uc815\ub82c<\/strong> \ub3c4\uad6c\uc778\ub370,<br>Django \ud504\ub85c\uc81d\ud2b8\uc5d0\uc11c \ub9ce\uc774 \uc4f0\ub294 \ud328\ud134\uc744 \uc774\ub807\uac8c \ub9de\ucd9c \uc218 \uc788\uc5b4\uc694.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&#91;isort]\nprofile = django\nline_length = 120\nskip = migrations<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774\ub807\uac8c \uc124\uc815\ud574\ub450\uba74<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>isort<\/code>\ub97c \uc5b4\ub5a4 \uc0ac\ub78c\uc774 \ub3cc\ub9ac\ub4e0\n<ul class=\"wp-block-list\">\n<li>import \uc904 \uae38\uc774,<\/li>\n\n\n\n<li>Django \uad00\ub828 \uadf8\ub8f9 \uc21c\uc11c,<\/li>\n\n\n\n<li>\ub9c8\uc774\uadf8\ub808\uc774\uc158 \ud3f4\ub354 \uc81c\uc678 \ub4f1<br><strong>\ub3d9\uc77c\ud55c \uc2a4\ud0c0\uc77c<\/strong>\ub85c \uc815\ub82c\ub429\ub2c8\ub2e4.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">4-3. coverage \uc124\uc815<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\ud14c\uc2a4\ud2b8 \ucee4\ubc84\ub9ac\uc9c0\ub97c \ubcfc \ub54c\ub3c4,<br>\ub9c8\uc774\uadf8\ub808\uc774\uc158\uc774\ub098 \ud14c\uc2a4\ud2b8 \ud30c\uc77c \uc790\uccb4\ub294<br><strong>\ucee4\ubc84\ub9ac\uc9c0 \uacc4\uc0b0\uc5d0\uc11c \uc81c\uc678<\/strong>\ud558\ub294 \uacbd\uc6b0\uac00 \ub9ce\uc544\uc694.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&#91;coverage:run]\nomit =\n    *\/migrations\/*\n    *\/tests\/*\n    *\/__init__.py<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774\ub807\uac8c \ud558\uba74<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\uc2e4\uc81c \ube44\uc988\ub2c8\uc2a4 \ub85c\uc9c1\uc774 \ub2f4\uae34 \ucf54\ub4dc\ub4e4\ub9cc<br>\ucee4\ubc84\ub9ac\uc9c0 \ud1b5\uacc4\uc5d0 \uc9d1\uc911\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">5. requirements-dev.txt + setup.cfg + \ud488\uc9c8 \ucee4\ub9e8\ub4dc\uc758 \uad00\uacc4<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774\uc81c\uae4c\uc9c0 \ub4e4\uc740 \ub0b4\uc6a9\uc744 \ud558\ub098\uc758 \uadf8\ub9bc\uc73c\ub85c \ud55c\ubc88 \ubb36\uc5b4\ubcfc\uac8c\uc694.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>requirements-dev.txt<\/strong>\n<ul class=\"wp-block-list\">\n<li>\ud488\uc9c8 \ub3c4\uad6c\uac00 \ubb49\uccd0 \uc788\ub294 <strong>\u201c\uac1c\ubc1c\uc6a9 \uc7a5\ube44 \ucc3d\uace0\u201d<\/strong><\/li>\n\n\n\n<li><code>pip install -r requirements-dev.txt<\/code> \ud55c \ubc88\uc774\uba74<br>black, isort, flake8, mypy, bandit, coverage, pre-commit \ub4f1<br><strong>\ud55c\uaebc\ubc88\uc5d0 \uc124\uce58 \uc644\ub8cc<\/strong><\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>setup.cfg<\/strong>\n<ul class=\"wp-block-list\">\n<li>black\uc740 \u201c\uc774\ub7f0 \uc2a4\ud0c0\uc77c\ub85c\u201d<\/li>\n\n\n\n<li>isort\ub294 \u201c\uc774\ub807\uac8c \uc815\ub82c\ud558\uace0\u201d<\/li>\n\n\n\n<li>flake8\uc740 \u201c\ub77c\uc778 \uae38\uc774 120\uc790\uc5d0, E203\/W503\uc740 \ubb34\uc2dc\ud558\uace0\u201d<\/li>\n\n\n\n<li>coverage\ub294 \u201c\ub9c8\uc774\uadf8\ub808\uc774\uc158\/\ud14c\uc2a4\ud2b8\ub294 \ube7c\uace0 \ucee4\ubc84\ub9ac\uc9c0 \uacc4\uc0b0\u201d<br>\u2192 \uc774\ub7f0 \uacf5\ud1b5 \uaddc\uce59\uc744 \uc801\uc5b4\ub450\ub294 \u201c\ub8f0\ubd81\u201d<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>\ud488\uc9c8 \ucee4\ub9e8\ub4dc (quality_check.bat \/ pre-commit \ub4f1)<\/strong>\n<ul class=\"wp-block-list\">\n<li>\uc704\uc758 \ub3c4\uad6c\ub4e4\uc744 \uc2e4\uc81c\ub85c <strong>\uc21c\uc11c\ub300\ub85c \uc2e4\ud589<\/strong>\ud574 \uc8fc\ub294 \uc2a4\ud06c\ub9bd\ud2b8\ub4e4<\/li>\n\n\n\n<li>\ucd08\ubcf4\uc790\ub294 \ub3c4\uad6c \uc774\ub984\uc774\ub098 \uc635\uc158\uc744 \ubab0\ub77c\ub3c4,<br>\ud488\uc9c8 \ucee4\ub9e8\ub4dc\ub9cc \uc2e4\ud589\ud558\uba74 \uc804\ubd80 \ub3cc\uac8c \uc124\uacc4<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">\ud55c \uc904\ub85c \uc815\ub9ac\ud558\uba74<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\"><code>requirements-dev.txt<\/code> + <code>setup.cfg<\/code> + \ud488\uc9c8 \ucee4\ub9e8\ub4dc<br>\u2192 \u201c\uc6b0\ub9ac \ud300 \uac1c\ubc1c\ud658\uacbd\uacfc \ucf54\ub4dc \ud488\uc9c8 \uae30\uc900\uc744<br><strong>\ud30c\uc77c\ub85c \ud45c\uc900\ud654<\/strong>\ud55c \uac83\u201d<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774\ub77c\uace0 \ubcfc \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n<style>.kb-image5574_4f1093-a2 .kb-image-has-overlay:after{opacity:0.3;}<\/style>\n<div class=\"wp-block-kadence-image kb-image5574_4f1093-a2\"><figure class=\"aligncenter size-large\"><img decoding=\"async\" width=\"600\" height=\"470\" src=\"https:\/\/secondlife.lol\/wp-content\/uploads\/2025\/12\/image-15-7-600x470.jpg\" alt=\"\" class=\"kb-img wp-image-5618\" srcset=\"https:\/\/secondlife.lol\/wp-content\/uploads\/2025\/12\/image-15-7-600x470.jpg 600w, https:\/\/secondlife.lol\/wp-content\/uploads\/2025\/12\/image-15-7-300x235.jpg 300w, https:\/\/secondlife.lol\/wp-content\/uploads\/2025\/12\/image-15-7-768x602.jpg 768w, https:\/\/secondlife.lol\/wp-content\/uploads\/2025\/12\/image-15-7-15x12.jpg 15w, https:\/\/secondlife.lol\/wp-content\/uploads\/2025\/12\/image-15-7.jpg 982w\" sizes=\"(max-width: 600px) 100vw, 600px\" \/><\/figure><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">6. \ucd08\ubcf4\uc790\uc5d0\uac8c \ucd94\ucc9c\ud558\ub294 \uc2e4\uc804 \uc0ac\uc6a9 \ub8e8\ud2f4<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\uc55e\uc73c\ub85c \uc0c8 \uac1c\ubc1c\uc790\uac00 \ud504\ub85c\uc81d\ud2b8\uc5d0 \ud569\ub958\ud588\ub2e4\uace0 \uac00\uc815\ud558\uace0,<br>\uc774\ub807\uac8c \uc548\ub0b4\ud560 \uc218 \uc788\uc5b4\uc694.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\ub808\ud3ec\uc9c0\ud1a0\ub9ac \ud074\ub860<\/strong><code> git clone [\ud504\ub85c\uc81d\ud2b8 \uc8fc\uc18c] cd [\ud504\ub85c\uc81d\ud2b8 \ud3f4\ub354]<\/code><\/li>\n\n\n\n<li><strong><a href=\"https:\/\/secondlife.lol\/python-venv-create-activate\/\" data-type=\"post\" data-id=\"5834\">\uac00\uc0c1\ud658\uacbd<\/a> \ub9cc\ub4e4\uace0 \ud65c\uc131\ud654<\/strong><code>python -m venv .venv .venv\\Scripts\\activate (Windows \uae30\uc900)<\/code><\/li>\n\n\n\n<li><strong>\uc6b4\uc601\uc6a9 + \uac1c\ubc1c\uc6a9 requirements \uc124\uce58<\/strong><code> pip install -r requirements.txt,  pip install -r requirements-dev.txt<\/code><\/li>\n\n\n\n<li><strong>\ucc98\uc74c <a href=\"https:\/\/secondlife.lol\/quality-command-for-beginners\/\" data-type=\"post\" data-id=\"5568\">\ud488\uc9c8 \ucee4\ub9e8\ub4dc<\/a> \uc2e4\ud589<\/strong><code>quality_check.bat <\/code>\ub610\ub294<code>pre-commit install<\/code><\/li>\n\n\n\n<li>\uc774\ud6c4\ubd80\ud130\ub294\n<ul class=\"wp-block-list\">\n<li>\ucf54\ub4dc\ub97c \uc218\uc815\ud558\uace0<\/li>\n\n\n\n<li>\ud488\uc9c8 \ucee4\ub9e8\ub4dc\ub97c \ub3cc\ub824\ubcf4\uace0<\/li>\n\n\n\n<li>\uae54\ub054\ud558\uac8c \ud1b5\uacfc\ud558\uba74 \ucee4\ubc0b\/\ud478\uc2dc<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774\ub807\uac8c\ub9cc \uc801\uc5b4\uc918\ub3c4,<br>\ucd08\ubcf4\uc790\ub3c4 \u201c\uc5b4\ub514\uc11c\ubd80\ud130 \uc190\ub300\uc57c \ud558\ub294\uc9c0\u201d \ubc29\ud5a5\uc744 \uc7a1\uae30 \uc26c\uc6cc\uc9d1\ub2c8\ub2e4.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">7. \uc6a9\uc5b4 \uc815\ub9ac<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong><code>requirements-dev.txt<\/code><\/strong><br>\uac1c\ubc1c \ub2e8\uacc4\uc5d0\uc11c\ub9cc \ud544\uc694\ud55c \ub3c4\uad6c\ub4e4(\ud3ec\ub9e4\ud130, \ub9b0\ud130, \ud0c0\uc785\uccb4\ucee4, \ubcf4\uc548 \uc2a4\uce90\ub108, pre-commit \ub4f1)\uc744<br>\ubaa8\uc544 \ub454 <strong>\uac1c\ubc1c\uc6a9 \ud328\ud0a4\uc9c0 \ubaa9\ub85d<\/strong> \ud30c\uc77c.<\/li>\n\n\n\n<li><strong><code>requirements.txt<\/code><\/strong><br>\uc8fc\ub85c \uc6b4\uc601\/\uc2e4\ud589\uc5d0 \ud544\uc694\ud55c \ud328\ud0a4\uc9c0\ub97c \uc801\uc5b4\ub450\ub294 \uae30\ubcf8 \uc758\uc874\uc131 \ubaa9\ub85d.<\/li>\n\n\n\n<li><strong><code>setup.cfg<\/code><\/strong><br>\uc5ec\ub7ec Python \ub3c4\uad6c(\uc608: flake8, isort, coverage \ub4f1)\uc758 <strong>\uacf5\ud1b5 \uc124\uc815\uc744 \ubaa8\uc544 \ub450\ub294 \ud30c\uc77c<\/strong>.<br>ini \ud615\uc2dd\uc73c\ub85c \uc139\uc158\uc744 \ub098\ub204\uc5b4 \uc635\uc158\uc744 \uc801\uc2b5\ub2c8\ub2e4.<\/li>\n\n\n\n<li><strong>\ub9b0\ud130(linter)<\/strong><br>\ucf54\ub4dc \uc2a4\ud0c0\uc77c\/\uc7a0\uc7ac\uc801 \uc624\ub958\ub97c \ubd84\uc11d\ud574 \uc8fc\ub294 \ub3c4\uad6c\uc758 \ucd1d\uce6d.<br>\uc608: flake8, pylint.<\/li>\n\n\n\n<li><strong>\ud3ec\ub9e4\ud130(formatter)<\/strong><br>\ucf54\ub4dc \uc2a4\ud0c0\uc77c\uc744 \uc790\ub3d9\uc73c\ub85c \ub9de\ucdb0\uc8fc\ub294 \ub3c4\uad6c.<br>\uc608: black.<\/li>\n\n\n\n<li><strong>\ud14c\uc2a4\ud2b8 \ucee4\ubc84\ub9ac\uc9c0(coverage)<\/strong><br>\ud14c\uc2a4\ud2b8\ub97c \uc2e4\ud589\ud588\uc744 \ub54c, \uc804\uccb4 \ucf54\ub4dc \uc911 \uc5b4\ub290 \ubd80\ubd84\uae4c\uc9c0 \uc2e4\ud589\ub410\ub294\uc9c0 \ube44\uc728\ub85c \ubcf4\uc5ec\uc8fc\ub294 \uc9c0\ud45c.<\/li>\n\n\n\n<li><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>1. \uc65c \u201c\uac1c\ubc1c\uc6a9 requirements\u201d\ub97c \ub530\ub85c \ub450\ub294 \uac78\uae4c? \uc9c0\uae08\uae4c\uc9c0\ub294 \ub97c \uc0b4\ud3b4\ubd24\uc8e0&#8230;.<\/p>","protected":false},"author":3,"featured_media":5617,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_kad_blocks_custom_css":"","_kad_blocks_head_custom_js":"","_kad_blocks_body_custom_js":"","_kad_blocks_footer_custom_js":"","_kad_post_transparent":"","_kad_post_title":"","_kad_post_layout":"","_kad_post_sidebar_id":"","_kad_post_content_style":"","_kad_post_vertical_padding":"","_kad_post_feature":"","_kad_post_feature_position":"","_kad_post_header":false,"_kad_post_footer":false,"_kad_post_classname":"","footnotes":""},"categories":[15],"tags":[1112,1104,1126,1078,1108,1102,1111,1105,1128,1129,1125,1127,1110],"class_list":["post-5574","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-it-jewel","tag-bandit","tag-black","tag-coverage","tag-django-","tag-flake8","tag-isort","tag-mypy","tag-pre-commit","tag-python-","tag-requirements-dev-txt","tag-setup-cfg","tag-1127","tag-1110"],"taxonomy_info":{"category":[{"value":15,"label":"D \ubcf4\ubb3c\ucc3d\uace0(Jewel)"}],"post_tag":[{"value":1112,"label":"bandit"},{"value":1104,"label":"black"},{"value":1126,"label":"coverage"},{"value":1078,"label":"Django \ud504\ub85c\uc81d\ud2b8"},{"value":1108,"label":"flake8"},{"value":1102,"label":"isort"},{"value":1111,"label":"mypy"},{"value":1105,"label":"pre-commit"},{"value":1128,"label":"Python \uac1c\ubc1c\ud658\uacbd"},{"value":1129,"label":"requirements-dev.txt"},{"value":1125,"label":"setup.cfg"},{"value":1127,"label":"\ucf54\ub4dc \ud488\uc9c8 \ub3c4\uad6c"},{"value":1110,"label":"\ud488\uc9c8 \ucee4\ub9e8\ub4dc"}]},"featured_image_src_large":["https:\/\/secondlife.lol\/wp-content\/uploads\/2025\/12\/image-15-6-600x316.jpg",600,316,true],"author_info":{"display_name":"TERE","author_link":"https:\/\/secondlife.lol\/ja\/author\/tere\/"},"comment_info":0,"category_info":[{"term_id":15,"name":"D \ubcf4\ubb3c\ucc3d\uace0(Jewel)","slug":"it-jewel","term_group":0,"term_taxonomy_id":15,"taxonomy":"category","description":"","parent":0,"count":59,"filter":"raw","cat_ID":15,"category_count":59,"category_description":"","cat_name":"D \ubcf4\ubb3c\ucc3d\uace0(Jewel)","category_nicename":"it-jewel","category_parent":0}],"tag_info":[{"term_id":1112,"name":"bandit","slug":"bandit","term_group":0,"term_taxonomy_id":1112,"taxonomy":"post_tag","description":"","parent":0,"count":4,"filter":"raw"},{"term_id":1104,"name":"black","slug":"black","term_group":0,"term_taxonomy_id":1104,"taxonomy":"post_tag","description":"","parent":0,"count":3,"filter":"raw"},{"term_id":1126,"name":"coverage","slug":"coverage","term_group":0,"term_taxonomy_id":1126,"taxonomy":"post_tag","description":"","parent":0,"count":1,"filter":"raw"},{"term_id":1078,"name":"Django \ud504\ub85c\uc81d\ud2b8","slug":"django-%ed%94%84%eb%a1%9c%ec%a0%9d%ed%8a%b8","term_group":0,"term_taxonomy_id":1078,"taxonomy":"post_tag","description":"","parent":0,"count":3,"filter":"raw"},{"term_id":1108,"name":"flake8","slug":"flake8","term_group":0,"term_taxonomy_id":1108,"taxonomy":"post_tag","description":"","parent":0,"count":4,"filter":"raw"},{"term_id":1102,"name":"isort","slug":"isort","term_group":0,"term_taxonomy_id":1102,"taxonomy":"post_tag","description":"","parent":0,"count":3,"filter":"raw"},{"term_id":1111,"name":"mypy","slug":"mypy","term_group":0,"term_taxonomy_id":1111,"taxonomy":"post_tag","description":"","parent":0,"count":2,"filter":"raw"},{"term_id":1105,"name":"pre-commit","slug":"pre-commit","term_group":0,"term_taxonomy_id":1105,"taxonomy":"post_tag","description":"","parent":0,"count":4,"filter":"raw"},{"term_id":1128,"name":"Python \uac1c\ubc1c\ud658\uacbd","slug":"python-%ea%b0%9c%eb%b0%9c%ed%99%98%ea%b2%bd","term_group":0,"term_taxonomy_id":1128,"taxonomy":"post_tag","description":"","parent":0,"count":1,"filter":"raw"},{"term_id":1129,"name":"requirements-dev.txt","slug":"requirements-dev-txt","term_group":0,"term_taxonomy_id":1129,"taxonomy":"post_tag","description":"","parent":0,"count":1,"filter":"raw"},{"term_id":1125,"name":"setup.cfg","slug":"setup-cfg","term_group":0,"term_taxonomy_id":1125,"taxonomy":"post_tag","description":"","parent":0,"count":1,"filter":"raw"},{"term_id":1127,"name":"\ucf54\ub4dc \ud488\uc9c8 \ub3c4\uad6c","slug":"%ec%bd%94%eb%93%9c-%ed%92%88%ec%a7%88-%eb%8f%84%ea%b5%ac","term_group":0,"term_taxonomy_id":1127,"taxonomy":"post_tag","description":"","parent":0,"count":1,"filter":"raw"},{"term_id":1110,"name":"\ud488\uc9c8 \ucee4\ub9e8\ub4dc","slug":"%ed%92%88%ec%a7%88-%ec%bb%a4%eb%a7%a8%eb%93%9c","term_group":0,"term_taxonomy_id":1110,"taxonomy":"post_tag","description":"","parent":0,"count":5,"filter":"raw"}],"_links":{"self":[{"href":"https:\/\/secondlife.lol\/ja\/wp-json\/wp\/v2\/posts\/5574","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/secondlife.lol\/ja\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/secondlife.lol\/ja\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/secondlife.lol\/ja\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/secondlife.lol\/ja\/wp-json\/wp\/v2\/comments?post=5574"}],"version-history":[{"count":7,"href":"https:\/\/secondlife.lol\/ja\/wp-json\/wp\/v2\/posts\/5574\/revisions"}],"predecessor-version":[{"id":5971,"href":"https:\/\/secondlife.lol\/ja\/wp-json\/wp\/v2\/posts\/5574\/revisions\/5971"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/secondlife.lol\/ja\/wp-json\/wp\/v2\/media\/5617"}],"wp:attachment":[{"href":"https:\/\/secondlife.lol\/ja\/wp-json\/wp\/v2\/media?parent=5574"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/secondlife.lol\/ja\/wp-json\/wp\/v2\/categories?post=5574"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/secondlife.lol\/ja\/wp-json\/wp\/v2\/tags?post=5574"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}