safe-development-practice.mdc 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  1. # ๐Ÿ›ก๏ธ ์•ˆ์ „ํ•œ ๊ฐœ๋ฐœ ์‹ค์ฒœ ๊ทœ์น™ (Safe Development Practice)
  2. ## ํ•ต์‹ฌ ์›์น™: "๊ธฐ์กด ๊ธฐ๋Šฅ ์šฐ์„  ๋ณดํ˜ธ"
  3. **๋ชจ๋“  ๊ธฐ๋Šฅ ์ˆ˜์ •, ์ถ”๊ฐ€, ๋ฒ„๊ทธ ํ”ฝ์Šค ์‹œ ๊ธฐ์กด ์ •์ƒ ๊ธฐ๋Šฅ๋“ค์ด ์˜ํ–ฅ๋ฐ›์ง€ ์•Š๋„๋ก ์‚ฌ์ „ ์ฒดํฌ ๋ฐ ์•ˆ์ „์žฅ์น˜ ์ ์šฉ์ด ์ตœ์šฐ์„ **
  4. ---
  5. ## ๐Ÿ“‹ ํ•„์ˆ˜ ์ฒดํฌ๋ฆฌ์ŠคํŠธ
  6. ### Phase 1: ์‚ฌ์ „ ์˜ํ–ฅ๋„ ๋ถ„์„ (Pre-Impact Analysis)
  7. - [ ] **๊ธฐ์กด ๊ธฐ๋Šฅ ๋งคํ•‘**: ์ˆ˜์ •ํ•  ์˜์—ญ๊ณผ ์—ฐ๊ด€๋œ ๋ชจ๋“  ๊ธฐ์กด ๊ธฐ๋Šฅ ์‹๋ณ„
  8. - [ ] **API ์˜์กด์„ฑ ๋ถ„์„**: ๊ธฐ์กด API ์—”๋“œํฌ์ธํŠธ, ์š”์ฒญ/์‘๋‹ต ํ˜•์‹ ํ™•์ธ
  9. - [ ] **๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์Šคํ‚ค๋งˆ ํ™•์ธ**: ํ…Œ์ด๋ธ”, ์ œ์•ฝ์กฐ๊ฑด, ์ธ๋ฑ์Šค ์˜ํ–ฅ๋„ ๋ถ„์„
  10. - [ ] **ํ”„๋ก ํŠธ์—”๋“œ ์—ฐ๋™ ํ™•์ธ**: ์ปดํฌ๋„ŒํŠธ, ๋ผ์šฐํŒ…, ์ƒํƒœ๊ด€๋ฆฌ ์˜ํ–ฅ๋„ ๋ถ„์„
  11. ### Phase 2: ์•ˆ์ „ํ•œ ์„ค๊ณ„ (Safe Design)
  12. - [ ] **๋…๋ฆฝ์  ๊ตฌ์กฐ**: ์ƒˆ ๊ธฐ๋Šฅ์€ ๊ธฐ์กด ๊ธฐ๋Šฅ๊ณผ ๋ถ„๋ฆฌ๋œ ๋…๋ฆฝ์  ๊ตฌ์กฐ๋กœ ์„ค๊ณ„
  13. - [ ] **ํ•˜์œ„ ํ˜ธํ™˜์„ฑ**: ๊ธฐ์กด API ์ŠคํŽ™, ๋ฐ์ดํ„ฐ ํ˜•์‹ ์œ ์ง€
  14. - [ ] **์ ์ง„์  ์ ์šฉ**: ํ•œ ๋ฒˆ์— ์—ฌ๋Ÿฌ ์˜์—ญ ์ˆ˜์ •ํ•˜์ง€ ์•Š๊ณ  ๋‹จ๊ณ„๋ณ„ ์ ์šฉ
  15. - [ ] **๋กค๋ฐฑ ๊ณ„ํš**: ๋ฌธ์ œ ๋ฐœ์ƒ ์‹œ ์ฆ‰์‹œ ์ด์ „ ์ƒํƒœ๋กœ ๋ณต๊ตฌ ๊ฐ€๋Šฅํ•œ ๊ณ„ํš ์ˆ˜๋ฆฝ
  16. ### Phase 3: ๊ตฌํ˜„ ์ค‘ ์•ˆ์ „์žฅ์น˜ (Implementation Safeguards)
  17. - [ ] **์ƒˆ๋กœ์šด API ์—”๋“œํฌ์ธํŠธ**: ๊ธฐ์กด API ์ˆ˜์ • ๋Œ€์‹  ์ƒˆ ์—”๋“œํฌ์ธํŠธ ์ƒ์„ฑ
  18. - [ ] **๋ณ„๋„ ๋ฉ”์„œ๋“œ/ํ•จ์ˆ˜**: ๊ธฐ์กด ๋กœ์ง ์ˆ˜์ • ๋Œ€์‹  ์ƒˆ ๋ฉ”์„œ๋“œ ์ƒ์„ฑ
  19. - [ ] **๋ฐ์ดํ„ฐ ์•„์นด์ด๋ธŒ**: ๊ธฐ์กด ๋ฐ์ดํ„ฐ ์‚ญ์ œ ๋Œ€์‹  ๋น„ํ™œ์„ฑํ™” ๋˜๋Š” ์•„์นด์ด๋ธŒ
  20. - [ ] **์กฐ๊ฑด๋ถ€ ํ™œ์„ฑํ™”**: ํ”Œ๋ž˜๊ทธ๋‚˜ ์„ค์ •์„ ํ†ตํ•œ ์ƒˆ ๊ธฐ๋Šฅ ์กฐ๊ฑด๋ถ€ ํ™œ์„ฑํ™”
  21. ### Phase 4: ํ…Œ์ŠคํŠธ ๋ฐ ๊ฒ€์ฆ (Testing & Validation)
  22. - [ ] **๊ธฐ์กด ๊ธฐ๋Šฅ ํšŒ๊ท€ ํ…Œ์ŠคํŠธ**: ๋ชจ๋“  ๊ธฐ์กด ๊ธฐ๋Šฅ ์ •์ƒ ์ž‘๋™ ํ™•์ธ
  23. - [ ] **API ์‘๋‹ต ๊ฒ€์ฆ**: ๊ธฐ์กด API ์‘๋‹ต ํ˜•์‹ ๋ฐ ๋ฐ์ดํ„ฐ ์ •ํ™•์„ฑ ํ™•์ธ
  24. - [ ] **๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ ๊ฒ€์ฆ**: ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ œ์•ฝ์กฐ๊ฑด, ๊ด€๊ณ„ ์ •์ƒ ํ™•์ธ
  25. - [ ] **UI/UX ๊ฒ€์ฆ**: ๊ธฐ์กด ํ™”๋ฉด ๋ฐ ์‚ฌ์šฉ์ž ํ”Œ๋กœ์šฐ ์ •์ƒ ์ž‘๋™ ํ™•์ธ
  26. ---
  27. ## ๐Ÿšซ ๊ธˆ์ง€์‚ฌํ•ญ (Never Do)
  28. ### ๊ธฐ์กด ์ฝ”๋“œ ์ง์ ‘ ์ˆ˜์ • ๊ธˆ์ง€
  29. ```javascript
  30. // โŒ ๊ธฐ์กด ํ•จ์ˆ˜ ์ง์ ‘ ์ˆ˜์ •
  31. function existingFunction() {
  32. // ๊ธฐ์กด ๋กœ์ง
  33. // ์ƒˆ๋กœ์šด ๋กœ์ง ์ถ”๊ฐ€ - ์œ„ํ—˜!
  34. }
  35. // โœ… ์ƒˆ๋กœ์šด ํ•จ์ˆ˜ ์ƒ์„ฑ
  36. function newFeatureFunction() {
  37. // ์ƒˆ๋กœ์šด ๋กœ์ง
  38. }
  39. ```
  40. ### ๊ธฐ์กด API ์ŠคํŽ™ ๋ณ€๊ฒฝ ๊ธˆ์ง€
  41. ```javascript
  42. // โŒ ๊ธฐ์กด API ์‘๋‹ต ํ˜•์‹ ๋ณ€๊ฒฝ
  43. {
  44. "success": true,
  45. "data": [], // ๊ธฐ์กด ๊ตฌ์กฐ ๋ณ€๊ฒฝ - ์œ„ํ—˜!
  46. "newField": "์ƒˆ ํ•„๋“œ ์ถ”๊ฐ€" // ๋ธŒ๋ ˆ์ดํ‚น ์ฒด์ธ์ง€
  47. }
  48. // โœ… ์ƒˆ๋กœ์šด API ์—”๋“œํฌ์ธํŠธ
  49. POST /api/new-feature
  50. {
  51. "success": true,
  52. "data": {
  53. "newStructure": "์ƒˆ ๊ตฌ์กฐ"
  54. }
  55. }
  56. ```
  57. ### ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํŒŒ๊ดด์  ๋ณ€๊ฒฝ ๊ธˆ์ง€
  58. ```sql
  59. -- โŒ ๊ธฐ์กด ํ…Œ์ด๋ธ”/์ปฌ๋Ÿผ ์‚ญ์ œ
  60. DROP TABLE existing_table;
  61. ALTER TABLE users DROP COLUMN important_field;
  62. -- โœ… ์ƒˆ๋กœ์šด ํ…Œ์ด๋ธ”/์ปฌ๋Ÿผ ์ถ”๊ฐ€
  63. CREATE TABLE new_feature_table (...);
  64. ALTER TABLE users ADD COLUMN new_optional_field VARCHAR(255);
  65. ```
  66. ---
  67. ## ๐Ÿ”ง ์•ˆ์ „ํ•œ ์ˆ˜์ • ํŒจํ„ด
  68. ### 1. ๊ธฐ๋Šฅ ํ™•์žฅ ํŒจํ„ด
  69. ```javascript
  70. // ๊ธฐ์กด ๊ธฐ๋Šฅ ์œ ์ง€ํ•˜๋ฉด์„œ ํ™•์žฅ
  71. class OriginalService {
  72. existingMethod() {
  73. // ๊ธฐ์กด ๋กœ์ง ๊ทธ๋Œ€๋กœ ์œ ์ง€
  74. }
  75. newMethod() {
  76. // ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ ์ถ”๊ฐ€
  77. }
  78. }
  79. ```
  80. ### 2. ์กฐ๊ฑด๋ถ€ ๋ถ„๊ธฐ ํŒจํ„ด
  81. ```javascript
  82. function processRequest(type) {
  83. if (type === 'existing') {
  84. return existingLogic(); // ๊ธฐ์กด ๋กœ์ง
  85. } else if (type === 'new') {
  86. return newLogic(); // ์ƒˆ ๋กœ์ง
  87. }
  88. }
  89. ```
  90. ### 3. ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ/๋ž˜ํผ ํŒจํ„ด
  91. ```javascript
  92. function enhancedFunction(originalFunction) {
  93. return function(...args) {
  94. // ์ƒˆ๋กœ์šด ์ „์ฒ˜๋ฆฌ
  95. const result = originalFunction(...args); // ๊ธฐ์กด ๋กœ์ง
  96. // ์ƒˆ๋กœ์šด ํ›„์ฒ˜๋ฆฌ
  97. return result;
  98. };
  99. }
  100. ```
  101. ---
  102. ## ๐Ÿ“Š ์˜ํ–ฅ๋„ ๋งคํŠธ๋ฆญ์Šค
  103. | ์ˆ˜์ • ์˜์—ญ | ๊ธฐ์กด ๊ธฐ๋Šฅ ์˜ํ–ฅ๋„ | ์•ˆ์ „์žฅ์น˜ |
  104. |-----------|------------------|----------|
  105. | ์ƒˆ API ์ถ”๊ฐ€ | ๐ŸŸข ๋‚ฎ์Œ | ๋…๋ฆฝ์  ์—”๋“œํฌ์ธํŠธ |
  106. | ๊ธฐ์กด API ์ˆ˜์ • | ๐Ÿ”ด ๋†’์Œ | ํ•˜์œ„ ํ˜ธํ™˜์„ฑ ๋ณด์žฅ |
  107. | ์ƒˆ DB ํ…Œ์ด๋ธ” | ๐ŸŸข ๋‚ฎ์Œ | ๋…๋ฆฝ์  ์Šคํ‚ค๋งˆ |
  108. | ๊ธฐ์กด DB ์ˆ˜์ • | ๐ŸŸก ์ค‘๊ฐ„ | ๋น„ํŒŒ๊ดด์  ๋ณ€๊ฒฝ๋งŒ |
  109. | ์ƒˆ UI ์ปดํฌ๋„ŒํŠธ | ๐ŸŸข ๋‚ฎ์Œ | ๋ณ„๋„ ์ปดํฌ๋„ŒํŠธ |
  110. | ๊ธฐ์กด UI ์ˆ˜์ • | ๐ŸŸก ์ค‘๊ฐ„ | ์กฐ๊ฑด๋ถ€ ๋ Œ๋”๋ง |
  111. ---
  112. ## ๐Ÿšจ ๊ธด๊ธ‰ ์ƒํ™ฉ ๋Œ€์‘
  113. ### ๊ธฐ์กด ๊ธฐ๋Šฅ ์žฅ์•  ๋ฐœ์ƒ ์‹œ
  114. 1. **์ฆ‰์‹œ ๋กค๋ฐฑ**: ์ƒˆ ๊ธฐ๋Šฅ ๋น„ํ™œ์„ฑํ™” ๋˜๋Š” ์ด์ „ ๋ฒ„์ „ ๋ณต๊ตฌ
  115. 2. **์›์ธ ๋ถ„์„**: ์–ด๋–ค ๋ณ€๊ฒฝ์ด ๊ธฐ์กด ๊ธฐ๋Šฅ์— ์˜ํ–ฅ์„ ์ฃผ์—ˆ๋Š”์ง€ ๋ถ„์„
  116. 3. **๊ธด๊ธ‰ ํŒจ์น˜**: ๊ธฐ์กด ๊ธฐ๋Šฅ ๋ณต๊ตฌ๋ฅผ ์ตœ์šฐ์„ ์œผ๋กœ ์ฒ˜๋ฆฌ
  117. 4. **์žฌ์„ค๊ณ„**: ์•ˆ์ „ํ•œ ๋ฐฉ์‹์œผ๋กœ ์ƒˆ ๊ธฐ๋Šฅ ์žฌ๊ตฌํ˜„
  118. ### ๋กค๋ฐฑ ์ ˆ์ฐจ
  119. ```bash
  120. # 1. ์ฆ‰์‹œ ์ด์ „ ์ƒํƒœ๋กœ ๋ณต๊ตฌ
  121. git revert HEAD
  122. git push origin main
  123. # 2. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ณต๊ตฌ (ํ•„์š”์‹œ)
  124. mysql -u root -p < backup_before_change.sql
  125. # 3. ์บ์‹œ ํด๋ฆฌ์–ด
  126. redis-cli FLUSHALL
  127. ```
  128. ---
  129. ## ๐Ÿ“ ์ฒดํฌ๋ฆฌ์ŠคํŠธ ํ…œํ”Œ๋ฆฟ
  130. ### ๊ธฐ๋Šฅ ์ˆ˜์ • ์ „ ์ฒดํฌ
  131. ```markdown
  132. ## ๊ธฐ๋Šฅ ์ˆ˜์ • ์•ˆ์ „์„ฑ ์ฒดํฌ๋ฆฌ์ŠคํŠธ
  133. **์ˆ˜์ • ๋‚ ์งœ**: ___________
  134. **์ˆ˜์ •์ž**: ___________
  135. **์ˆ˜์ • ๋‚ด์šฉ**: ___________
  136. ### Phase 1: ์˜ํ–ฅ๋„ ๋ถ„์„
  137. - [ ] ๊ด€๋ จ ๊ธฐ์กด ๊ธฐ๋Šฅ ๋ชฉ๋ก ์ž‘์„ฑ
  138. - [ ] API ์˜์กด์„ฑ ํ™•์ธ
  139. - [ ] ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์˜ํ–ฅ๋„ ํ™•์ธ
  140. - [ ] ํ”„๋ก ํŠธ์—”๋“œ ์˜ํ–ฅ๋„ ํ™•์ธ
  141. ### Phase 2: ์•ˆ์ „ํ•œ ์„ค๊ณ„
  142. - [ ] ๋…๋ฆฝ์  ๊ตฌ์กฐ ์„ค๊ณ„
  143. - [ ] ํ•˜์œ„ ํ˜ธํ™˜์„ฑ ๋ณด์žฅ
  144. - [ ] ๋กค๋ฐฑ ๊ณ„ํš ์ˆ˜๋ฆฝ
  145. ### Phase 3: ๊ตฌํ˜„
  146. - [ ] ์ƒˆ๋กœ์šด ์—”๋“œํฌ์ธํŠธ/๋ฉ”์„œ๋“œ ์‚ฌ์šฉ
  147. - [ ] ๊ธฐ์กด ์ฝ”๋“œ ์ง์ ‘ ์ˆ˜์ • ์—†์Œ
  148. - [ ] ์กฐ๊ฑด๋ถ€ ํ™œ์„ฑํ™” ์ ์šฉ
  149. ### Phase 4: ํ…Œ์ŠคํŠธ
  150. - [ ] ๊ธฐ์กด ๊ธฐ๋Šฅ ํšŒ๊ท€ ํ…Œ์ŠคํŠธ ์™„๋ฃŒ
  151. - [ ] ์ƒˆ ๊ธฐ๋Šฅ ์ •์ƒ ์ž‘๋™ ํ™•์ธ
  152. - [ ] ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ ํ™•์ธ
  153. ```
  154. ---
  155. ## ๐Ÿ’ก ๋ฒ ์ŠคํŠธ ํ”„๋ž™ํ‹ฐ์Šค
  156. 1. **"๊ธฐ์กด ๊ธฐ๋Šฅ ์šฐ์„ "** ๋งˆ์ธ๋“œ์…‹ ์œ ์ง€
  157. 2. **์ ์ง„์  ๊ฐœ๋ฐœ**: ์ž‘์€ ๋‹จ์œ„๋กœ ๋‚˜๋ˆ„์–ด ์•ˆ์ „ํ•˜๊ฒŒ ๊ตฌํ˜„
  158. 3. **์ถฉ๋ถ„ํ•œ ํ…Œ์ŠคํŠธ**: ์ƒˆ ๊ธฐ๋Šฅ๊ณผ ๊ธฐ์กด ๊ธฐ๋Šฅ ๋ชจ๋‘ ํ…Œ์ŠคํŠธ
  159. 4. **๋ฌธ์„œํ™”**: ๋ณ€๊ฒฝ์‚ฌํ•ญ๊ณผ ์•ˆ์ „์žฅ์น˜ ์ƒ์„ธ ๊ธฐ๋ก
  160. 5. **ํŒ€ ๊ณต์œ **: ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ํŒ€์›๋“ค๊ณผ ์‚ฌ์ „ ๊ณต์œ  ๋ฐ ๋ฆฌ๋ทฐ
  161. **"์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๋˜, ๊ธฐ์กด์˜ ๊ฐ€์น˜๋ฅผ ์ง€์ผœ๋ผ"**
  162. description:
  163. globs:
  164. alwaysApply: false
  165. ---