IT/코딩

최신 기술 동향과 실무 중심의 튜토리얼을 만나보세요.

Base64를 사용하는 이유

Base64를 사용하는 이유

<p>​여러가지&nbsp;이유가&nbsp;있겠지만,</p><p>원칙적으로는&nbsp;바이너리&nbsp;데이터의&nbsp;손실을&nbsp;막기&nbsp;위해서입니다.</p><p></p><p>바이너리&nbsp;데이터는&nbsp;문자열&nbsp;형태로&nbsp;변환하면&nbsp;데이터&nbsp;손실이&nbsp;있습니다.</p><p></p><p>예를&nbsp;들어&nbsp;C:/Windows/System32/keyboard.drv&nbsp;라는&nbsp;파일의&nbsp;데이터를&nbsp;읽어&nbsp;</p><p>다른&nbsp;곳으로&nbsp;전송해줘야&nbsp;하는데&nbsp;바이너리&nbsp;형태로&nbsp;전송할&nbsp;방법이&nbsp;없을&nbsp;때는</p><p>어떻게&nbsp;해야&nbsp;할까요..</p><p></p><p>그럴&nbsp;때&nbsp;사용하는&nbsp;방법&nbsp;중&nbsp;하나입니다.&nbsp;</p><p></p><p>Base64로&nbsp;인코딩&nbsp;한&nbsp;다음에&nbsp;보내주고,&nbsp;&nbsp;</p><p>그&nbsp;곳에서는&nbsp;Base64&nbsp;디코딩을&nbsp;이용해&nbsp;데이터를&nbsp;복원&nbsp;하게&nbsp;됩니다.</p><p>이렇게&nbsp;하면&nbsp;데이터&nbsp;손실을&nbsp;막을&nbsp;수&nbsp;있지요.</p><p></p><p>byte를&nbsp;String&nbsp;형태로&nbsp;바꾸면&nbsp;어떻게&nbsp;될까요?</p><p>간단한&nbsp;예제를&nbsp;만들어&nbsp;보았습니다.</p><p></p><pre data-language="java"> public static void main(String[] args) throws IOException { File file = new File(&quot;C:/Windows/System32/keyboard.drv&quot;); FileInputStream fin = new FileInputStream(file); int read = -1; byte[] bt = new byte[1024]; ByteArrayOutputStream bos = new ByteArrayOutputStream(); while((read=fin.read(bt))!=-1) { bos.write(bt, 0, read); } bos.close(); fin.close(); System.out.println(bos.toByteArray().length); } </pre><p><img src="data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw=="></p><p></p><p>원본&nbsp;파일은&nbsp;2,000&nbsp;byte인데&nbsp;&nbsp;</p><p>String&nbsp;형태로&nbsp;저장하니&nbsp;2,406&nbsp;byte가&nbsp;되어버리네요.</p><p></p><p>반대로&nbsp;String&nbsp;형태가&nbsp;아닌&nbsp;Binary로&nbsp;저장하는&nbsp;방법을&nbsp;사용해보겠습니다.</p><pre data-language="java"> public static void main(String[] args) throws IOException { File file = new File(&quot;C:/Windows/System32/keyboard.drv&quot;); FileInputStream fin = new FileInputStream(file); int read = -1; byte[] bt = new byte[1024]; ByteArrayOutputStream bos = new ByteArrayOutputStream(); while((read=fin.read(bt))!=-1) { bos.write(bt, 0, read); } bos.close(); fin.close(); System.out.println(bos.toByteArray().length); } </pre><p><img src="data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw=="></p><p></p><p>어떤가요?&nbsp;2,000&nbsp;byte&nbsp;그대로지요?</p><p>왜&nbsp;그럴까요?&nbsp;아주&nbsp;기본&nbsp;상식이지만&nbsp;다시&nbsp;짚고&nbsp;넘어가자면</p><p></p><p>기본적으로</p><p></p><p>char&nbsp;데이터는&nbsp;non-signed&nbsp;1byte&nbsp;:&nbsp;양의&nbsp;정수&nbsp;(0~255&nbsp;표현)</p><p>​byte&nbsp;데이터는&nbsp;signed&nbsp;1byte&nbsp;:&nbsp;그냥&nbsp;정수&nbsp;(-128~127&nbsp;표현)</p><p></p><p>이기&nbsp;때문에&nbsp;음수로&nbsp;된&nbsp;byte&nbsp;데이터는&nbsp;char가&nbsp;못&nbsp;알아먹습니다.</p><p></p><p>&quot;​난&nbsp;byte.&nbsp;char에게&nbsp;-20(ec)을&nbsp;주었다.&quot;</p><p>=&gt;&nbsp;​&quot;난&nbsp;char.&nbsp;byte한테&nbsp;​236(ec)을&nbsp;받았다.&quot;</p><p></p><p>​라고&nbsp;해석해버리게&nbsp;되는거죠.&nbsp;그래서&nbsp;데이터&nbsp;손실이&nbsp;일어나는&nbsp;겁니다.</p><p></p><p>그리하여&nbsp;이&nbsp;데이터를&nbsp;일정한&nbsp;규칙에&nbsp;따라&nbsp;변환한&nbsp;뒤&nbsp;전송해야&nbsp;하는데</p><p>이러한&nbsp;방법&nbsp;중&nbsp;하나가&nbsp;Base64&nbsp;인코딩입니다.&nbsp;Base64로&nbsp;전송되면</p><p>​받는&nbsp;곳에서는&nbsp;다시&nbsp;byte&nbsp;데이터로&nbsp;복구를&nbsp;해야&nbsp;하죠.</p><p></p><p>그러므로&nbsp;당연히</p><p></p><p>1.&nbsp;Base64&nbsp;인코딩&nbsp;-&nbsp;파라미터&nbsp;:&nbsp;byte[]&nbsp;,&nbsp;리턴유형&nbsp;:&nbsp;String,</p><p>2.&nbsp;Base64&nbsp;디코딩&nbsp;-&nbsp;파라미터&nbsp;:&nbsp;String&nbsp;,&nbsp;리턴유형&nbsp;:&nbsp;byte[]</p><p></p><p>라는&nbsp;결과가&nbsp;나오는&nbsp;것입니다.</p><p>​</p>

자세히 보기
환율정보 API

환율정보 API

<h2>한국수출입은행 환율 API 연동 가이드: 5분 만에 끝내는 실시간 데이터 활용</h2><h3><br></h3><h3>1. API 키 발급 (준비 단계)</h3><p>먼저 데이터를 호출할 수 있는 '열쇠'인 API 키가 필요합니다.</p><ol><li data-list="bullet"><span class="ql-ui" contenteditable="false"></span><strong>공식 발급처:</strong> <a href="https://www.koreaexim.go.kr/ir/HPHKIR019M01" rel="noopener noreferrer" target="_blank">한국수출입은행 Open API 페이지</a></li><li data-list="bullet"><span class="ql-ui" contenteditable="false"></span>위 페이지에서 회원가입 후 인증키를 신청하면 <code>authkey</code>를 즉시 확인할 수 있습니다. 이 키는 API 호출 시 신분증 역할을 하므로 외부에 유출되지 않도록 주의해야 합니다.</li></ol><p><br></p><h4>2. 호출 방식 및 파라미터</h4><p>수출입은행 API는 REST 방식을 지원하며, 호출 주소와 필요한 파라미터는 다음과 같습니다.</p><ol><li data-list="bullet"><span class="ql-ui" contenteditable="false"></span><strong>Base URL:</strong> <code>https://oapi.koreaexim.go.kr/site/program/financial/exchangeJSON</code></li><li data-list="bullet"><span class="ql-ui" contenteditable="false"></span><strong>필수 파라미터:</strong></li><li data-list="bullet" class="ql-indent-1"><span class="ql-ui" contenteditable="false"></span><code>authkey</code>: 발급받은 개인 API 키</li><li data-list="bullet" class="ql-indent-1"><span class="ql-ui" contenteditable="false"></span><code>searchdate</code>: 조회 날짜 (예: 20260305)</li><li data-list="bullet" class="ql-indent-1"><span class="ql-ui" contenteditable="false"></span><code>data</code>: 조회 타입 (<code>AP01</code>: 환율, <code>AP02</code>: 대출금리, <code>AP03</code>: 국제금리)</li></ol><p><br></p><h4>3. 결과 필드 읽기</h4><p>호출에 성공하면 JSON 형식의 데이터를 응답받습니다. 실무에서 주로 사용하는 주요 필드는 아래와 같습니다.</p><table><tbody><tr><td data-row="1">RESULT</td><td data-row="1">Integer</td><td data-row="1">조회 결과</td><td data-row="1">1 : 성공, 2 : DATA코드 오류, 3 : 인증코드 오류, 4 : 일일제한횟수 마감</td></tr><tr><td data-row="2">CUR_UNIT</td><td data-row="2">String</td><td data-row="2">통화코드</td><td data-row="2"><br></td></tr><tr><td data-row="3">CUR_NM</td><td data-row="3">String</td><td data-row="3">국가/통화명</td><td data-row="3"><br></td></tr><tr><td data-row="4">TTB</td><td data-row="4">String</td><td data-row="4">전신환(송금)</td><td data-row="4">받으실때</td><td data-row="4"><br></td></tr><tr><td data-row="5">TTS</td><td data-row="5">String</td><td data-row="5">전신환(송금)</td><td data-row="5">보내실때</td><td data-row="5"><br></td></tr><tr><td data-row="6">DEAL_BAS_R</td><td data-row="6">String</td><td data-row="6">매매 기준율</td><td data-row="6"><br></td></tr><tr><td data-row="7">BKPR</td><td data-row="7">String</td><td data-row="7">장부가격</td><td data-row="7"><br></td></tr><tr><td data-row="8">YY_EFEE_R</td><td data-row="8">String</td><td data-row="8">년환가료율</td><td data-row="8"><br></td></tr><tr><td data-row="9">TEN_DD_EFEE_R</td><td data-row="9">String</td><td data-row="9">10일환가료율</td><td data-row="9"><br></td></tr><tr><td data-row="10">KFTC_DEAL_BAS_R</td><td data-row="10">String</td><td data-row="10">서울외국환중개</td><td data-row="10">매매기준율</td><td data-row="10"><br></td></tr><tr><td data-row="11">KFTC_BKPR</td><td data-row="11">String</td><td data-row="11">서울외국환중개</td><td data-row="11">장부가격</td><td data-row="11"><br></td></tr></tbody></table><p><br></p><h3><br></h3><h3>실무 적용 시 팁: 휴일 데이터 처리</h3><p>금융 API를 다룰 때 반드시 고려해야 할 점은 <strong>은행 영업일</strong>입니다.</p><p>주말이나 공휴일에는 새로운 환율 데이터가 생성되지 않기 때문에, API 호출 결과가 비어있을 수 있습니다.</p><p>이런 경우를 대비해 <strong>데이터가 없을 시 가장 최근 영업일의 날짜로 재요청하는 로직</strong>을 구현해 두는 것이 좋습니다.</p><p>또한 응답 데이터가 문자열(String) 형태로 들어오므로, 소수점 계산이 필요한 경우</p><p>적절한 숫자형으로 변환하는 과정이 필요합니다.</p><p><br></p><h3><br></h3><h3>결론: 안정적인 금융 서비스의 시작</h3><p>한국수출입은행 API는 무료이면서도 강력한 기능을 제공합니다.</p><p>환전 시스템이나 무역 관리 툴을 고민 중이라면 이 가이드를 통해 안정적인 데이터 환경을 구축해 보시기 바랍니다.</p><p>추가로 궁금한 점이나 코드 예제가 필요하다면 언제든 문의해 주세요.</p><p><br></p><p><strong>출처:</strong> 한국수출입은행 Open API 가이드라인 ( https://www.koreaexim.go.kr/ir/HPHKIR019M01 )</p>

자세히 보기
실시간 환율 ( API 구현 )

실시간 환율 ( API 구현 )

<p>fetch(/article/dev/erate)</p>

자세히 보기