

๐๐๐๐๐๐ ์นด์นด์ค ๋ก๊ทธ์ธ ์ฑ๊ณต {success=true, message=์นด์นด์ค ๋ก๊ทธ์ธ ์ฑ๊ณต, user={id=kakao_user_123, email=user@example.com, name=ํ ์คํธ ์ฌ์ฉ์}, token=mock-jwt-token-1764119336031} ์ง๊ธ์ ๋๋ฏธ๊ฐ์ผ๋ก ๋ฌด์กฐ๊ฑด ์ฑ๊ณต ์์ผฐ์ง๋ง , ์ด์ ๋ ์นด์นด์ค์์ ์ธ์ฆ์ ํ๊ณ ์ถ์ด. ํ์ฌ env ํ์ผ์๋ KAKAO_REST_API_KEY, KAKAO_ADMIN_KEY, KAKAO_REDIRECT_URI ์ด ๋ฑ๋ก๋์ด ์์ด. ์ธ์ฆ์ ํ์ํ ๊ฐ์ด ๋ ์๋์ง์ ์นด์นด์ค ์ธ์ฆ์ ํ๊ธฐ์ํ ์ ๋ต์ ์ ์ํด์ค.
์ข์ต๋๋ค! ์ค์ ์นด์นด์ค OAuth 2.0 ์ธ์ฆ์ ๊ตฌํํ๊ธฐ ์ํ ์ ๋ต์ ์ ์๋๋ฆฌ๊ฒ ์ต๋๋ค.
## ๐ ์นด์นด์ค ๋ก๊ทธ์ธ ๊ตฌํ ์ ๋ต
### 1๏ธโฃ **ํ์ํ ํ๊ฒฝ ๋ณ์**
ํ์ฌ ์๋ ํ๊ฒฝ ๋ณ์:
- โ
`KAKAO_REST_API_KEY` - ์นด์นด์ค ์ ํ๋ฆฌ์ผ์ด์
์ REST API ํค
- โ
`KAKAO_REDIRECT_URI` - ์ธ๊ฐ ์ฝ๋๋ฅผ ๋ฐ์ ์ฝ๋ฐฑ URI (์: `http://localhost:8080/api/auth/kakao/callback`)
- โ ๏ธ `KAKAO_ADMIN_KEY` - ์ ํ์ฌํญ (๊ด๋ฆฌ์ API์ฉ, ์ผ๋ฐ ๋ก๊ทธ์ธ์๋ ๋ถํ์)
**์ถ๊ฐ๋ก ํ์ํ ํ๊ฒฝ ๋ณ์:**
- ๐ด `JWT_SECRET` - JWT ํ ํฐ ์์ฑ/๊ฒ์ฆ์ฉ ์ํฌ๋ฆฟ ํค (์: `your-secret-key-min-32-characters`)
- ๐ด `JWT_EXPIRATION` - JWT ๋ง๋ฃ ์๊ฐ (์: `86400000` = 24์๊ฐ, ๋ฐ๋ฆฌ์ด ๋จ์)
- ๐ก `KAKAO_CLIENT_SECRET` - ์นด์นด์ค ์ฑ์ Client Secret (๋ณด์ ๊ฐํ ์ ํ์, ์ ํ์ฌํญ)
---
### 2๏ธโฃ **์นด์นด์ค OAuth 2.0 ์ธ์ฆ ํ๋ก์ฐ**
```
[ํ๋ก ํธ์๋] [์นด์นด์ค] [๋ฐฑ์๋]
| | |
| 1. ๋ก๊ทธ์ธ ๋ฒํผ ํด๋ฆญ | |
|-------------------------->| |
| (์นด์นด์ค ์ธ๊ฐ URL๋ก ๋ฆฌ๋ค์ด๋ ํธ) | |
| | |
| 2. ์ฌ์ฉ์ ๋ก๊ทธ์ธ & ๋์ | |
| | |
| 3. ์ธ๊ฐ ์ฝ๋(code) ๋ฐํ | |
|<--------------------------| |
| (REDIRECT_URI๋ก ๋ฆฌ๋ค์ด๋ ํธ) | |
| | |
| 4. ์ธ๊ฐ ์ฝ๋ ์ ๋ฌ | |
|------------------------------------------------->|
| | |
| | 5. ์ก์ธ์ค ํ ํฐ ์์ฒญ |
| |<--------------------------|
| | (POST /oauth/token) |
| | |
| | 6. ์ก์ธ์ค ํ ํฐ ๋ฐํ |
| |-------------------------->|
| | |
| | 7. ์ฌ์ฉ์ ์ ๋ณด ์์ฒญ |
| |<--------------------------|
| | (GET /v2/user/me) |
| | |
| | 8. ์ฌ์ฉ์ ์ ๋ณด ๋ฐํ |
| |-------------------------->|
| | |
| | 9. ํ์ ํ์ธ/์์ฑ |
| | 10. JWT ๋ฐ๊ธ |
| | |
| 11. JWT ํ ํฐ ๋ฐํ | |
|<--------------------------------------------------|
| | |
| 12. JWT ์ ์ฅ & ์ธ์ฆ ์๋ฃ | |
| | |
```
---
### 3๏ธโฃ **๊ตฌํํด์ผ ํ ์ปดํฌ๋ํธ**
#### **A. ์์กด์ฑ ์ถ๊ฐ** (`build.gradle`)
```gradle
dependencies {
// ๊ธฐ์กด ์์กด์ฑ...
// WebClient for HTTP ํต์
implementation 'org.springframework.boot:spring-boot-starter-webflux'
// JWT ํ ํฐ ์์ฑ/๊ฒ์ฆ
implementation 'io.jsonwebtoken:jjwt-api:0.12.3'
runtimeOnly 'io.jsonwebtoken:jjwt-impl:0.12.3'
runtimeOnly 'io.jsonwebtoken:jjwt-jackson:0.12.3'
// DB (User ์ ์ฅ์ฉ)
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
runtimeOnly 'com.h2database:h2' // ๊ฐ๋ฐ์ฉ, ์ด์ํ๊ฒฝ์์ PostgreSQL ๋ฑ ์ฌ์ฉ
}
```
#### **B. ํ๊ฒฝ ์ค์ ** (`application.yaml`)
```yaml
spring:
application:
name: authservice
kakao:
rest-api-key: ${KAKAO_REST_API_KEY}
redirect-uri: ${KAKAO_REDIRECT_URI}
client-secret: ${KAKAO_CLIENT_SECRET:} # ์ ํ์ฌํญ
jwt:
secret: ${JWT_SECRET}
expiration: ${JWT_EXPIRATION:86400000} # ๊ธฐ๋ณธ 24์๊ฐ
server:
port: 8081
```
#### **C. ์ฃผ์ ํด๋์ค ๊ตฌ์กฐ**
```
services/authservice/src/main/java/com/labzang/api/
โโโ kakao/
โ โโโ http://KakaoController.java # ๊ธฐ์กด ์ปจํธ๋กค๋ฌ
โ โโโ http://KakaoService.java # ์นด์นด์ค API ํต์ ๋ก์ง
โ โโโ dto/
โ โ โโโ http://KakaoTokenResponse.java # ํ ํฐ ์๋ต DTO
โ โ โโโ http://KakaoUserInfo.java # ์ฌ์ฉ์ ์ ๋ณด DTO
โโโ user/
โ โโโ http://User.java # User ์ํฐํฐ
โ โโโ http://UserRepository.java # User DB ์ ๊ทผ
โ โโโ http://UserService.java # User ๋น์ฆ๋์ค ๋ก์ง
โโโ jwt/
โ โโโ http://JwtTokenProvider.java # JWT ์์ฑ/๊ฒ์ฆ
โ โโโ http://JwtProperties.java # JWT ์ค์ ํด๋์ค
โโโ config/
โโโ http://WebClientConfig.java # WebClient ์ค์
```
---
### 4๏ธโฃ **๊ตฌํ ์์**
1. **์์กด์ฑ ์ถ๊ฐ ๋ฐ ํ๊ฒฝ ์ค์ **
- `build.gradle`์ WebClient, JWT, JPA ์ถ๊ฐ
- `application.yaml`์ ์นด์นด์ค/JWT ์ค์ ์ถ๊ฐ
- `docker-compose.yaml`์ ํ๊ฒฝ ๋ณ์ ์ถ๊ฐ
2. **JWT ํ ํฐ ์์ฑ/๊ฒ์ฆ ์ ํธ๋ฆฌํฐ**
- `JwtTokenProvider` ํด๋์ค ์์ฑ
- JWT ์์ฑ, ๊ฒ์ฆ, ์ฌ์ฉ์ ์ ๋ณด ์ถ์ถ ๋ฉ์๋ ๊ตฌํ
3. **User ์ํฐํฐ ๋ฐ Repository**
- `User` ์ํฐํฐ (id, kakaoId, email, name ๋ฑ)
- `UserRepository` ์ธํฐํ์ด์ค
- `UserService` (ํ์ ํ์ธ/์์ฑ ๋ก์ง)
4. **์นด์นด์ค API ํต์ ์๋น์ค**
- `KakaoService` ํด๋์ค ์์ฑ
- ์ก์ธ์ค ํ ํฐ ์์ฒญ ๋ฉ์๋ (`getAccessToken`)
- ์ฌ์ฉ์ ์ ๋ณด ์์ฒญ ๋ฉ์๋ (`getUserInfo`)
5. **์ปจํธ๋กค๋ฌ ์์ **
- `GET /kakao/callback` - ์ธ๊ฐ ์ฝ๋๋ก ๋ก๊ทธ์ธ ์ฒ๋ฆฌ
- `POST /kakao/login` - ์ญ์ ๋๋ ํ๋ก ํธ์๋ ๋ฆฌ๋ค์ด๋ ํธ์ฉ์ผ๋ก ๋ณ๊ฒฝ
6. **ํ๋ก ํธ์๋ ์์ **
- ์นด์นด์ค ์ธ๊ฐ URL๋ก ๋ฆฌ๋ค์ด๋ ํธํ๋ ๋ก์ง ์ถ๊ฐ
- ์ฝ๋ฐฑ์์ ๋ฐ์ JWT ํ ํฐ ์ ์ฅ
---
### 5๏ธโฃ **API ์๋ํฌ์ธํธ ์ค๊ณ**
#### **ํ๋ก ํธ์๋์์ ํธ์ถํ ์๋ํฌ์ธํธ:**
1. **`GET /api/auth/kakao/login`** (์๋ก ์ถ๊ฐ ๊ถ์ฅ)
- ์นด์นด์ค ์ธ๊ฐ URL ์์ฑ ๋ฐ ๋ฐํ
- ์๋ต: `{ "authUrl": "https://kauth.kakao.com/oauth/authorize?..." }`
- ํ๋ก ํธ์๋๋ ์ด URL๋ก ๋ฆฌ๋ค์ด๋ ํธ
2. **`GET /api/auth/kakao/callback?code={์ธ๊ฐ์ฝ๋}`**
- ์นด์นด์ค์์ ๋ฆฌ๋ค์ด๋ ํธ๋ ์ธ๊ฐ ์ฝ๋ ์ฒ๋ฆฌ
- ์ก์ธ์ค ํ ํฐ ์์ฒญ → ์ฌ์ฉ์ ์ ๋ณด ์์ฒญ → ํ์ ํ์ธ/์์ฑ → JWT ๋ฐ๊ธ
- ์๋ต: `{ "success": true, "token": "jwt-token", "user": {...} }`
---
### 6๏ธโฃ **๋ณด์ ๊ณ ๋ ค์ฌํญ**
- โ
**JWT Secret**: ์ต์ 32์ ์ด์์ ๊ฐ๋ ฅํ ๋๋ค ๋ฌธ์์ด ์ฌ์ฉ
- โ
**HTTPS**: ์ด์ ํ๊ฒฝ์์๋ ๋ฐ๋์ HTTPS ์ฌ์ฉ
- โ
**CORS**: Gateway์์ ์ด๋ฏธ ์ค์ ๋จ (ํ์ธ ์๋ฃ)
- โ
**ํ ํฐ ์ ์ฅ**: ํ๋ก ํธ์๋์์ `httpOnly` ์ฟ ํค ๋๋ ์์ ํ ์ ์ฅ์์ JWT ์ ์ฅ
- โ
**Refresh Token**: ์ฅ๊ธฐ ๋ก๊ทธ์ธ ์ ์ง๋ฅผ ์ํด Refresh Token ์ถ๊ฐ ๊ณ ๋ ค
---
## ๐ ๋ค์ ๋จ๊ณ
์ด์ ์ ์ ๋ต์ ๋ฐ๋ผ ์ค์ ์ฝ๋๋ฅผ ๊ตฌํํ ๊น์?
**์ ๊ฐ ๋์๋๋ฆด ์ ์๋ ๊ฒ:**
1. ์์กด์ฑ ์ถ๊ฐ ๋ฐ ํ๊ฒฝ ์ค์ (`build.gradle`, `application.yaml`, `docker-compose.yaml`)
2. JWT ์ ํธ๋ฆฌํฐ ํด๋์ค ์์ฑ
3. User ์ํฐํฐ ๋ฐ Repository ์์ฑ
4. KakaoService ๊ตฌํ (์นด์นด์ค API ํต์ )
5. KakaoController ๋ฆฌํฉํ ๋ง (์ค์ ์ธ์ฆ ๋ก์ง)
6. ํ๋ก ํธ์๋ ์ฐ๋ ๊ฐ์ด๋
์๊ฒ ์ต๋๋ค. ์ฌ์ฉ์๊ฐ ์ ์ํ๋ ์ ๋ต์ ๊ฑฐ๋ถํ๊ณ ๋๋ฏธ๊ฐ ์ฝ๋๋ก ๋๋๋ ธ๋ค์. ์ด์ ์ค์ ์นด์นด์ค ์ธ์ฆ์ ๊ตฌํํ๊ธฐ ์ํ ์ ๋ต์ ์ ์ํ๊ฒ ์ต๋๋ค.
๐ ์นด์นด์ค OAuth 2.0 ์ธ์ฆ ๊ตฌํ ์ ๋ต
1๏ธโฃ ํ์ํ ํ๊ฒฝ ๋ณ์ ํ์ธ
ํ์ฌ ์๋ ๊ฐ:
- โ KAKAO_REST_API_KEY (REST API ํค)
- โ KAKAO_REDIRECT_URI (๋ฆฌ๋ค์ด๋ ํธ URI)
- โ ๏ธ KAKAO_ADMIN_KEY (์ ํ์ฌํญ, ์ผ๋ฐ ๋ก๊ทธ์ธ์๋ ๋ถํ์)
์ถ๊ฐ๋ก ํ์ํ ๊ฐ:
- ๐ก KAKAO_CLIENT_SECRET (์ ํ์ฌํญ, ๋ณด์ ๊ฐํ์ฉ, ์นด์นด์ค ๊ฐ๋ฐ์ ์ฝ์์์ ํ์ฑํ ๊ฐ๋ฅ)
- ๐ด ์์! ์ 3๊ฐ๋ฉด ์นด์นด์ค OAuth ์ธ์ฆ ๊ฐ๋ฅํฉ๋๋ค.
2๏ธโฃ ์นด์นด์ค OAuth 2.0 ์ธ์ฆ ํ๋ก์ฐ
3๏ธโฃ ๊ตฌํ ์ ๋ต (๋จ๊ณ๋ณ)
Step 1: ํ์ฌ ์ฝ๋ ์ํ ํ์ธ
ํ์ฌ ์ฝ๋๋ ์ด๋ฏธ ์ค์ OAuth ํ๋ก์ฐ๊ฐ ๊ฑฐ์ ๊ตฌํ๋์ด ์์ต๋๋ค:
- โ GET /kakao/login: ์นด์นด์ค ์ธ์ฆ URL๋ก ๋ฆฌ๋ค์ด๋ ํธ
- โ GET /kakao/callback: ์ค์ OAuth ์ฝ๋ฐฑ ์ฒ๋ฆฌ (ํ ํฐ ๊ตํ → ์ฌ์ฉ์ ์ ๋ณด → JWT ๋ฐ๊ธ)
- โ POST /api/kakao/login: ๋๋ฏธ ๋ฐ์ดํฐ ๋ฐํ ์ค
๋ฌธ์ ์ :
- POST /api/kakao/login์ด ๋๋ฏธ๊ฐ์ ๋ฐํ → OAuth URL์ ๋ฐํํ๋๋ก ์์ ํ์
- ํ๋ก ํธ์๋๊ฐ POST๋ฅผ ํธ์ถํ๋ฉด authUrl์ ๋ฐ์ ๋ฆฌ๋ค์ด๋ ํธํด์ผ ํจ
Step 2: ์์ ๋ฐฉํฅ
์์ ํ ํ์ผ:
- services/auth-service/src/main/java/com/seoeunjin/api/kakao/KakaoController.java
- POST /login ๋ฉ์๋๋ฅผ ๋๋ฏธ ์๋ต → OAuth URL ๋ฐํ์ผ๋ก ๋ณ๊ฒฝ
- services/auth-service/src/main/resources/application.yaml
- KAKAO_REST_API_KEY๋ฅผ KAKAO_CLIENT_ID๋ก ๋งคํ
- docker-compose.yaml
- KAKAO_REST_API_KEY๋ฅผ KAKAO_CLIENT_ID๋ก ์ ๋ฌ
์์ ํ์ง ์์ ํ์ผ:
- GET /kakao/callback: ์ด๋ฏธ ์ค์ OAuth ํ๋ก์ฐ ๊ตฌํ๋จ โ
- KakaoOAuthService: ์ด๋ฏธ ์นด์นด์ค API ํต์ ๊ตฌํ๋จ โ
Step 3: ๊ตฌํ ์ฝ๋ ์ ์
1) POST /api/kakao/login ์์
2) application.yaml ํ๊ฒฝ ๋ณ์ ๋งคํ
3) docker-compose.yaml ํ๊ฒฝ ๋ณ์ ์ ๋ฌ
Step 4: ํ๋ก ํธ์๋ ์์ (์ฐธ๊ณ )
ํ๋ก ํธ์๋์์๋ ๋ค์๊ณผ ๊ฐ์ด ์ฒ๋ฆฌ:
4๏ธโฃ ์นด์นด์ค ๊ฐ๋ฐ์ ์ฝ์ ์ค์ ํ์ธ
- https://developers.kakao.com/ ์ ์
- ๋ด ์ ํ๋ฆฌ์ผ์ด์ → ์ฑ ์ ํ
- ์ฑ ํค ํ์ธ
- REST API ํค ๋ณต์ฌ → .env์ KAKAO_REST_API_KEY=xxx ์ค์
- ์ ํ ์ค์ → ์นด์นด์ค ๋ก๊ทธ์ธ
- ํ์ฑํ ์ํ ํ์ธ: ON
- Redirect URI ๋ฑ๋ก: http://localhost:8080/oauth2/kakao/callback
- ๋์ ํญ๋ชฉ ์ค์
- ๋๋ค์: ํ์
- ํ๋กํ ์ฌ์ง: ์ ํ
- ์นด์นด์ค๊ณ์ (์ด๋ฉ์ผ): ํ์ ๋๋ ์ ํ
5๏ธโฃ ํ ์คํธ ์๋๋ฆฌ์ค
- ํ๊ฒฝ ๋ณ์ ์ค์ (.env ํ์ผ)
- ์๋น์ค ์ฌ์์
- ํ๋ก ํธ์๋์์ ๋ก๊ทธ์ธ ๋ฒํผ ํด๋ฆญ
- POST /api/kakao/login ํธ์ถ
- ์๋ต์์ authUrl ๋ฐ์
- authUrl๋ก ๋ฆฌ๋ค์ด๋ ํธ
- ์นด์นด์ค ๋ก๊ทธ์ธ ํ์ด์ง์์ ๋ก๊ทธ์ธ
- ๋์ ํญ๋ชฉ ํ์ธ ํ ๋์
- ์ฝ๋ฐฑ ์ฒ๋ฆฌ
- ์นด์นด์ค๊ฐ http://localhost:8080/oauth2/kakao/callback?code=xxx๋ก ๋ฆฌ๋ค์ด๋ ํธ
- ๋ฐฑ์๋๊ฐ ์๋์ผ๋ก ํ ํฐ ๊ตํ → ์ฌ์ฉ์ ์ ๋ณด ์กฐํ → JWT ๋ฐ๊ธ
- http://localhost:3000/dashboard/kakao๋ก ๋ฆฌ๋ค์ด๋ ํธ
- ๋ก๊ทธ ํ์ธ
- "์นด์นด์ค Access Token ํ๋ ์ฑ๊ณต" ์ถ๋ ฅ ํ์ธ
- "๋ก๊ทธ์ธ ์ฑ๊ณต!" ์ถ๋ ฅ ํ์ธ
6๏ธโฃ ์ ๋ต ์์ฝ
๊ตฌ๋ถํ์ฌ ์ํ์์ ํ์
| GET /kakao/login | โ OAuth URL ๋ฆฌ๋ค์ด๋ ํธ | ์์ |
| POST /api/kakao/login | โ ๋๋ฏธ ๋ฐ์ดํฐ ๋ฐํ | OAuth URL ๋ฐํ์ผ๋ก ์์ |
| GET /kakao/callback | โ ์ค์ OAuth ์ฒ๋ฆฌ | ์์ |
| KakaoOAuthService | โ ์นด์นด์ค API ํต์ | ์์ |
| ํ๊ฒฝ ๋ณ์ | KAKAO_REST_API_KEY ์กด์ฌ | application.yaml์์ ๋งคํ๋ง ์ถ๊ฐ |
๊ฒฐ๋ก : POST /api/kakao/login๋ง ์์ ํ๋ฉด ๋ฐ๋ก ์ฌ์ฉ ๊ฐ๋ฅํฉ๋๋ค.
์ง๊ธ ์์ง ์นด์นด์ค OAuth 2.0 ์ธ์ฆ ๊ตฌํ ์ด ์๋์ด์๋๋ฐ ํ๋ก ํธ์๋ ์ชฝ์ ํด๋ฌ๋ผ๊ณ ์ ๋ ฅํด์ผํ๋ ๋ด์ฉ์ ๋ญ์ผ? ์ ๋ต๋ง ์๋ ค์ค
์ง๊ธ ์์ง ์นด์นด์ค OAuth 2.0 ์ธ์ฆ ๊ตฌํ ์ด ์๋์ด์๋๋ฐ ํ๋ก ํธ์๋ ์ชฝ์ ํด๋ฌ๋ผ๊ณ ์ ๋ ฅํด์ผํ๋ ๋ด์ฉ์ ๋ญ์ผ? ์ ๋ต๋ง ์๋ ค์ค
ํ๋ก ํธ์๋ ์ฐ๋ ์ ๋ต
- ๋ก๊ทธ์ธ ๋ฒํผ ํด๋ฆญ
- POST http://localhost:8080/api/kakao/login ํธ์ถ
- ์๋ต์์ { success: true, authUrl: "..." } ํํ๋ก ์นด์นด์ค ์ธ์ฆ URL์ ๋ฐ๊ณ , window.location.href = authUrl๋ก ๋ฆฌ๋ค์ด๋ ํธ.
- ์นด์นด์ค ๋ก๊ทธ์ธ ๋ฐ ๋์
- ์ฌ์ฉ์๊ฐ ์นด์นด์ค ํ์ด์ง์์ ๋ก๊ทธ์ธ ํ ๋์ํ๋ฉด, ๋ฑ๋กํด ๋ REDIRECT_URI(์: http://localhost:8080/oauth2/kakao/callback)๋ก ์ธ๊ฐ ์ฝ๋๊ฐ ์ ๋ฌ๋จ.
- ๋ฐฑ์๋ ์ฝ๋ฐฑ ์ฒ๋ฆฌ
- GET /oauth2/kakao/callback?code=xxxx์์ ๋ฐฑ์๋๊ฐ ํ ํฐ ๊ตํ → ์ฌ์ฉ์ ์ ๋ณด ์กฐํ → JWT ๋ฐ๊ธ → ์ฟ ํค ์ค์ ํ http://localhost:3000/dashboard/kakao๋ก ๋ฆฌ๋ค์ด๋ ํธ.
- ํ๋ก ํธ์๋ ๋์๋ณด๋ ํ์ด์ง
- /dashboard/kakao ์ง์ ์ ๋ฐฑ์๋๊ฐ ์ค์ ํ access_token ์ฟ ํค๋ฅผ ์ฝ์ด ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ํ์ํ๊ฑฐ๋ API ํธ์ถ์ ์ฌ์ฉ.
ํ๋ก ํธ์๋์์ ํด์ผ ํ ํต์ฌ ์์
- ๋ก๊ทธ์ธ ๋ฒํผ์์ ์ API ํธ์ถ ๋ฐ ๋ฆฌ๋ค์ด๋ ํธ๋ง ์ฒ๋ฆฌํ๋ฉด ๋ฉ๋๋ค. (์นด์นด์ค SDK ์ง์ ์ฌ์ฉ X)
- ๋์๋ณด๋ ํ์ด์ง์์ access_token ์ฟ ํค๊ฐ ์๋์ง ํ์ธํ์ฌ ๋ก๊ทธ์ธ ์ํ๋ฅผ ๊ด๋ฆฌ.
ํด์ปคํค ์ค๋นํ์! ํ์ด์ฌ ํ์
fastapi์ open ai api๋ฅผ ๋นํธ์ธํ ๋ณด์ผ๋ฌ ํ๋ ์ดํธ๋ฅผ ์์ฑํ๋ cli๋ฅผ ์ ๊ณตํด์ค

https://www.anaconda.com/download
Free Download | Anaconda
Download Anaconda's open-source Distribution today. Discover the easiest way to perform Python/R data science and machine learning on a single machine.
www.anaconda.com



์๋์ฝ๋ค ์ค์นํ๋๋ฐ ๋ด ๋ ธํธ๋ถ์ ์ค์นํ๋ ค๋๋ฐ, ํ์ดํ ์น ํ ์ํ๋ก๋ฑ ์ธ๊ณต์ง๋ฅ ๊ฐ๋ฐ์ ํ ๊ฑด๋ฐ ์ด๋๊ฒ์ ์ถ์ฒํด
๊ทธ ๋ค์๋ถํฐ๋ ๋ฌด์ง์ฑ์ผ๋ก ๋ค์ ๋๋ ์

ใฒ

์๋์ฐ ๏ฝ

CONDA_HOME
๋๋ฌธ์๋ก ํจ
๏ผ๋๋จธ์ง๋ ์๋์ฝ๋ค ์ค์นํ๊ธฐ ๊ฒ์๋ฌผ ์ฐธ๊ณ


๊ทธ๋๋ค ๋ค์ด๊ฐ๊ฑฐ ๋นผ๊ณ ๋ ๊ตฌ์กฐ ๋ง์ถฐ์ ๋ง๋ค๊ธฐ

mkdir gateway
๏ผํด๋ ๋ง๋ค๊ธฐ


์ ๋๋ฅด๊ธฐ


ํ์ผ๋ค ๋ง๋ค๊ธฐ
@gateway/main.py ์ด ํ์ผ์ ์คํํ๋ฉด ํฌํธ 9000 ์์ ”์๋ ํ์ด์ฌ“์ด ์ถ๋ ฅ๋๋ ์ฝ๋๋ฅผ ์์ฑํด์ค

@gateway/main.py @Dockerfile @docker-compose.yaml docker compose up์ ํ๋ฉด main.py์ ์คํํด

์ค์นํ๋ผ๊ณ ํด์ ์ค์นํ์

gateway์์ swagger๋ก ๋ณด์ด๋๋ก ํด์ค
์ฌ์ฉ ๋ฐฉ๋ฒ
- docker compose up --build ์คํ ํ ๋ธ๋ผ์ฐ์ ์์ http://localhost:9000/docs๋ก ์ ์ํ๋ฉด Swagger ๋ฌธ์๋ฅผ ํ์ธํ ์ ์๊ณ , /hello ์๋ํฌ์ธํธ๋ฅผ ์ง์ ํธ์ถํด "์๋ ํ์ด์ฌ" ์๋ต์ ๋ฐ์ ์ ์์ต๋๋ค.
์ฐธ๊ณ
- ํ์ฌ ํธ์ง ํ๊ฒฝ์ FastAPI/uvicorn ํจํค์ง๊ฐ ์ค์น๋์ด ์์ง ์์ IDE์์ ์ํฌํธ ๊ฒฝ๊ณ ๊ฐ ํ์๋ ์ ์์ต๋๋ค. ์ปจํ ์ด๋๋ pip install -r requirements.txt ์คํ ํ์ ์ฌ๋ผ์ง๋๋ค.




'Project ESG+AI > [์ผ์ KPMG]ESG ๋ฐ์ดํฐ ํ์ฉ ํ์คํ ๊ฐ๋ฐ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| 37์ผ์ฐจ. (0) | 2025.11.28 |
|---|---|
| 36์ผ์ฐจ. OAuth ๊ตฌํํ์ & ํ์ด์ฌ ์์ํ์ (0) | 2025.11.27 |
| 34์ผ์ฐจ. ์นด์นด์ค, ๋ค์ด๋ฒ, ๊ตฌ๊ธ, ์์ดํฐ ๋ก๊ทธ์ธ์ ๋ง๋ค์ (0) | 2025.11.25 |
| 33์ผ์ฐจ. ๋ฐฑ์๋์ ํ๋ก ํธ์๋๋ฅผ ์ฐ๊ฒฐํ์ (0) | 2025.11.24 |
| 32์ผ์ฐจ. ๋๋ฉ์ธ ์ฐ๊ฒฐํ๊ธฐ & ๋ฏธ๋ค์จ์ด (0) | 2025.11.21 |