Skip to content

Commit d06ed67

Browse files
committed
refactor: 폴더명 및 파일명 패턴 통일 (대괄호 안에 영문키)
패턴을 반대로 변경하여 일관성 향상: - 폴더: 숫자) 한글명 [영문키] → 영문키 추출 - 예: 1) 어드민 [Admin] → Admin - 예: 7) 어드민 [Admin] → Admin - 파일: 한글명 [영문키] → 영문키 추출 - 예: 멘토 목록 조회 [get-mentor-list].bru → get-mentor-list 변경 사항: - 모든 extractDomain 함수 수정 (3개 파일) - queryKeyGenerator.ts 파일명 추출 로직 수정 - apiClientGenerator.ts 파일명 추출 로직 수정 - 테스트 fixture 파일명 변경 - 테스트 케이스 업데이트 - 문서 전체 업데이트 장점: - 대괄호 안이 항상 영문키로 통일되어 일관성 향상 - 폴더명과 파일명 패턴이 동일하여 학습 비용 감소
1 parent 8dd276a commit d06ed67

File tree

9 files changed

+70
-88
lines changed

9 files changed

+70
-88
lines changed

docs/bruno-guide.md

Lines changed: 42 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -152,25 +152,26 @@ docs {
152152

153153
#### 지원하는 형식
154154

155-
1. **`[한글명] 숫자 영문키` 형식** (권장)
155+
1. **`숫자) 한글명 [영문키]` 형식** (권장)
156156

157157
```
158-
[어드민] 7 Admin/ → 생성 폴더: 7 Admin
159-
[사용자] 8 Users/ → 생성 폴더: 8 Users
160-
[멘토] 9 Mentor/ → 생성 폴더: 9 Mentor
158+
1) 어드민 [Admin]/ → 생성 폴더: Admin
159+
7) 어드민 [Admin]/ → 생성 폴더: Admin
160+
8) 사용자 [Users]/ → 생성 폴더: Users
161+
9) 멘토 [Mentor]/ → 생성 폴더: Mentor
161162
```
162163

163-
- 대괄호 뒤의 모든 내용(숫자 + 영문키)이 폴더명이 됩니다
164-
- 한글명은 가독성을 위해 사용, 실제 폴더명에는 포함되지 않음
164+
- 대괄호 안의 `영문키`만 사용됩니다
165+
- 숫자와 한글명은 가독성을 위해 사용, 실제 폴더명에는 포함되지 않음
165166

166-
2. **`한글명 [EnglishKey]` 형식** (기존 방식, 호환)
167+
2. **`한글명 [영문키]` 형식** (기존 방식, 호환)
167168

168169
```
169170
지원서 [applications]/ → 생성 폴더: applications
170171
사용자 [users]/ → 생성 폴더: users
171172
```
172173

173-
- 대괄호 안의 `EnglishKey`만 사용됩니다
174+
- 대괄호 안의 `영문키`만 사용됩니다
174175
- 기존 프로젝트와 호환됩니다
175176

176177
3. **영문 폴더명** (가장 단순)
@@ -184,7 +185,8 @@ docs {
184185

185186
| Bruno 폴더명 | 생성되는 폴더 | 설명 |
186187
| ----------------------- | -------------- | --------------------- |
187-
| `[어드민] 7 Admin` | `7 Admin` | 숫자와 공백 포함 가능 |
188+
| `1) 어드민 [Admin]` | `Admin` | 대괄호 안의 키만 사용 |
189+
| `7) 어드민 [Admin]` | `Admin` | 숫자는 무시됨 |
188190
| `지원서 [applications]` | `applications` | 대괄호 안의 키만 사용 |
189191
| `users` | `users` | 그대로 사용 |
190192

@@ -194,16 +196,16 @@ docs {
194196

195197
#### 지원하는 형식
196198

197-
1. **`[한국어 키] 영어` 형식** (권장, 폴더명과 동일한 패턴)
199+
1. **`한글명 [영문키]` 형식** (권장, 폴더명과 동일한 패턴)
198200

199201
```
200-
[멘토 목록 조회] get-mentor-list.bru → get-mentor-list → getMentorList
201-
[사용자 프로필] get-user-profile.bru → get-user-profile → getUserProfile
202-
[지원서 생성] post-create-application.bru → post-create-application → postCreateApplication
202+
멘토 목록 조회 [get-mentor-list].bru → get-mentor-list → getMentorList
203+
사용자 프로필 [get-user-profile].bru → get-user-profile → getUserProfile
204+
지원서 생성 [post-create-application].bru → post-create-application → postCreateApplication
203205
```
204206

205-
- 대괄호 뒤의 영문 부분만 사용됩니다
206-
- 한글 설명은 가독성을 위해 사용, 실제 코드 생성에는 포함되지 않음
207+
- 대괄호 안의 `영문키` 사용됩니다
208+
- 한글명은 가독성을 위해 사용, 실제 코드 생성에는 포함되지 않음
207209

208210
2. **영문 파일명** (기존 방식, 호환)
209211

@@ -220,11 +222,11 @@ docs {
220222
**✅ 올바른 예시:**
221223

222224
```
223-
[멘토 목록 조회] get-mentor-list.bru → QueryKeys.mentors.getMentorList
224-
[사용자 프로필] get-user-profile.bru → QueryKeys.users.getUserProfile
225-
[지원서 생성] post-create-application.bru → QueryKeys.applications.postCreateApplication
226-
[프로필 수정] put-update-profile.bru → QueryKeys.users.putUpdateProfile
227-
[사용자 삭제] delete-user.bru → QueryKeys.users.deleteUser
225+
멘토 목록 조회 [get-mentor-list].bru → QueryKeys.mentors.getMentorList
226+
사용자 프로필 [get-user-profile].bru → QueryKeys.users.getUserProfile
227+
지원서 생성 [post-create-application].bru → QueryKeys.applications.postCreateApplication
228+
프로필 수정 [put-update-profile].bru → QueryKeys.users.putUpdateProfile
229+
사용자 삭제 [delete-user].bru → QueryKeys.users.deleteUser
228230
```
229231

230232
#### 네이밍 규칙
@@ -254,41 +256,42 @@ docs {
254256

255257
#### 파일명 예시
256258

257-
| Bruno 파일명 | 추출된 파일명 | 쿼리 키 이름 | 훅 이름 |
258-
| ------------------------------------- | ---------------------- | -------------------------- | ----------------------------- |
259-
| `[멘토 목록 조회] get-mentor-list.bru` | `get-mentor-list` | `getMentorList` | `useGetMentorList` |
260-
| `[사용자 프로필] get-user-profile.bru` | `get-user-profile` | `getUserProfile` | `useGetUserProfile` |
261-
| `[지원서 생성] post-create.bru` | `post-create` | `postCreate` | `usePostCreate` |
262-
| `get-competitors.bru` | `get-competitors` | `getCompetitors` | `useGetCompetitors` |
259+
| Bruno 파일명 | 추출된 파일명 | 쿼리 키 이름 | 훅 이름 |
260+
| -------------------------------------- | ------------------------- | -------------------------- | ----------------------------- |
261+
| `멘토 목록 조회 [get-mentor-list].bru` | `get-mentor-list` | `getMentorList` | `useGetMentorList` |
262+
| `사용자 프로필 [get-user-profile].bru` | `get-user-profile` | `getUserProfile` | `useGetUserProfile` |
263+
| `지원서 생성 [post-create].bru` | `post-create` | `postCreate` | `usePostCreate` |
264+
| `get-competitors.bru` | `get-competitors` | `getCompetitors` | `useGetCompetitors` |
263265
| `멘토 목록 조회.bru` | `멘토 목록 조회` (비권장) | `멘토목록조회` (문제 가능) | `use멘토목록조회` (문제 가능) |
264266

265-
**핵심**:
266-
- `[한국어 키] 영어` 형식으로 작성하면 한글 설명과 영문 코드를 모두 활용할 수 있습니다
267-
- 영문 부분만 kebab-case로 작성하면, 자동으로 일관된 쿼리 키와 훅 이름이 생성됩니다!
267+
**핵심**:
268+
269+
- `한글명 [영문키]` 형식으로 작성하면 한글 설명과 영문 코드를 모두 활용할 수 있습니다
270+
- 대괄호 안의 영문키만 kebab-case로 작성하면, 자동으로 일관된 쿼리 키와 훅 이름이 생성됩니다!
268271

269272
### 전체 구조 예시
270273

271274
```
272275
bruno/
273-
├── [어드민] 7 Admin/ # 폴더명: 7 Admin
274-
│ ├── [목록 조회] get-list.bru # → QueryKeys["7 Admin"].getList
275-
│ ├── [생성] post-create.bru # → QueryKeys["7 Admin"].postCreate
276-
│ └── [수정] put-update.bru # → QueryKeys["7 Admin"].putUpdate
276+
├── 7) 어드민 [Admin]/ # 폴더명: Admin
277+
│ ├── 목록 조회 [get-list].bru # → QueryKeys.Admin.getList
278+
│ ├── 생성 [post-create].bru # → QueryKeys.Admin.postCreate
279+
│ └── 수정 [put-update].bru # → QueryKeys.Admin.putUpdate
277280
├── 지원서 [applications]/ # 폴더명: applications
278-
│ ├── [경쟁자 조회] get-competitors.bru # → QueryKeys.applications.getCompetitors
279-
│ ├── [상세 조회] get-details.bru # → QueryKeys.applications.getDetails
280-
│ └── [지원서 생성] post-create.bru # → QueryKeys.applications.postCreate
281+
│ ├── 경쟁자 조회 [get-competitors].bru # → QueryKeys.applications.getCompetitors
282+
│ ├── 상세 조회 [get-details].bru # → QueryKeys.applications.getDetails
283+
│ └── 지원서 생성 [post-create].bru # → QueryKeys.applications.postCreate
281284
├── 사용자 [users]/ # 폴더명: users
282-
│ ├── [프로필 조회] get-profile.bru # → QueryKeys.users.getProfile
283-
│ └── [프로필 수정] put-update-profile.bru # → QueryKeys.users.putUpdateProfile
285+
│ ├── 프로필 조회 [get-profile].bru # → QueryKeys.users.getProfile
286+
│ └── 프로필 수정 [put-update-profile].bru # → QueryKeys.users.putUpdateProfile
284287
└── bruno.json
285288
```
286289

287290
**생성되는 구조:**
288291

289292
```
290293
src/apis/
291-
├── 7 Admin/
294+
├── Admin/
292295
│ ├── get-getList.ts
293296
│ ├── post-postCreate.ts
294297
│ └── index.ts

src/converter/openapiConverter.ts

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -133,18 +133,11 @@ function extractDomain(filePath: string, brunoDir: string): string {
133133
const parts = rel.split('/');
134134
const folderName = parts[0] || 'default';
135135

136-
// [한글명] 숫자 영문키 패턴: [어드민] 7 Admin → 7 Admin
137-
const bracketPattern = /^\[[^\]]+\]\s+(.+)$/;
136+
// 대괄호 안의 영문키 추출: 1) 어드민 [Admin] → Admin, 사용자 [users] → users
137+
const bracketPattern = /\[([^\]]+)\]/;
138138
const bracketMatch = folderName.match(bracketPattern);
139139
if (bracketMatch) {
140-
return bracketMatch[1].trim(); // 대괄호 뒤의 모든 내용
141-
}
142-
143-
// 기존 패턴: 한글명 [EnglishKey] → EnglishKey
144-
const oldPattern = /\[([^\]]+)\]/;
145-
const oldMatch = folderName.match(oldPattern);
146-
if (oldMatch) {
147-
return oldMatch[1];
140+
return bracketMatch[1].trim(); // 대괄호 안의 영문키
148141
}
149142

150143
return folderName; // 패턴이 없으면 폴더명 그대로 반환

src/diff/changeDetector.ts

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -190,18 +190,11 @@ function extractDomain(operation: any): string {
190190
if (operation.tags && operation.tags.length > 0) {
191191
const tag = operation.tags[0];
192192

193-
// [한글명] 숫자 영문키 패턴: [어드민] 7 Admin → 7 Admin
194-
const bracketPattern = /^\[[^\]]+\]\s+(.+)$/;
193+
// 대괄호 안의 영문키 추출: 1) 어드민 [Admin] → Admin, 사용자 [users] → users
194+
const bracketPattern = /\[([^\]]+)\]/;
195195
const bracketMatch = tag.match(bracketPattern);
196196
if (bracketMatch) {
197-
return bracketMatch[1].trim(); // 대괄호 뒤의 모든 내용
198-
}
199-
200-
// 기존 패턴: 한글명 [EnglishKey] → EnglishKey
201-
const oldPattern = /\[([^\]]+)\]/;
202-
const oldMatch = tag.match(oldPattern);
203-
if (oldMatch) {
204-
return oldMatch[1];
197+
return bracketMatch[1].trim(); // 대괄호 안의 영문키
205198
}
206199

207200
return tag;

src/generator/apiClientGenerator.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,11 +30,11 @@ export function extractApiFunction(parsed: ParsedBrunoFile, filePath: string): A
3030
// .bru 파일명에서 함수명 생성
3131
let fileName = filePath.split('/').pop()?.replace('.bru', '') || '';
3232

33-
// [한국어 키] 영어 패턴 추출: [멘토 목록 조회] get-mentor-list → get-mentor-list
34-
const bracketPattern = /^\[[^\]]+\]\s+(.+)$/;
33+
// 한글명 [영문키] 패턴 추출: 멘토 목록 조회 [get-mentor-list] → get-mentor-list
34+
const bracketPattern = /\[([^\]]+)\]/;
3535
const bracketMatch = fileName.match(bracketPattern);
3636
if (bracketMatch) {
37-
fileName = bracketMatch[1].trim(); // 대괄호 뒤의 영문 부분만 사용
37+
fileName = bracketMatch[1].trim(); // 대괄호 안의 영문키만 사용
3838
}
3939

4040
const functionName = toCamelCase(fileName);

src/generator/index.ts

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -45,26 +45,19 @@ function findBrunoFiles(dir: string): string[] {
4545

4646
/**
4747
* 파일 경로에서 도메인 추출
48-
* - "[한글명] 숫자 영문키" 형식: [어드민] 7 Admin → 7 Admin
49-
* - "한글명 [EnglishKey]" 형식: 사용자 [users] → users
48+
* - "숫자) 한글명 [영문키]" 형식: 1) 어드민 [Admin] → Admin
49+
* - "한글명 [영문키]" 형식: 사용자 [users] → users
5050
*/
5151
function extractDomain(filePath: string, brunoDir: string): string {
5252
const relativePath = relative(brunoDir, filePath);
5353
const parts = relativePath.split('/');
5454
const folderName = parts[0]; // 첫 번째 폴더가 도메인
5555

56-
// [한글명] 숫자 영문키 패턴: [어드민] 7 Admin → 7 Admin
57-
const bracketPattern = /^\[[^\]]+\]\s+(.+)$/;
56+
// 대괄호 안의 영문키 추출: 1) 어드민 [Admin] → Admin, 사용자 [users] → users
57+
const bracketPattern = /\[([^\]]+)\]/;
5858
const bracketMatch = folderName.match(bracketPattern);
5959
if (bracketMatch) {
60-
return bracketMatch[1].trim(); // 대괄호 뒤의 모든 내용
61-
}
62-
63-
// 기존 패턴: 한글명 [EnglishKey] → EnglishKey
64-
const oldPattern = /\[([^\]]+)\]/;
65-
const oldMatch = folderName.match(oldPattern);
66-
if (oldMatch) {
67-
return oldMatch[1];
60+
return bracketMatch[1].trim(); // 대괄호 안의 영문키
6861
}
6962

7063
return folderName; // 패턴이 없으면 폴더명 그대로 반환

src/generator/queryKeyGenerator.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,11 +37,11 @@ export function generateQueryKeyStructure(
3737

3838
let fileName = path.split('/').pop()?.replace('.bru', '') || '';
3939

40-
// [한국어 키] 영어 패턴 추출: [멘토 목록 조회] get-mentor-list → get-mentor-list
41-
const bracketPattern = /^\[[^\]]+\]\s+(.+)$/;
40+
// 한글명 [영문키] 패턴 추출: 멘토 목록 조회 [get-mentor-list] → get-mentor-list
41+
const bracketPattern = /\[([^\]]+)\]/;
4242
const bracketMatch = fileName.match(bracketPattern);
4343
if (bracketMatch) {
44-
fileName = bracketMatch[1].trim(); // 대괄호 뒤의 영문 부분만 사용
44+
fileName = bracketMatch[1].trim(); // 대괄호 안의 영문키만 사용
4545
}
4646

4747
if (!structure[domain]) {

tests/cli.test.js

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -214,26 +214,26 @@ describe('변경사항 감지 테스트', () => {
214214
});
215215

216216
describe('새로운 폴더명 패턴 테스트', () => {
217-
test('[한글명] 숫자 영문키 패턴 추출', () => {
217+
test('숫자) 한글명 [영문키] 패턴 추출', () => {
218218
const inputDir = join(FIXTURES_DIR, 'bruno');
219219
const outputDir = join(TEST_OUTPUT_DIR, 'apis-pattern');
220220

221221
execSync(`node dist/cli/index.js generate-hooks -i ${inputDir} -o ${outputDir}`, {
222222
cwd: join(__dirname, '..'),
223223
});
224224

225-
// [어드민] 7 Admin 폴더가 생성되었는지 확인
226-
const adminDir = join(outputDir, '7 Admin');
227-
assert.ok(existsSync(adminDir), '[어드민] 7 Admin 폴더가 생성되어야 함');
225+
// 7) 어드민 [Admin] → Admin 폴더가 생성되었는지 확인
226+
const adminDir = join(outputDir, 'Admin');
227+
assert.ok(existsSync(adminDir), '7) 어드민 [Admin] 폴더에서 Admin이 생성되어야 함');
228228

229229
// 훅 파일 생성 확인
230230
const hookFile = join(adminDir, 'get-getList.ts');
231231
assert.ok(existsSync(hookFile), 'getList 훅이 생성되어야 함');
232232

233-
console.log('✅ [한글명] 숫자 영문키 패턴 테스트 통과');
233+
console.log('✅ 숫자) 한글명 [영문키] 패턴 테스트 통과');
234234
});
235235

236-
test('[한국어 키] 영어 파일명 패턴 추출', () => {
236+
test('한글명 [영문키] 파일명 패턴 추출', () => {
237237
const inputDir = join(FIXTURES_DIR, 'bruno');
238238
const outputDir = join(TEST_OUTPUT_DIR, 'apis-filename-pattern');
239239

@@ -245,19 +245,19 @@ describe('새로운 폴더명 패턴 테스트', () => {
245245
const queryKeysFile = join(outputDir, 'queryKeys.ts');
246246
const queryKeysContent = readFileSync(queryKeysFile, 'utf-8');
247247

248-
// [목록 조회] get-list.bru → getList로 추출되어야 함
248+
// 목록 조회 [get-list].bru → getList로 추출되어야 함
249249
assert.ok(queryKeysContent.includes('getList'), 'getList 쿼리 키가 생성되어야 함');
250-
assert.ok(queryKeysContent.includes("'7 Admin.getList'"), '7 Admin.getList 쿼리 키가 생성되어야 함');
250+
assert.ok(queryKeysContent.includes("'Admin.getList'"), 'Admin.getList 쿼리 키가 생성되어야 함');
251251

252252
// 훅 파일 확인
253-
const hookFile = join(outputDir, '7 Admin', 'get-getList.ts');
254-
assert.ok(existsSync(hookFile), '[목록 조회] get-list.bru에서 getList 훅이 생성되어야 함');
253+
const hookFile = join(outputDir, 'Admin', 'get-getList.ts');
254+
assert.ok(existsSync(hookFile), '목록 조회 [get-list].bru에서 getList 훅이 생성되어야 함');
255255

256256
const hookContent = readFileSync(hookFile, 'utf-8');
257257
assert.ok(hookContent.includes('getList'), '훅 내용에 getList가 포함되어야 함');
258258
assert.ok(hookContent.includes('useGetList'), 'useGetList 훅이 생성되어야 함');
259259

260-
console.log('✅ [한국어 키] 영어 파일명 패턴 테스트 통과');
260+
console.log('✅ 한글명 [영문키] 파일명 패턴 테스트 통과');
261261
});
262262
});
263263

File renamed without changes.
File renamed without changes.

0 commit comments

Comments
 (0)