API

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

지오준 2024. 12. 4.
반응형

안녕하세요! 이번 포스트에서는 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!** 🚀

반응형

댓글