| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208 |
- # ๐ก๏ธ ์์ ํ ๊ฐ๋ฐ ์ค์ฒ ๊ท์น (Safe Development Practice)
- ## ํต์ฌ ์์น: "๊ธฐ์กด ๊ธฐ๋ฅ ์ฐ์ ๋ณดํธ"
- **๋ชจ๋ ๊ธฐ๋ฅ ์์ , ์ถ๊ฐ, ๋ฒ๊ทธ ํฝ์ค ์ ๊ธฐ์กด ์ ์ ๊ธฐ๋ฅ๋ค์ด ์ํฅ๋ฐ์ง ์๋๋ก ์ฌ์ ์ฒดํฌ ๋ฐ ์์ ์ฅ์น ์ ์ฉ์ด ์ต์ฐ์ **
- ---
- ## ๐ ํ์ ์ฒดํฌ๋ฆฌ์คํธ
- ### Phase 1: ์ฌ์ ์ํฅ๋ ๋ถ์ (Pre-Impact Analysis)
- - [ ] **๊ธฐ์กด ๊ธฐ๋ฅ ๋งคํ**: ์์ ํ ์์ญ๊ณผ ์ฐ๊ด๋ ๋ชจ๋ ๊ธฐ์กด ๊ธฐ๋ฅ ์๋ณ
- - [ ] **API ์์กด์ฑ ๋ถ์**: ๊ธฐ์กด API ์๋ํฌ์ธํธ, ์์ฒญ/์๋ต ํ์ ํ์ธ
- - [ ] **๋ฐ์ดํฐ๋ฒ ์ด์ค ์คํค๋ง ํ์ธ**: ํ
์ด๋ธ, ์ ์ฝ์กฐ๊ฑด, ์ธ๋ฑ์ค ์ํฅ๋ ๋ถ์
- - [ ] **ํ๋ก ํธ์๋ ์ฐ๋ ํ์ธ**: ์ปดํฌ๋ํธ, ๋ผ์ฐํ
, ์ํ๊ด๋ฆฌ ์ํฅ๋ ๋ถ์
- ### Phase 2: ์์ ํ ์ค๊ณ (Safe Design)
- - [ ] **๋
๋ฆฝ์ ๊ตฌ์กฐ**: ์ ๊ธฐ๋ฅ์ ๊ธฐ์กด ๊ธฐ๋ฅ๊ณผ ๋ถ๋ฆฌ๋ ๋
๋ฆฝ์ ๊ตฌ์กฐ๋ก ์ค๊ณ
- - [ ] **ํ์ ํธํ์ฑ**: ๊ธฐ์กด API ์คํ, ๋ฐ์ดํฐ ํ์ ์ ์ง
- - [ ] **์ ์ง์ ์ ์ฉ**: ํ ๋ฒ์ ์ฌ๋ฌ ์์ญ ์์ ํ์ง ์๊ณ ๋จ๊ณ๋ณ ์ ์ฉ
- - [ ] **๋กค๋ฐฑ ๊ณํ**: ๋ฌธ์ ๋ฐ์ ์ ์ฆ์ ์ด์ ์ํ๋ก ๋ณต๊ตฌ ๊ฐ๋ฅํ ๊ณํ ์๋ฆฝ
- ### Phase 3: ๊ตฌํ ์ค ์์ ์ฅ์น (Implementation Safeguards)
- - [ ] **์๋ก์ด API ์๋ํฌ์ธํธ**: ๊ธฐ์กด API ์์ ๋์ ์ ์๋ํฌ์ธํธ ์์ฑ
- - [ ] **๋ณ๋ ๋ฉ์๋/ํจ์**: ๊ธฐ์กด ๋ก์ง ์์ ๋์ ์ ๋ฉ์๋ ์์ฑ
- - [ ] **๋ฐ์ดํฐ ์์นด์ด๋ธ**: ๊ธฐ์กด ๋ฐ์ดํฐ ์ญ์ ๋์ ๋นํ์ฑํ ๋๋ ์์นด์ด๋ธ
- - [ ] **์กฐ๊ฑด๋ถ ํ์ฑํ**: ํ๋๊ทธ๋ ์ค์ ์ ํตํ ์ ๊ธฐ๋ฅ ์กฐ๊ฑด๋ถ ํ์ฑํ
- ### Phase 4: ํ
์คํธ ๋ฐ ๊ฒ์ฆ (Testing & Validation)
- - [ ] **๊ธฐ์กด ๊ธฐ๋ฅ ํ๊ท ํ
์คํธ**: ๋ชจ๋ ๊ธฐ์กด ๊ธฐ๋ฅ ์ ์ ์๋ ํ์ธ
- - [ ] **API ์๋ต ๊ฒ์ฆ**: ๊ธฐ์กด API ์๋ต ํ์ ๋ฐ ๋ฐ์ดํฐ ์ ํ์ฑ ํ์ธ
- - [ ] **๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ ๊ฒ์ฆ**: ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ์ฝ์กฐ๊ฑด, ๊ด๊ณ ์ ์ ํ์ธ
- - [ ] **UI/UX ๊ฒ์ฆ**: ๊ธฐ์กด ํ๋ฉด ๋ฐ ์ฌ์ฉ์ ํ๋ก์ฐ ์ ์ ์๋ ํ์ธ
- ---
- ## ๐ซ ๊ธ์ง์ฌํญ (Never Do)
- ### ๊ธฐ์กด ์ฝ๋ ์ง์ ์์ ๊ธ์ง
- ```javascript
- // โ ๊ธฐ์กด ํจ์ ์ง์ ์์
- function existingFunction() {
- // ๊ธฐ์กด ๋ก์ง
- // ์๋ก์ด ๋ก์ง ์ถ๊ฐ - ์ํ!
- }
- // โ
์๋ก์ด ํจ์ ์์ฑ
- function newFeatureFunction() {
- // ์๋ก์ด ๋ก์ง
- }
- ```
- ### ๊ธฐ์กด API ์คํ ๋ณ๊ฒฝ ๊ธ์ง
- ```javascript
- // โ ๊ธฐ์กด API ์๋ต ํ์ ๋ณ๊ฒฝ
- {
- "success": true,
- "data": [], // ๊ธฐ์กด ๊ตฌ์กฐ ๋ณ๊ฒฝ - ์ํ!
- "newField": "์ ํ๋ ์ถ๊ฐ" // ๋ธ๋ ์ดํน ์ฒด์ธ์ง
- }
- // โ
์๋ก์ด API ์๋ํฌ์ธํธ
- POST /api/new-feature
- {
- "success": true,
- "data": {
- "newStructure": "์ ๊ตฌ์กฐ"
- }
- }
- ```
- ### ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ๊ดด์ ๋ณ๊ฒฝ ๊ธ์ง
- ```sql
- -- โ ๊ธฐ์กด ํ
์ด๋ธ/์ปฌ๋ผ ์ญ์
- DROP TABLE existing_table;
- ALTER TABLE users DROP COLUMN important_field;
- -- โ
์๋ก์ด ํ
์ด๋ธ/์ปฌ๋ผ ์ถ๊ฐ
- CREATE TABLE new_feature_table (...);
- ALTER TABLE users ADD COLUMN new_optional_field VARCHAR(255);
- ```
- ---
- ## ๐ง ์์ ํ ์์ ํจํด
- ### 1. ๊ธฐ๋ฅ ํ์ฅ ํจํด
- ```javascript
- // ๊ธฐ์กด ๊ธฐ๋ฅ ์ ์งํ๋ฉด์ ํ์ฅ
- class OriginalService {
- existingMethod() {
- // ๊ธฐ์กด ๋ก์ง ๊ทธ๋๋ก ์ ์ง
- }
-
- newMethod() {
- // ์๋ก์ด ๊ธฐ๋ฅ ์ถ๊ฐ
- }
- }
- ```
- ### 2. ์กฐ๊ฑด๋ถ ๋ถ๊ธฐ ํจํด
- ```javascript
- function processRequest(type) {
- if (type === 'existing') {
- return existingLogic(); // ๊ธฐ์กด ๋ก์ง
- } else if (type === 'new') {
- return newLogic(); // ์ ๋ก์ง
- }
- }
- ```
- ### 3. ๋ฐ์ฝ๋ ์ดํฐ/๋ํผ ํจํด
- ```javascript
- function enhancedFunction(originalFunction) {
- return function(...args) {
- // ์๋ก์ด ์ ์ฒ๋ฆฌ
- const result = originalFunction(...args); // ๊ธฐ์กด ๋ก์ง
- // ์๋ก์ด ํ์ฒ๋ฆฌ
- return result;
- };
- }
- ```
- ---
- ## ๐ ์ํฅ๋ ๋งคํธ๋ฆญ์ค
- | ์์ ์์ญ | ๊ธฐ์กด ๊ธฐ๋ฅ ์ํฅ๋ | ์์ ์ฅ์น |
- |-----------|------------------|----------|
- | ์ API ์ถ๊ฐ | ๐ข ๋ฎ์ | ๋
๋ฆฝ์ ์๋ํฌ์ธํธ |
- | ๊ธฐ์กด API ์์ | ๐ด ๋์ | ํ์ ํธํ์ฑ ๋ณด์ฅ |
- | ์ DB ํ
์ด๋ธ | ๐ข ๋ฎ์ | ๋
๋ฆฝ์ ์คํค๋ง |
- | ๊ธฐ์กด DB ์์ | ๐ก ์ค๊ฐ | ๋นํ๊ดด์ ๋ณ๊ฒฝ๋ง |
- | ์ UI ์ปดํฌ๋ํธ | ๐ข ๋ฎ์ | ๋ณ๋ ์ปดํฌ๋ํธ |
- | ๊ธฐ์กด UI ์์ | ๐ก ์ค๊ฐ | ์กฐ๊ฑด๋ถ ๋ ๋๋ง |
- ---
- ## ๐จ ๊ธด๊ธ ์ํฉ ๋์
- ### ๊ธฐ์กด ๊ธฐ๋ฅ ์ฅ์ ๋ฐ์ ์
- 1. **์ฆ์ ๋กค๋ฐฑ**: ์ ๊ธฐ๋ฅ ๋นํ์ฑํ ๋๋ ์ด์ ๋ฒ์ ๋ณต๊ตฌ
- 2. **์์ธ ๋ถ์**: ์ด๋ค ๋ณ๊ฒฝ์ด ๊ธฐ์กด ๊ธฐ๋ฅ์ ์ํฅ์ ์ฃผ์๋์ง ๋ถ์
- 3. **๊ธด๊ธ ํจ์น**: ๊ธฐ์กด ๊ธฐ๋ฅ ๋ณต๊ตฌ๋ฅผ ์ต์ฐ์ ์ผ๋ก ์ฒ๋ฆฌ
- 4. **์ฌ์ค๊ณ**: ์์ ํ ๋ฐฉ์์ผ๋ก ์ ๊ธฐ๋ฅ ์ฌ๊ตฌํ
- ### ๋กค๋ฐฑ ์ ์ฐจ
- ```bash
- # 1. ์ฆ์ ์ด์ ์ํ๋ก ๋ณต๊ตฌ
- git revert HEAD
- git push origin main
- # 2. ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ณต๊ตฌ (ํ์์)
- mysql -u root -p < backup_before_change.sql
- # 3. ์บ์ ํด๋ฆฌ์ด
- redis-cli FLUSHALL
- ```
- ---
- ## ๐ ์ฒดํฌ๋ฆฌ์คํธ ํ
ํ๋ฆฟ
- ### ๊ธฐ๋ฅ ์์ ์ ์ฒดํฌ
- ```markdown
- ## ๊ธฐ๋ฅ ์์ ์์ ์ฑ ์ฒดํฌ๋ฆฌ์คํธ
- **์์ ๋ ์ง**: ___________
- **์์ ์**: ___________
- **์์ ๋ด์ฉ**: ___________
- ### Phase 1: ์ํฅ๋ ๋ถ์
- - [ ] ๊ด๋ จ ๊ธฐ์กด ๊ธฐ๋ฅ ๋ชฉ๋ก ์์ฑ
- - [ ] API ์์กด์ฑ ํ์ธ
- - [ ] ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ํฅ๋ ํ์ธ
- - [ ] ํ๋ก ํธ์๋ ์ํฅ๋ ํ์ธ
- ### Phase 2: ์์ ํ ์ค๊ณ
- - [ ] ๋
๋ฆฝ์ ๊ตฌ์กฐ ์ค๊ณ
- - [ ] ํ์ ํธํ์ฑ ๋ณด์ฅ
- - [ ] ๋กค๋ฐฑ ๊ณํ ์๋ฆฝ
- ### Phase 3: ๊ตฌํ
- - [ ] ์๋ก์ด ์๋ํฌ์ธํธ/๋ฉ์๋ ์ฌ์ฉ
- - [ ] ๊ธฐ์กด ์ฝ๋ ์ง์ ์์ ์์
- - [ ] ์กฐ๊ฑด๋ถ ํ์ฑํ ์ ์ฉ
- ### Phase 4: ํ
์คํธ
- - [ ] ๊ธฐ์กด ๊ธฐ๋ฅ ํ๊ท ํ
์คํธ ์๋ฃ
- - [ ] ์ ๊ธฐ๋ฅ ์ ์ ์๋ ํ์ธ
- - [ ] ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ ํ์ธ
- ```
- ---
- ## ๐ก ๋ฒ ์คํธ ํ๋ํฐ์ค
- 1. **"๊ธฐ์กด ๊ธฐ๋ฅ ์ฐ์ "** ๋ง์ธ๋์
์ ์ง
- 2. **์ ์ง์ ๊ฐ๋ฐ**: ์์ ๋จ์๋ก ๋๋์ด ์์ ํ๊ฒ ๊ตฌํ
- 3. **์ถฉ๋ถํ ํ
์คํธ**: ์ ๊ธฐ๋ฅ๊ณผ ๊ธฐ์กด ๊ธฐ๋ฅ ๋ชจ๋ ํ
์คํธ
- 4. **๋ฌธ์ํ**: ๋ณ๊ฒฝ์ฌํญ๊ณผ ์์ ์ฅ์น ์์ธ ๊ธฐ๋ก
- 5. **ํ ๊ณต์ **: ๋ณ๊ฒฝ์ฌํญ์ ํ์๋ค๊ณผ ์ฌ์ ๊ณต์ ๋ฐ ๋ฆฌ๋ทฐ
- **"์๋ก์ด ๊ธฐ๋ฅ์ ์ถ๊ฐํ๋, ๊ธฐ์กด์ ๊ฐ์น๋ฅผ ์ง์ผ๋ผ"**
- description:
- globs:
- alwaysApply: false
- ---
|