api-rule.mdc 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. # 최우선 규칙: 한글 응답 필수
  2. **모든 응답은 한글로만 작성해야 함. 이 규칙은 다른 모든 규칙보다 우선한다.**
  3. # companyId 사용 금지 규칙
  4. **companyId는 사용하지 않는 값이므로 모든 코드에서 제거해야 함. 프론트엔드, 백엔드 모두 해당.**
  5. - 대신 COMPANY_NUMBER를 직접 사용
  6. - companyId 관련 변수, 필드, 파라미터 모두 제거
  7. - API 요청/응답에서 companyId 사용 금지
  8. # API & Store Rules
  9. ## Pinia Store Rules
  10. ### 1. Setup Syntax Store Reset 구현
  11. - Setup 문법(`defineStore(() => {...})`)으로 작성된 store는 자동 `$reset()`이 제공되지 않음
  12. - 반드시 수동으로 `reset()` 함수를 구현해야 함
  13. ```typescript
  14. // Good
  15. export const useMyStore = defineStore('myStore', () => {
  16. const data = ref([])
  17. const loading = ref(false)
  18. // 수동으로 reset 함수 구현
  19. function reset() {
  20. data.value = []
  21. loading.value = false
  22. }
  23. return {
  24. data,
  25. loading,
  26. reset // reset 함수 반환 필수
  27. }
  28. })
  29. // Bad - reset 함수 없음
  30. export const useMyStore = defineStore('myStore', () => {
  31. const data = ref([])
  32. return { data }
  33. })
  34. ```
  35. ### 2. Reset 함수 구현 가이드
  36. - 모든 state를 초기값으로 되돌리는 로직 포함
  37. - 중첩된 객체의 경우 깊은 복사 고려
  38. - persist 옵션이 있는 경우 저장소 데이터도 정리
  39. ```typescript
  40. function reset() {
  41. // 단순 값 초기화
  42. simpleValue.value = null
  43. // 객체 초기화
  44. objectValue.value = {
  45. prop1: '',
  46. prop2: 0
  47. }
  48. // 배열 초기화
  49. arrayValue.value = []
  50. // 중첩 객체 초기화
  51. complexValue.value = JSON.parse(JSON.stringify(DEFAULT_STATE))
  52. }
  53. ```
  54. ### 3. Store 초기화 호출 방식
  55. - Setup 문법 store: `store.reset()`
  56. - Options 문법 store: `store.$reset()`
  57. ```typescript
  58. // Setup store
  59. const setupStore = useSetupStore()
  60. setupStore.reset() // O
  61. setupStore.$reset() // X - 에러 발생
  62. // Options store
  63. const optionsStore = useOptionsStore()
  64. optionsStore.$reset() // O
  65. ```
  66. ### 4. Store 초기화 시점
  67. - 로그아웃
  68. - 사용자 전환
  69. - 주요 상태 변경
  70. - 에러 복구
  71. ```typescript
  72. async function logout() {
  73. // 모든 store 초기화
  74. authStore.setLogout()
  75. setupStore.reset() // Setup syntax
  76. optionsStore.$reset() // Options syntax
  77. // 로컬 스토리지 정리
  78. localStorage.clear()
  79. }
  80. ```
  81. ## API Rules
  82. - api 서버는 코드이그나이터4 베이스의 벡엔드 기술로 구현되어있으며
  83. 기존 문서에사용되는 양식을 지키며 구현
  84. - 프론트에서 api신규 생성시 백엔드 코드이그나4 기반의 기술로 구현하는 예제를 함께 제공
  85. - 항상 페이지 구성이 완료되고 나면 제작에 필요한 쿼리를 DDL형태로 구성해서 ddl폴더에 만들어줘
  86. - api구성후 백엔드 예제를 backend-examples에 코드이그나이터4 형태로 구성해줘
  87. - MD파일을 생성해서 백엔드 구성과 DB생성을 하는 과정을 순서대로 작성해줘
  88. - 프론트화면 및 UI / API 구성시에는 항상 composition api 형태로 작성 css는 항상 scss형태로 분리해서 구성
  89. ## 프론트엔드 API 호출 규칙
  90. - **Nuxt.js server/api 사용 금지**: 프론트엔드에서 직접 백엔드 API 호출
  91. - **useAxios() 패턴 강제**: 기존 코드베이스와 일관성 유지
  92. - 반드시 다음 형태로 구성:
  93. ```javascript
  94. const loadData = async () => {
  95. try {
  96. const params = {
  97. // 파라미터들...
  98. }
  99. useAxios()
  100. .post('/api/endpoint', params)
  101. .then((res) => {
  102. if (res.data.success) {
  103. // 성공 처리
  104. data.value = res.data.data
  105. } else {
  106. // 실패 처리
  107. error.value = res.data.message
  108. }
  109. })
  110. .catch((err) => {
  111. // 에러 처리
  112. error.value = err.message
  113. })
  114. .finally(() => {
  115. // 완료 처리
  116. loading.value = false
  117. })
  118. } catch (err) {
  119. error.value = err.message
  120. }
  121. }
  122. ```
  123. ## API 구조 금지사항
  124. - **server/api 디렉토리 생성 금지**: Nuxt.js 서버 API 사용하지 않음
  125. - **mysql2, 데이터베이스 라이브러리 사용 금지**: 프론트엔드에서 직접 DB 연결 금지
  126. - **$fetch 사용 금지**: useAxios() 패턴만 사용
  127. - **async/await 패턴 지양**: .then().catch().finally() 체인 사용
  128. ## 백엔드 연동 방식
  129. - 프론트엔드 → CodeIgniter4 백엔드 직접 호출
  130. - useAxios()를 통한 HTTP 통신만 사용
  131. - 응답 형태: `res.data.success`, `res.data.data`, `res.data.message`
  132. - 백엔드는 직접 만들거야 다만 너가 backend-examples 폴더에 프론트와 수신할수는있는 형태의 api예제를 만들어
  133. - useAxios()를 통한 HTTP 통신만 사용
  134. - 응답 형태: `res.data.success`, `res.data.data`, `res.data.message`
  135. - 백엔드는 직접 만들거야 다만 너가 backend-examples 폴더에 프론트와 수신할수는있는 형태의 api예제를 만들어