api-rule.mdc 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265
  1. # 최우선 규칙: 한글 응답 필수
  2. **모든 응답은 한글로만 작성해야 함. 이 규칙은 다른 모든 규칙보다 우선한다.**
  3. # 🛡️ 기존 기능 안전성 보장 규칙 (최우선)
  4. **모든 기능 수정, 추가, 버그 수정 시 기존 정상 기능들이 영향받지 않도록 사전 체크 및 안전장치 적용 필수**
  5. ## 필수 준수사항
  6. 1. **기존 API 엔드포인트 직접 수정 금지** - 새 엔드포인트 생성
  7. 2. **기존 데이터베이스 스키마 파괴적 변경 금지** - 아카이브 방식 사용
  8. 3. **기존 컨트롤러/모델 메서드 직접 수정 금지** - 새 메서드 생성
  9. 4. **기존 프론트엔드 컴포넌트 직접 수정 최소화** - 조건부 렌더링 활용
  10. 5. **모든 변경사항은 독립적 구조로 설계** - 기존 기능과 분리
  11. ## 사전 체크 필수
  12. - [ ] 기존 기능 영향도 분석
  13. - [ ] 독립적 구조 설계 확인
  14. - [ ] 롤백 계획 수립
  15. - [ ] 기존 기능 회귀 테스트
  16. # 변경 로그 관리 규칙
  17. **모든 작업 완료 후 반드시 md 폴더에 날짜별 변경 로그를 작성해야 함.**
  18. ## 작성 규칙
  19. - **파일명**: `md/YYYY-MM-DD.md` 형식
  20. - **언어**: 한글로 작성
  21. - **템플릿**: `md/README.md` 참조
  22. ## 필수 작성 시점
  23. - ✅ 새로운 기능 구현 후
  24. - ✅ 버그 수정 후
  25. - ✅ 리팩토링 완료 후
  26. - ✅ API 추가/수정 후
  27. - ✅ 데이터베이스 스키마 변경 후
  28. - ✅ UI/UX 개선 후
  29. ## 작성 내용
  30. - 🎯 주요 변경사항 요약
  31. - 📝 변경된 파일 목록과 상세 내용
  32. - 🧪 테스트 확인 결과
  33. - 📌 다음 작업 예정사항
  34. # companyId 사용 금지 규칙
  35. **companyId는 사용하지 않는 값이므로 모든 코드에서 제거해야 함. 프론트엔드, 백엔드 모두 해당.**
  36. - 대신 COMPANY_NUMBER를 직접 사용
  37. - companyId 관련 변수, 필드, 파라미터 모두 제거
  38. - API 요청/응답에서 companyId 사용 금지
  39. # 벤더-인플루언서 처리자 SEQ 인증 규칙
  40. **백엔드에서 processedBy, approvedBy, terminatedBy 등 처리자 SEQ를 받을 때는 반드시 다음 로직을 적용해야 함:**
  41. ## 처리자 SEQ 변환 표준 로직
  42. ```php
  43. // 처리자 확인 (벤더사 SEQ인지 사용자 SEQ인지 확인)
  44. $processingUser = null;
  45. // 1. 먼저 USER_LIST에서 확인 (인플루언서)
  46. $processingUser = $this->userModel
  47. ->where('SEQ', $processedBy)
  48. ->where('IS_ACT', 'Y')
  49. ->first();
  50. if ($processingUser) {
  51. // 사용자 SEQ인 경우 (인플루언서) - 바로 사용
  52. $approvedByUserSeq = $processedBy;
  53. } else {
  54. // 2. VENDOR_LIST에서 확인 (벤더사)
  55. $vendorInfo = $this->vendorModel
  56. ->where('SEQ', $processedBy)
  57. ->where('IS_ACT', 'Y')
  58. ->first();
  59. if ($vendorInfo) {
  60. // 벤더사 SEQ인 경우 - 벤더사가 직접 처리하는 것으로 간주
  61. $approvedByUserSeq = $processedBy;
  62. // 응답용 정보 설정 (필요시)
  63. $processingUser = [
  64. 'SEQ' => $vendorInfo['SEQ'],
  65. 'NICK_NAME' => $vendorInfo['COMPANY_NAME'] . ' (벤더사)',
  66. 'NAME' => $vendorInfo['COMPANY_NAME']
  67. ];
  68. } else {
  69. return $this->response->setStatusCode(400)->setJSON([
  70. 'success' => false,
  71. 'message' => "처리자 SEQ {$processedBy}는 USER_LIST나 VENDOR_LIST에서 찾을 수 없습니다."
  72. ]);
  73. }
  74. }
  75. // 최종적으로 $approvedByUserSeq를 데이터베이스에 저장
  76. ```
  77. ## 규칙 적용 필수 상황
  78. - **승인/거부 처리**: approveRequest() 함수
  79. - **해지 처리**: terminate() 함수
  80. - **취소 처리**: cancelRequest() 함수
  81. - **기타 모든 사용자 인증이 필요한 벤더-인플루언서 관련 API**
  82. ## 이유
  83. - **인플루언서**: USER_LIST 테이블에서 개인 계정으로 관리
  84. - **벤더사**: VENDOR_LIST 테이블에서 회사 계정으로 관리
  85. - 두 시스템을 구분하여 처리하되, 데이터베이스 저장 시에는 해당 SEQ를 그대로 사용
  86. - USER_LIST에는 COMPANY_NUMBER 컬럼이 불필요함 (인플루언서는 개인이므로)
  87. # API & Store Rules
  88. ## Pinia Store Rules
  89. ### 1. Setup Syntax Store Reset 구현
  90. - Setup 문법(`defineStore(() => {...})`)으로 작성된 store는 자동 `$reset()`이 제공되지 않음
  91. - 반드시 수동으로 `reset()` 함수를 구현해야 함
  92. ```typescript
  93. // Good
  94. export const useMyStore = defineStore('myStore', () => {
  95. const data = ref([])
  96. const loading = ref(false)
  97. // 수동으로 reset 함수 구현
  98. function reset() {
  99. data.value = []
  100. loading.value = false
  101. }
  102. return {
  103. data,
  104. loading,
  105. reset // reset 함수 반환 필수
  106. }
  107. })
  108. // Bad - reset 함수 없음
  109. export const useMyStore = defineStore('myStore', () => {
  110. const data = ref([])
  111. return { data }
  112. })
  113. ```
  114. ### 2. Reset 함수 구현 가이드
  115. - 모든 state를 초기값으로 되돌리는 로직 포함
  116. - 중첩된 객체의 경우 깊은 복사 고려
  117. - persist 옵션이 있는 경우 저장소 데이터도 정리
  118. ```typescript
  119. function reset() {
  120. // 단순 값 초기화
  121. simpleValue.value = null
  122. // 객체 초기화
  123. objectValue.value = {
  124. prop1: '',
  125. prop2: 0
  126. }
  127. // 배열 초기화
  128. arrayValue.value = []
  129. // 중첩 객체 초기화
  130. complexValue.value = JSON.parse(JSON.stringify(DEFAULT_STATE))
  131. }
  132. ```
  133. ### 3. Store 초기화 호출 방식
  134. - Setup 문법 store: `store.reset()`
  135. - Options 문법 store: `store.$reset()`
  136. ```typescript
  137. // Setup store
  138. const setupStore = useSetupStore()
  139. setupStore.reset() // O
  140. setupStore.$reset() // X - 에러 발생
  141. // Options store
  142. const optionsStore = useOptionsStore()
  143. optionsStore.$reset() // O
  144. ```
  145. ### 4. Store 초기화 시점
  146. - 로그아웃
  147. - 사용자 전환
  148. - 주요 상태 변경
  149. - 에러 복구
  150. ```typescript
  151. async function logout() {
  152. // 모든 store 초기화
  153. authStore.setLogout()
  154. setupStore.reset() // Setup syntax
  155. optionsStore.$reset() // Options syntax
  156. // 로컬 스토리지 정리
  157. localStorage.clear()
  158. }
  159. ```
  160. ## API Rules
  161. - api 서버는 코드이그나이터4 베이스의 벡엔드 기술로 구현되어있으며
  162. 기존 문서에사용되는 양식을 지키며 구현
  163. - 프론트에서 api신규 생성시 백엔드 코드이그나4 기반의 기술로 구현하는 예제를 함께 제공
  164. - 항상 페이지 구성이 완료되고 나면 제작에 필요한 쿼리를 DDL형태로 구성해서 ddl폴더에 만들어줘
  165. - api구성후 백엔드 예제를 backend-examples에 코드이그나이터4 형태로 구성해줘
  166. - MD파일을 생성해서 백엔드 구성과 DB생성을 하는 과정을 순서대로 작성해줘
  167. - 프론트화면 및 UI / API 구성시에는 항상 composition api 형태로 작성 css는 항상 scss형태로 분리해서 구성
  168. ## 프론트엔드 API 호출 규칙
  169. - **Nuxt.js server/api 사용 금지**: 프론트엔드에서 직접 백엔드 API 호출
  170. - **useAxios() 패턴 강제**: 기존 코드베이스와 일관성 유지
  171. - 반드시 다음 형태로 구성:
  172. ```javascript
  173. const loadData = async () => {
  174. try {
  175. const params = {
  176. // 파라미터들...
  177. }
  178. useAxios()
  179. .post('/api/endpoint', params)
  180. .then((res) => {
  181. if (res.data.success) {
  182. // 성공 처리
  183. data.value = res.data.data
  184. } else {
  185. // 실패 처리
  186. error.value = res.data.message
  187. }
  188. })
  189. .catch((err) => {
  190. // 에러 처리
  191. error.value = err.message
  192. })
  193. .finally(() => {
  194. // 완료 처리
  195. loading.value = false
  196. })
  197. } catch (err) {
  198. error.value = err.message
  199. }
  200. }
  201. ```
  202. ## API 구조 금지사항
  203. - **server/api 디렉토리 생성 금지**: Nuxt.js 서버 API 사용하지 않음
  204. - **mysql2, 데이터베이스 라이브러리 사용 금지**: 프론트엔드에서 직접 DB 연결 금지
  205. - **$fetch 사용 금지**: useAxios() 패턴만 사용
  206. - **async/await 패턴 지양**: .then().catch().finally() 체인 사용
  207. ## 백엔드 연동 방식
  208. - 프론트엔드 → CodeIgniter4 백엔드 직접 호출
  209. - useAxios()를 통한 HTTP 통신만 사용
  210. - 응답 형태: `res.data.success`, `res.data.data`, `res.data.message`
  211. - 백엔드는 직접 만들거야 다만 너가 backend-examples 폴더에 프론트와 수신할수는있는 형태의 api예제를 만들어
  212. - useAxios()를 통한 HTTP 통신만 사용
  213. - 응답 형태: `res.data.success`, `res.data.data`, `res.data.message`
  214. - 백엔드는 직접 만들거야 다만 너가 backend-examples 폴더에 프론트와 수신할수는있는 형태의 api예제를 만들어
  215. - useAxios()를 통한 HTTP 통신만 사용
  216. - 응답 형태: `res.data.success`, `res.data.data`, `res.data.message`
  217. - 백엔드는 직접 만들거야 다만 너가 backend-examples 폴더에 프론트와 수신할수는있는 형태의 api예제를 만들어
  218. - useAxios()를 통한 HTTP 통신만 사용
  219. - 응답 형태: `res.data.success`, `res.data.data`, `res.data.message`
  220. - 백엔드는 직접 만들거야 다만 너가 backend-examples 폴더에 프론트와 수신할수는있는 형태의 api예제를 만들어