Skip to content
Merged
Changes from all commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
847ef3c
Merge pull request #53 from JECT-Study/develop
tlarbals824 May 1, 2026
994799a
Merge pull request #57 from JECT-Study/develop
tlarbals824 May 1, 2026
f2025da
Merge pull request #59 from JECT-Study/develop
tlarbals824 May 1, 2026
c85cb53
Merge pull request #61 from JECT-Study/develop
tlarbals824 May 1, 2026
d8ccaa4
Merge pull request #63 from JECT-Study/develop
tlarbals824 May 1, 2026
04ebb5d
Merge pull request #65 from JECT-Study/develop
tlarbals824 May 1, 2026
4e518b6
Merge pull request #69 from JECT-Study/develop
tlarbals824 May 1, 2026
13c1772
Merge pull request #71 from JECT-Study/develop
tlarbals824 May 1, 2026
2917ac1
Merge pull request #73 from JECT-Study/develop
tlarbals824 May 1, 2026
2076950
Merge pull request #75 from JECT-Study/develop
tlarbals824 May 1, 2026
8e7c090
Merge pull request #78 from JECT-Study/develop
tlarbals824 May 2, 2026
8d9664d
Merge pull request #80 from JECT-Study/develop
tlarbals824 May 2, 2026
afb46e4
Merge pull request #82 from JECT-Study/develop
tlarbals824 May 2, 2026
8175560
Merge pull request #84 from JECT-Study/develop
tlarbals824 May 2, 2026
cd1bb0a
Merge pull request #86 from JECT-Study/develop
tlarbals824 May 2, 2026
e862145
Merge pull request #88 from JECT-Study/develop
tlarbals824 May 2, 2026
e050500
docs: OpenAPI spec β†’ TypeScript ν΄λΌμ΄μ–ΈνŠΈ μ½”λ“œ 생성 λ¬Έμ„œ μΆ”κ°€
tlarbals824 May 4, 2026
26e6bd1
Merge pull request #92 from JECT-Study/docs/add-open-api-generator-docs
tlarbals824 May 4, 2026
6e70dc1
Merge pull request #93 from JECT-Study/develop
tlarbals824 May 5, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
142 changes: 142 additions & 0 deletions docs/openapi-ts-codegen.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,142 @@
# OpenAPI Spec β†’ TypeScript ν΄λΌμ΄μ–ΈνŠΈ μ½”λ“œ 생성

Spring Bootκ°€ μžλ™ μƒμ„±ν•˜λŠ” OpenAPI spec(`swagger.json`)μœΌλ‘œλΆ€ν„° TypeScript axios ν΄λΌμ΄μ–ΈνŠΈλ₯Ό μƒμ„±ν•˜λŠ” 방법을 μ„€λͺ…ν•©λ‹ˆλ‹€.

## 디렉토리 ꡬ쑰

```
project-root/
β”œβ”€β”€ swagger.json # Spring Boot(Springdoc)κ°€ μƒμ„±ν•˜λŠ” OpenAPI 3.0 spec
β”œβ”€β”€ openapi-generator/ # μ½”λ“œ 생성 μ„€μ • 디렉토리
β”‚ β”œβ”€β”€ openapitools.json # openapi-generator-cli 버전 κ³ μ •
β”‚ β”œβ”€β”€ package.json # 생성될 npm νŒ¨ν‚€μ§€ 메타데이터 ν…œν”Œλ¦Ώ
β”‚ β”œβ”€β”€ tsconfig.json # TypeScript 컴파일 μ˜΅μ…˜
β”‚ └── modelGeneric.mustache # μ»€μŠ€ν…€ λͺ¨λΈ Mustache ν…œν”Œλ¦Ώ
└── generated-api-client/ # 생성 κ²°κ³Όλ¬Ό (μžλ™ 생성, 직접 μˆ˜μ • κΈˆμ§€)
β”œβ”€β”€ api/ # Controller별 API ν•¨μˆ˜
β”‚ β”œβ”€β”€ auth-controller-api.ts
β”‚ └── hello-controller-api.ts
β”œβ”€β”€ models/ # DTO μΈν„°νŽ˜μ΄μŠ€
β”‚ └── hello-response.ts
β”œβ”€β”€ configuration.ts # axios κΈ°λ³Έ μ„€μ • 클래슀
β”œβ”€β”€ common.ts # λ‚΄λΆ€ μœ ν‹Έ ν•¨μˆ˜
β”œβ”€β”€ base.ts # BaseAPI 클래슀
└── index.ts # 톡합 re-export
```

## swagger.json 생성

Spring Boot 앱을 μ‹€ν–‰ν•˜λ©΄ Springdoc이 μžλ™μœΌλ‘œ OpenAPI spec을 λ…ΈμΆœν•©λ‹ˆλ‹€.

```bash
# μ•± μ‹€ν–‰ ν›„ spec λ‹€μš΄λ‘œλ“œ
curl http://localhost:8080/v3/api-docs > swagger.json
```

μ•± λ‚΄ `@Operation`, `@Schema` μ–΄λ…Έν…Œμ΄μ…˜μœΌλ‘œ spec λ‚΄μš©μ„ 보강할 수 μžˆμŠ΅λ‹ˆλ‹€.

## TypeScript ν΄λΌμ΄μ–ΈνŠΈ 생성

### 사전 μ€€λΉ„

```bash
cd openapi-generator
npm install
```

### 생성 λͺ…λ Ή

```bash
# project rootμ—μ„œ μ‹€ν–‰
npx --prefix openapi-generator @openapitools/openapi-generator-cli generate \
-i swagger.json \
-g typescript-axios \
-o generated-api-client \
-t openapi-generator \
--additional-properties=withSeparateModelsAndApi=true,modelPackage=models,apiPackage=api,npmName=@ject-4-vs-team/api-client,npmVersion=0.0.1
```

| μ˜΅μ…˜ | μ„€λͺ… |
|------|------|
| `-i swagger.json` | μž…λ ₯ OpenAPI spec 파일 |
| `-g typescript-axios` | typescript-axios μ œλ„ˆλ ˆμ΄ν„° μ‚¬μš© |
| `-o generated-api-client` | 좜λ ₯ 디렉토리 |
| `-t openapi-generator` | μ»€μŠ€ν…€ Mustache ν…œν”Œλ¦Ώ 디렉토리 |
| `withSeparateModelsAndApi=true` | `api/`와 `models/` 디렉토리 뢄리 |
| `npmName` | 생성될 npm νŒ¨ν‚€μ§€ 이름 |

### npm νŒ¨ν‚€μ§€ λΉŒλ“œ

```bash
cd generated-api-client
npm install
npm run build # dist/ 디렉토리에 컴파일 κ²°κ³Ό 생성
```

## μ»€μŠ€ν…€ ν…œν”Œλ¦Ώ (modelGeneric.mustache)

κΈ°λ³Έ μ œλ„ˆλ ˆμ΄ν„°λŠ” 숫자 enum을 일반 객체둜 μƒμ„±ν•˜μ§€λ§Œ, `modelGeneric.mustache`λ₯Ό 톡해 string enum은 TypeScript `enum`, 숫자 enum은 `as const` νŒ¨ν„΄μœΌλ‘œ μƒμ„±ν•©λ‹ˆλ‹€.

```typescript
// string enum β†’ TypeScript enum
export enum Status {
Active = 'ACTIVE',
Inactive = 'INACTIVE',
}

// 숫자 enum β†’ as const νŒ¨ν„΄ (νƒ€μž… μ•ˆμ „μ„± μœ μ§€)
export const Priority = {
Low: 1,
High: 2,
} as const;

export type Priority = typeof Priority[keyof typeof Priority];
```

## ν”„λ‘ νŠΈμ—”λ“œμ—μ„œ μ‚¬μš©

```typescript
import { HelloControllerApi, AuthControllerApi, Configuration } from '@ject-4-vs-team/api-client';

const config = new Configuration({
basePath: 'https://api.example.com',
accessToken: () => localStorage.getItem('token') ?? '',
});

const helloApi = new HelloControllerApi(config);
const authApi = new AuthControllerApi(config);

// API 호좜
const response = await helloApi.hello();
console.log(response.data.message);
```

## API λ³€κ²½ μ‹œ μ›Œν¬ν”Œλ‘œμš°

```
Spring Boot API λ³€κ²½
↓
μ•± μ‹€ν–‰ ν›„ swagger.json μž¬λ‹€μš΄λ‘œλ“œ
↓
openapi-generator-cli generate μž¬μ‹€ν–‰
↓
generated-api-client/ λ³€κ²½λΆ„ 컀밋
↓
ν”„λ‘ νŠΈμ—”λ“œμ—μ„œ νƒ€μž… λ³€κ²½ 반영
```

`generated-api-client/` ν•˜μœ„ νŒŒμΌμ€ μžλ™ 생성 κ²°κ³Όλ¬Όμ΄λ―€λ‘œ 직접 μˆ˜μ •ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 변경이 ν•„μš”ν•˜λ©΄ Mustache ν…œν”Œλ¦Ώ(`openapi-generator/*.mustache`) λ˜λŠ” `--additional-properties` μ˜΅μ…˜μ„ μˆ˜μ •ν•œ λ’€ μž¬μƒμ„±ν•©λ‹ˆλ‹€.

## CLI 버전 κ³ μ •

`openapi-generator/openapitools.json`μ—μ„œ CLI 버전을 κ³ μ •ν•΄ νŒ€μ› κ°„ λ™μΌν•œ 결과물을 보μž₯ν•©λ‹ˆλ‹€.

```json
{
"generator-cli": {
"version": "7.20.0"
}
}
```

버전을 올릴 λ•ŒλŠ” 생성 결과물의 λ³€κ²½ λ²”μœ„λ₯Ό ν™•μΈν•˜κ³  ν”„λ‘ νŠΈμ—”λ“œ 영ν–₯도λ₯Ό ν•¨κ»˜ κ²€ν† ν•©λ‹ˆλ‹€.
Loading