|
| 1 | +# ZoopZoop 백엔드 개발 컨벤션 |
| 2 | + |
| 3 | +--- |
| 4 | + |
| 5 | +## 1. 기본 규칙 |
| 6 | + |
| 7 | +- **언어** : Java |
| 8 | +- **변수명 규칙** : camelCase |
| 9 | +- **Merge 방식** : Squash & Merge |
| 10 | + |
| 11 | +--- |
| 12 | + |
| 13 | +## 2. 이슈 템플릿 |
| 14 | + |
| 15 | +### 분류 |
| 16 | + |
| 17 | +- `design` : UI 관련 (프론트엔드) |
| 18 | +- `fix` : 버그 수정 |
| 19 | +- `feat` : 기능 추가 |
| 20 | +- `refactor` : 리팩토링 |
| 21 | +- `chore` : 문서, 환경 설정 등 |
| 22 | + |
| 23 | +### 이슈 네이밍 규칙 |
| 24 | + |
| 25 | +- `[분류] 작업 제목` |
| 26 | +- EX: `[feat] 로그인 쿠키 설정` |
| 27 | + |
| 28 | +--- |
| 29 | + |
| 30 | +## 3. 지라 티켓 |
| 31 | + |
| 32 | +- 레이블은 기존과 동일하게 사용 |
| 33 | +- 티켓 네이밍 규칙: `[BE] 분류 : 작업 제목` |
| 34 | +- EX: `[BE] feat : 로그인 쿠키 설정` |
| 35 | + |
| 36 | +--- |
| 37 | + |
| 38 | +## 4. 브랜치 전략 |
| 39 | + |
| 40 | +### 네이밍 규칙 |
| 41 | + |
| 42 | +- 형식: `{분류}#{이슈 번호}` |
| 43 | +- EX: `feat#19` (19번 이슈에서 파생된 브랜치) |
| 44 | + |
| 45 | +### 전략 |
| 46 | + |
| 47 | +- **main** : 메인 서버 자동 배포, 고정 브랜치 |
| 48 | +- **develop** : 내부 테스트 서버 자동 배포, 고정 브랜치 |
| 49 | +- **feature** : 각 기능 개발마다 생성/삭제 |
| 50 | +- **hotfix** : 긴급 수정 시 생성/삭제 |
| 51 | + |
| 52 | +### 지라 연동 |
| 53 | + |
| 54 | +- 형식: `분류/지라 디폴트 생성 브랜치명` |
| 55 | +- EX: `feat/OPS-87-FE-필터링` |
| 56 | + |
| 57 | +--- |
| 58 | + |
| 59 | +## 5. 커밋 메시지 규칙 |
| 60 | + |
| 61 | +- 분류 |
| 62 | + - `design` : UI |
| 63 | + - `fix` : 버그 수정 |
| 64 | + - `feat` : 기능 추가 |
| 65 | + - `refactor` : 리팩토링 |
| 66 | + - `chore` : 문서, 환경 설정 |
| 67 | + - `docs` : 주석, 문서화 처리 |
| 68 | + - `new` : 새로운 파일 생성 |
| 69 | + |
| 70 | +- 복수 성격인 경우 핵심 키워드 하나만 사용 |
| 71 | +- 지라 연동: `분류/지라 티켓 키 : 내용` |
| 72 | +- EX: `feat/PROJ-123 : implement login service` |
| 73 | + |
| 74 | +--- |
| 75 | + |
| 76 | +## 6. PR 템플릿 |
| 77 | + |
| 78 | +### 네이밍 |
| 79 | + |
| 80 | +- PR 이름: 이슈 이름 |
| 81 | +- EX: `[feat] 로그인 쿠키 설정` |
| 82 | + |
| 83 | +### 코드 리뷰 |
| 84 | + |
| 85 | +- **develop**: 페어 개발자 검토 (부재 시 팀장 대행), 자동 CI |
| 86 | +- **main**: 팀장 주도 확인, 자동 CI/CD |
| 87 | +- 지라 연동: `[분류/지라 티켓 키] 이슈 이름` |
| 88 | + 예: `[feat/PROJ-123] 로그인 쿠키 설정` |
| 89 | + |
| 90 | +--- |
| 91 | + |
| 92 | +## 7. 티켓 상태 관리 |
| 93 | + |
| 94 | +- `Backlog` : 시작 전 |
| 95 | +- `Ready` : 작업자 지정, 시작 가능 |
| 96 | +- `In progress` : 개발 중 |
| 97 | +- `In review` : PR 작성 및 검토 중 |
| 98 | +- `Done` : 완료 |
| 99 | + |
| 100 | +### 작업 순서 |
| 101 | + |
| 102 | +1. Issue 생성 → 상태: `Backlog`, Labels/Projects 설정 |
| 103 | +2. Assignee 지정 → 상태 변경: `Ready` |
| 104 | +3. 개발 시작 → 상태: `In progress`, 브랜치 생성 |
| 105 | +4. 브랜치에서 작업 진행 |
| 106 | +5. PR 생성 → 상태: `In review` |
| 107 | +6. PR 머지 후 → Issue & PR `Done`, 브랜치 삭제 |
| 108 | + |
| 109 | +--- |
| 110 | + |
| 111 | +## 8. 폴더 구조 규칙 |
| 112 | + |
| 113 | +```text |
| 114 | +com |
| 115 | +└── back |
| 116 | + ├── domain |
| 117 | + │ ├── member |
| 118 | + │ └── team |
| 119 | + │ ├── repository |
| 120 | + │ ├── service |
| 121 | + │ ├── controller |
| 122 | + │ ├── entity |
| 123 | + │ └── dto |
| 124 | + └── global |
| 125 | +``` |
| 126 | +- domain 하위 depth는 1 유지 (필요 시 리팩토링) |
| 127 | + |
| 128 | +--- |
| 129 | + |
| 130 | +## 9. DTO 규칙 |
| 131 | +### 규칙 |
| 132 | +- Controller 단에서 request/response body와 매칭되는 경우 DTO 사용 |
| 133 | +- Response body는 최소 정보 전달 (id 등 내부 키값은 숨김) |
| 134 | +- Service 단에서는 DTO 재활용 지양 |
| 135 | +- Controller DTO와 별도 정의 |
| 136 | +- 필요한 경우 주석 충실히 작성 |
| 137 | + |
| 138 | +### 네이밍 |
| 139 | +- reqBodyFor~ : Request Body DTO |
| 140 | +- resBodyFor~ : Response Body DTO |
| 141 | + |
| 142 | +--- |
| 143 | + |
| 144 | +## 10. 테스트 코드 컨벤션 |
| 145 | + |
| 146 | +- 형식: given-when-then |
| 147 | + |
| 148 | + - Controller 단에서 단위 테스트 작성 |
| 149 | + - Service 핵심 메서드 단위 테스트 작성 |
| 150 | + - 예외 케이스, 엣지 케이스 포함 |
| 151 | + |
| 152 | +--- |
| 153 | + |
| 154 | +## 11. 예외 처리 방식 |
| 155 | + |
| 156 | +- 에러 코드: 개발 진행 중 판단 |
| 157 | + |
| 158 | +- 핵심 에러는 global 핸들러 사용 |
| 159 | + |
| 160 | +--- |
| 161 | + |
| 162 | +## 12. 보안 처리 |
| 163 | + |
| 164 | +- Spring Security 사용 |
| 165 | + |
| 166 | +- Secrets 값 관리 |
| 167 | + |
| 168 | +- 개발 환경: application-secret.yml (gitignore) |
| 169 | + |
| 170 | +- 운영 환경: Github Secrets, CI/CD에서 컨테이너 환경 변수로 입력 |
| 171 | + |
| 172 | +--- |
| 173 | + |
| 174 | +## 13. 문서화 컨벤션 |
| 175 | + |
| 176 | +- OpenAPI: Swagger 사용 |
| 177 | + |
| 178 | +- Controller, DTO, Entity에 API 어노테이션 충실 |
| 179 | + |
| 180 | +- 주석 처리: Javadoc 스타일 |
| 181 | + |
| 182 | +```java |
| 183 | +/** |
| 184 | + * @param aa |
| 185 | + * @param bb |
| 186 | + * @param cc |
| 187 | + */ |
| 188 | +``` |
| 189 | + |
| 190 | +--- |
| 191 | + |
| 192 | +## 14. HTTP 응답 양식 |
| 193 | +```json |
| 194 | +{ |
| 195 | + "status": 200, |
| 196 | + "msg": "사용자 정보를 조회했습니다.", |
| 197 | + "data": { |
| 198 | + "name": "$name", |
| 199 | + "profileUrl": "$profileUrl" |
| 200 | + } |
| 201 | +} |
| 202 | +``` |
| 203 | +- 성공/실패 관계 없이 RsData 형태로 반환 |
0 commit comments