Skip to content

한국투자 Open API에서 access token을 발급받지 못하는 문제

JIN edited this page Dec 3, 2024 · 1 revision

🧑🏻 작성자

⚙️ Web BE ⚙️ Web BE
김진 이시은

💣 문제 상황

한국투자 Open API에서는 API 요청을 할 때 access token을 필요로 해, access token을 발급받는 로직이 필요했다.

각각의 서비스에서 한국투자 Open API에 요청이 필요한 경우, access toekn 발급받는 로직을 작성해서 테스트를 진행했다.

이 과정에서 같은 app key/app secret 에 대해 access token을 발급받으려고 하니, 접근 토큰 신청 1분 제한이라는 에러가 발생하면서 access token을 발급받지 못하는 문제가 발생했다.

✨ 해결 과정

import axios from 'axios';
import { UnauthorizedException } from '@nestjs/common';
import { getFullURL } from '../../util/get-full-URL';
import { AccessTokenInterface } from './interface/korea-investment.interface';
import { getHeader } from '../../util/get-header';

export class KoreaInvestmentDomainService {
  private accessToken: string;
  private tokenExpireTime: Date;

  async getAccessToken() {
    // accessToken이 유효한 경우
    if (this.accessToken && this.tokenExpireTime > new Date()) {
      return this.accessToken;
    }
    const response = await axios
      .post<AccessTokenInterface>(getFullURL('/oauth2/tokenP'), {
        grant_type: 'client_credentials',
        appkey: process.env.KOREA_INVESTMENT_APP_KEY,
        appsecret: process.env.KOREA_INVESTMENT_APP_SECRET,
      })
      .catch(() => {
        throw new UnauthorizedException('액세스 토큰을 조회하지 못했습니다.');
      });

    const { data } = response;

    this.accessToken = data.access_token;
    this.tokenExpireTime = new Date(data.access_token_token_expired);

    return this.accessToken;
  }
}

access token을 발급받는 로직을 하나로 합쳐 싱글톤으로 관리할 수 있게 변경했다.

싱글톤으로 관리하면, 각 서비스 로직에 해당하는 API를 호출할 때마다 access token을 발급받을 필요가 없고, 1분 제한이라는 에러가 발생하지 않아 좀 더 유연하게 사용할 수 있다.

👓 참고 자료

📜 개발 일지

⚠️ 트러블 슈팅

❗ 규칙

🗒️ 기록

기획
회의록
데일리스크럼
그룹 멘토링
그룹 회고

😲 개별 멘토링

고동우
김진
서산
이시은
박진명
Clone this wiki locally