API

증권사 주식 매매 API 연동하기 (Java 샘플 코드 포함)

지오준 2024. 12. 4. 10:00
반응형

안녕하세요! 이번 포스트에서는 Java를 사용해 증권사의 주식 매매 API를 연동하는 방법을 단계별로 설명합니다. 주식 매매 API는 일반적으로 주문, 잔고 조회, 시세 확인 등의 기능을 제공합니다. 다음은 이 작업을 진행하기 위한 가이드입니다.

---

## 1. 준비사항

### 1-1. **증권사 API 신청**
먼저 사용하려는 증권사의 API에 가입 및 인증 신청을 해야 합니다. 예를 들어, 한국의 주요 증권사(KB증권, 키움증권, 삼성증권 등)에서는 각각의 OpenAPI를 제공합니다.

- **API 키 발급**: 인증된 개발자 계정으로 로그인한 뒤, API 키를 발급받습니다.
- **환경 확인**: 대부분 증권사 API는 테스트 환경과 실거래 환경으로 나뉘어 있습니다.

### 1-2. **Java 개발 환경 설정**
Java를 사용해 증권사의 API와 통신하기 위해 필요한 라이브러리와 도구를 설정합니다.

1. **JDK 설치**: JDK 8 이상 권장.
2. **Gradle/Maven 프로젝트 생성**:
   - API 요청 시 JSON 처리를 위해 `Gson` 또는 `Jackson` 같은 라이브러리가 필요합니다.
   - HTTP 요청 처리를 위해 `OkHttp` 또는 `Apache HttpClient`를 사용할 수 있습니다.

Gradle 예시 (build.gradle):
```gradle
dependencies {
    implementation 'com.squareup.okhttp3:okhttp:4.9.3'
    implementation 'cohttp://m.google.code.gson:gson:2.10'
}
```

---

## 2. API 연동 기본 구조

### 2-1. **인증 토큰 발급**
대부분의 증권사 API는 OAuth2 인증을 사용합니다. 먼저, API 키와 시크릿 키를 사용해 토큰을 발급받아야 합니다.

#### 샘플 코드:
```java
import okhttp3.*;
import cohttp://m.google.gson.*;

import java.io.IOException;

public class AuthTokenExample {
    private static final String API_URL = "https://api.example.com/oauth2/token"; // 증권사 토큰 발급 URL
    private static final String API_KEY = "your_api_key";
    private static final String SECRET_KEY = "your_secret_key";

    public static String getAuthToken() throws IOException {
        OkHttpClient client = new OkHttpClient();

        // 요청 본문 생성
        String json = new Gson().toJson(new AuthRequest(API_KEY, SECRET_KEY));

        RequestBody body = RequestBody.create(json, MediaType.get("application/json"));
        Request request = new Request.Builder()
                .url(API_URL)
                .post(body)
                .build();

        try (Response response = client.newCall(request).execute()) {
            if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);

            String responseBody = response.body().string();
            JsonObject jsonResponse = JsonParser.parseString(responseBody).getAsJsonObject();
            return jsonResponse.get("access_token").getAsString();
        }
    }

    // 인증 요청을 위한 내부 클래스
    static class AuthRequest {
        String client_id;
        String client_secret;

        public AuthRequest(String clientId, String clientSecret) {
            this.client_id = clientId;
            this.client_secret = clientSecret;
        }
    }

    public static void main(String[] args) {
        try {
            String token = getAuthToken();
            System.out.println("Access Token: " + token);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
```

---

### 2-2. **주문 요청**
다음으로, 발급받은 인증 토큰을 사용해 주식 매매 주문을 실행합니다.

#### 샘플 코드:
```java
public class StockOrderExample {
    private static final String ORDER_URL = "https://api.example.com/v1/orders"; // 주문 API URL

    public static void placeOrder(String token, String stockCode, int quantity, double price, String orderType) throws IOException {
        OkHttpClient client = new OkHttpClient();

        // 요청 데이터 생성
        JsonObject orderRequest = new JsonObject();
        orderRequest.addProperty("stock_code", stockCode);
        orderRequest.addProperty("quantity", quantity);
        orderRequest.addProperty("price", price);
        orderRequest.addProperty("order_type", orderType);

        RequestBody body = RequestBody.create(orderRequest.toString(), MediaType.get("application/json"));
        Request request = new Request.Builder()
                .url(ORDER_URL)
                .post(body)
                .addHeader("Authorization", "Bearer " + token) // 인증 헤더 추가
                .build();

        try (Response response = client.newCall(request).execute()) {
            if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);

            String responseBody = response.body().string();
            System.out.println("Order Response: " + responseBody);
        }
    }

    public static void main(String[] args) {
        try {
            String token = AuthTokenExample.getAuthToken();
            placeOrder(token, "005930", 10, 72000.0, "BUY");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
```

---

## 3. 테스트 및 디버깅

1. **테스트 환경에서 실행**: 증권사에서 제공하는 테스트 환경(API URL)에서 충분히 테스트합니다.
2. **실거래 환경 전환**: 문제가 없다고 판단되면 실거래 API URL로 전환합니다.
3. **에러 처리**: API 호출 시 발생할 수 있는 에러 코드와 메시지를 확인하고 적절히 처리합니다.

---

## 4. 주의사항

1. **API 키 관리**: API 키와 시크릿 키는 외부에 노출되지 않도록 보안에 주의합니다.
2. **실거래 시 주의**: 실거래 환경에서 코드를 실행하기 전에 거래 조건을 정확히 확인하세요.
3. **API 제한 확인**: API 호출 횟수 제한이 있을 수 있으므로 문서를 참고하세요.

---

## 결론

증권사 API를 활용하면 Java로 다양한 주식 매매 자동화 기능을 구현할 수 있습니다. 위 코드를 기본으로 확장해 잔고 조회, 주문 상태 확인 등의 기능을 추가해 보세요. 도움이 필요하면 댓글로 질문을 남겨주세요!

**Happy Coding!** 🚀

반응형