개요
재테크 블로그의 기능 중 랜딩페이지, 모의투자, 주가예측 파트에서 여러 가지 주식 정보를 요하는 기능이 있어 주식정보를 제공하는 open api를 찾던 중 빈번히 사용되는 KIS에서 제공하는 api를 알게 되었고 이를 해당 파트 개발 전 미리 연결해 보기로 했다.
1. 한국 투자 증권 계정 만들기
나의 경우 한국투자 증권 계정, 계좌가 없기에 아이디, 비밀번호도 당연히 없었다. 그래서 KIS 페이지를 통해 인증 관련 소프트웨어를 설치하고(진짜 많다) 계정을 만든다.

참고로 계좌가 없는 경우 오픈 api 사용이 불가하기에 계좌를 만들어준다. 본인의 경우 이미 주거래은행 및 주식거래 계좌가 있어 그냥 제일 기능이 협소한 계좌로 만들었다. 추가로 이 과정에서 인증하는 과정이 앱을 통해 QR로 인정하는게 간편해 앱도 설치했다.
2. KIS Developers 서비스 신청

그다음은 가입한 계정으로 트레이딩 - openai - KIS Developers - 신청하기를 통해 정보를 기입 후 신청하면

거의 바로 신청이 승인되고 KIS Developers에 접근 가능한 아이디, 비밀번호가 임시로 생성된다.
https://apiportal.koreainvestment.com/intro
KIS Developers
잠시만 기다려 주세요
apiportal.koreainvestment.com
이제 KIS API를 본격적으로 사용이 가능하고, 주어진 App Key, App Secret을 제공받는다. 잘 적어두자 API를 호출 할 때마다 사용해야 하니

이제 사용할 API를 보며, API마다 적혀있는 request, response 헤더와 바디 타입을 확인 후 요청해서 사용하면 된다.
3. API 요청
나는 API 테스트를 하고자 주식현재가 시세[v1_국내주식-008] api를 요청하기로 했다.
이전에 받은 App key와 App secret과 추가로 접속토큰을 api 통해 발급받아 국내주식-008 API를 요청할 때, 요청헤더에 넣어주고 추가로 필요한 게 접속 토큰인데 이걸 어디서 받아오냐
이 접속토큰도 따로 api를 요청해 발급받아야 한다. 두 api를 굳이 구분할 필요 없이 받아온 토큰을 바로 api 요청하는데 넣어주도록 했고 코드는 다음과 같다.
참고로 테스트여서 클라이언트에서 바로 요청을 보냈는데 CORS에러가 발생해, Next Api routing을 통해 요청했다.
// api/stock/token/route.ts
export async function POST() {
const tokenResponse = await fetch(
`https://openapivts.koreainvestment.com:29443/oauth2/tokenP`,
{
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
grant_type: 'client_credentials',
appkey: '발급받은 앱 키',
appsecret:
'발급받은 앱시크릿',
}),
},
);
const tokenData = await tokenResponse.json();
console.log(tokenData);
const stockResponse = await fetch(
`https://openapi.koreainvestment.com:9443/uapi/domestic-stock/v1/quotations/inquire-price?FID_COND_MRKT_DIV_CODE=J&FID_INPUT_ISCD=035720`,
{
method: 'POST',
headers: {
'content-Type': 'application/json',
authorization: `Bearer ${tokenData.access_token}`,
appkey: '발급받은 앱 키',
appsecret: '발급받은 앱시크릿',
tr_id: 'FHKST01010100',
},
body: JSON.stringify({
FID_COND_MRKT_DIV_CODE: 'J',
FID_INPUT_ISCD: '035720',
}),
},
);
const stockData = await stockResponse.json();
tokenResponse에 받아온 토큰을 저장해 tokenData의 access_token 값을 주식정보 요청 api의 header Authorization부분에 넣어준다. 참고로 헤더 및 바디에 넣을 속성은 여러 가지가 있지만 난 필수(required) 속성만 넣었다.
토큰 요청하는 api와 주식정보 요청 api와의 차이점 중 하나가 appkey와 appsecret을 접근토큰 요청 api의 경우 바디에 넣었지만 주식정보 요청 api의 경우 헤더에 넣은 것을 볼 수 있다 실수하지 않도록 주의하자.
주식정보 요청 api의 쿼리스트링 중 FID_COND_MRKT_DIV_CODE는 내가 조회할 상품의 타입을 가리키고 나는 주식정보를 볼 것이기 때문에 'J'를 기입했다. FID_INPUT_ISCD는 내가 조회하고자 하는 주식 고유 번호를 의미한다.
이제 요청을 하면 올바르게 요청이 갔는지 콘솔창을 통해서도 확인 가능하지만 친절하게 카톡으로 알림이 온다

그리고 토큰이 24시간이나 유효하다해서 매번 api요청 시마다 토큰을 따로 발급받기보다는 우리 서비스 내 로그인 시 회원 유효 토큰 시간을 24시간으로 맞춰 로그인마다 접속토큰을 새로 발급받게 하는 방법도 좋을 것 같다고 생각했다.
4. API 응답

성공적으로 내가 요청한 주식정보에 대한 응답이 온 것을 볼 수 있다. output의 속성이 정말 다양한데 이 중에서 기능에 맞게 잘 사용하면 될 것 같다. 참고로 내가 요청한 국내주식-008 API의 경우엔 주식명칭은 안 넘어온다.
좀 번거롭더라도 서비스 서버 DB에 주식고유번호 : 주식이름 매칭되는 DB를 구성하거나, 주식정보 요청 API - 실시간 시세 API를 통해 실시간 시세 API에 응답에 들어있는 주식명을 활용하는 방법도 있다.
참고로 TS를 사용하는 입장에서 응답 타입이 워낙 다양하고 방대해 이걸 any 처리를 할까 혹은 타입을 선언해 받아올지 고민인데 최대한 겹치는 타입에 대해서 interface로 StockDataType으로 선언하고 이걸 상속받아 하나하나 타입으로 만들까 생각 중이다.
결론
오픈 API를 오랜만에 이용해 보고, 나름 연결해 본 것 중에선 제일 절차가 간단한 듯 까다로웠는데 그래도 무사히 연결이 잘되어서 다행인 것 같다. 이제, 우리 재테크 블로그 서비스에서 각 기능 별 필요 api를 구분하고 속성을 정리할 것이다.
추가로, 급하게 요청하느라 깡 fetch -> cors 에러 발생 -> api routing 기술을 통해 사용했는데 굳이 axios 없이 이렇게 사용하는 게 충분히 편리하고, 엔드포인트도 지정할 수 있다는 게 편리해서 이번 프로젝트에선 axios를 사용하지 않을 것 같다.
'코딩 > Flex프로젝트' 카테고리의 다른 글
재테크 블로그 프로젝트 (5) - Next.js의 API 사전 연결 (3) | 2024.11.20 |
---|---|
재테크 블로그 프로젝트 (4) - 중간 개발 점검 NextJS 폴더구조 재구성 (4) | 2024.10.28 |
재테크 블로그 프로젝트 (2) - 기술선정 (2) | 2024.10.02 |
재테크 블로그 프로젝트(1)-초기세팅 (2) | 2024.09.29 |
재테크 블로그 프로젝트(0) (5) | 2024.09.28 |
개요
재테크 블로그의 기능 중 랜딩페이지, 모의투자, 주가예측 파트에서 여러 가지 주식 정보를 요하는 기능이 있어 주식정보를 제공하는 open api를 찾던 중 빈번히 사용되는 KIS에서 제공하는 api를 알게 되었고 이를 해당 파트 개발 전 미리 연결해 보기로 했다.
1. 한국 투자 증권 계정 만들기
나의 경우 한국투자 증권 계정, 계좌가 없기에 아이디, 비밀번호도 당연히 없었다. 그래서 KIS 페이지를 통해 인증 관련 소프트웨어를 설치하고(진짜 많다) 계정을 만든다.

참고로 계좌가 없는 경우 오픈 api 사용이 불가하기에 계좌를 만들어준다. 본인의 경우 이미 주거래은행 및 주식거래 계좌가 있어 그냥 제일 기능이 협소한 계좌로 만들었다. 추가로 이 과정에서 인증하는 과정이 앱을 통해 QR로 인정하는게 간편해 앱도 설치했다.
2. KIS Developers 서비스 신청

그다음은 가입한 계정으로 트레이딩 - openai - KIS Developers - 신청하기를 통해 정보를 기입 후 신청하면

거의 바로 신청이 승인되고 KIS Developers에 접근 가능한 아이디, 비밀번호가 임시로 생성된다.
https://apiportal.koreainvestment.com/intro
KIS Developers
잠시만 기다려 주세요
apiportal.koreainvestment.com
이제 KIS API를 본격적으로 사용이 가능하고, 주어진 App Key, App Secret을 제공받는다. 잘 적어두자 API를 호출 할 때마다 사용해야 하니

이제 사용할 API를 보며, API마다 적혀있는 request, response 헤더와 바디 타입을 확인 후 요청해서 사용하면 된다.
3. API 요청
나는 API 테스트를 하고자 주식현재가 시세[v1_국내주식-008] api를 요청하기로 했다.
이전에 받은 App key와 App secret과 추가로 접속토큰을 api 통해 발급받아 국내주식-008 API를 요청할 때, 요청헤더에 넣어주고 추가로 필요한 게 접속 토큰인데 이걸 어디서 받아오냐
이 접속토큰도 따로 api를 요청해 발급받아야 한다. 두 api를 굳이 구분할 필요 없이 받아온 토큰을 바로 api 요청하는데 넣어주도록 했고 코드는 다음과 같다.
참고로 테스트여서 클라이언트에서 바로 요청을 보냈는데 CORS에러가 발생해, Next Api routing을 통해 요청했다.
// api/stock/token/route.ts
export async function POST() {
const tokenResponse = await fetch(
`https://openapivts.koreainvestment.com:29443/oauth2/tokenP`,
{
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
grant_type: 'client_credentials',
appkey: '발급받은 앱 키',
appsecret:
'발급받은 앱시크릿',
}),
},
);
const tokenData = await tokenResponse.json();
console.log(tokenData);
const stockResponse = await fetch(
`https://openapi.koreainvestment.com:9443/uapi/domestic-stock/v1/quotations/inquire-price?FID_COND_MRKT_DIV_CODE=J&FID_INPUT_ISCD=035720`,
{
method: 'POST',
headers: {
'content-Type': 'application/json',
authorization: `Bearer ${tokenData.access_token}`,
appkey: '발급받은 앱 키',
appsecret: '발급받은 앱시크릿',
tr_id: 'FHKST01010100',
},
body: JSON.stringify({
FID_COND_MRKT_DIV_CODE: 'J',
FID_INPUT_ISCD: '035720',
}),
},
);
const stockData = await stockResponse.json();
tokenResponse에 받아온 토큰을 저장해 tokenData의 access_token 값을 주식정보 요청 api의 header Authorization부분에 넣어준다. 참고로 헤더 및 바디에 넣을 속성은 여러 가지가 있지만 난 필수(required) 속성만 넣었다.
토큰 요청하는 api와 주식정보 요청 api와의 차이점 중 하나가 appkey와 appsecret을 접근토큰 요청 api의 경우 바디에 넣었지만 주식정보 요청 api의 경우 헤더에 넣은 것을 볼 수 있다 실수하지 않도록 주의하자.
주식정보 요청 api의 쿼리스트링 중 FID_COND_MRKT_DIV_CODE는 내가 조회할 상품의 타입을 가리키고 나는 주식정보를 볼 것이기 때문에 'J'를 기입했다. FID_INPUT_ISCD는 내가 조회하고자 하는 주식 고유 번호를 의미한다.
이제 요청을 하면 올바르게 요청이 갔는지 콘솔창을 통해서도 확인 가능하지만 친절하게 카톡으로 알림이 온다

그리고 토큰이 24시간이나 유효하다해서 매번 api요청 시마다 토큰을 따로 발급받기보다는 우리 서비스 내 로그인 시 회원 유효 토큰 시간을 24시간으로 맞춰 로그인마다 접속토큰을 새로 발급받게 하는 방법도 좋을 것 같다고 생각했다.
4. API 응답

성공적으로 내가 요청한 주식정보에 대한 응답이 온 것을 볼 수 있다. output의 속성이 정말 다양한데 이 중에서 기능에 맞게 잘 사용하면 될 것 같다. 참고로 내가 요청한 국내주식-008 API의 경우엔 주식명칭은 안 넘어온다.
좀 번거롭더라도 서비스 서버 DB에 주식고유번호 : 주식이름 매칭되는 DB를 구성하거나, 주식정보 요청 API - 실시간 시세 API를 통해 실시간 시세 API에 응답에 들어있는 주식명을 활용하는 방법도 있다.
참고로 TS를 사용하는 입장에서 응답 타입이 워낙 다양하고 방대해 이걸 any 처리를 할까 혹은 타입을 선언해 받아올지 고민인데 최대한 겹치는 타입에 대해서 interface로 StockDataType으로 선언하고 이걸 상속받아 하나하나 타입으로 만들까 생각 중이다.
결론
오픈 API를 오랜만에 이용해 보고, 나름 연결해 본 것 중에선 제일 절차가 간단한 듯 까다로웠는데 그래도 무사히 연결이 잘되어서 다행인 것 같다. 이제, 우리 재테크 블로그 서비스에서 각 기능 별 필요 api를 구분하고 속성을 정리할 것이다.
추가로, 급하게 요청하느라 깡 fetch -> cors 에러 발생 -> api routing 기술을 통해 사용했는데 굳이 axios 없이 이렇게 사용하는 게 충분히 편리하고, 엔드포인트도 지정할 수 있다는 게 편리해서 이번 프로젝트에선 axios를 사용하지 않을 것 같다.
'코딩 > Flex프로젝트' 카테고리의 다른 글
재테크 블로그 프로젝트 (5) - Next.js의 API 사전 연결 (3) | 2024.11.20 |
---|---|
재테크 블로그 프로젝트 (4) - 중간 개발 점검 NextJS 폴더구조 재구성 (4) | 2024.10.28 |
재테크 블로그 프로젝트 (2) - 기술선정 (2) | 2024.10.02 |
재테크 블로그 프로젝트(1)-초기세팅 (2) | 2024.09.29 |
재테크 블로그 프로젝트(0) (5) | 2024.09.28 |