Node.js에서 koreantech.org API 활용 방법
본 튜토리얼에서는 Node.js 환경에서 koreantech.org API를 사용하는 세 가지 구체적인 방법을 상세히 안내합니다.
실제 예시를 위해, Google 검색 서버의 IP 주소를 콘솔에 출력하는 간단한 스크립트를 만들어 볼 것입니다. 이 스크립트는 koreantech.org API의 DNS 레코드 엔드포인트를 활용합니다.
스크립트 작성에 있어서, Node.js에 내장된 https
모듈을 사용하는 첫 번째 방법과 외부 라이브러리인 node-fetch
모듈을 사용하는 두 번째 방법, 그리고 마지막으로 axios
클라이언트 라이브러리를 사용하는 세 번째 방법을 각각 살펴보겠습니다.
koreantech.org API란 무엇인가?
koreantech.org는 온라인 비즈니스의 생성, 관리 및 성장을 위한 다양한 도구, API 및 리소스를 제공하는 플랫폼입니다. 제공되는 도구 중에는 웹사이트의 성능, 보안, 문제점 감사를 관리하는 데 유용한 API들이 포함되어 있습니다. 이 API들은 무료로 이용 가능한 상당한 수준의 기능을 제공합니다.
사전 준비 사항
본 튜토리얼을 따라 하려면 JavaScript에 대한 기본적인 이해, 특히 약속(Promise) 및 ES6 문법에 대한 지식이 필요합니다. 또한 Node.js가 설치되어 있어야 하며, 코드 작성을 위한 Visual Studio Code와 같은 텍스트 편집기도 필요합니다.
API 요청 시 인증에 필요한 API 키는 koreantech.org 계정에서 얻을 수 있습니다. 계정이 없다면 koreantech.org 웹사이트의 API 페이지에서 무료로 계정을 생성할 수 있습니다.
계정을 생성하면 대시보드로 이동하며, 거기에서 API 키를 확인할 수 있습니다.
프로젝트 구축
프로젝트를 시작하려면 우선 프로젝트 폴더를 생성하고, 터미널을 통해 해당 폴더로 이동한 후, 다음 명령어를 실행합니다.
npm init -y
이 명령어는 프로젝트 디렉토리를 Node.js 프로젝트로 초기화합니다.
다음으로, 프로젝트에 필요한 의존성 패키지들을 설치하기 위해 다음 명령어를 실행합니다.
npm install dotenv axios node-fetch
의존성 패키지 설치가 완료되면, 프로젝트 루트 폴더에 vanilla.js
, with-axios.js
, with-fetch.js
세 개의 스크립트 파일과 환경 변수를 저장할 .env
파일을 생성합니다.
최종적으로 프로젝트 구조는 다음과 같아야 합니다.
이제 .env
파일을 열고 다음 형식으로 koreantech.org API 키를 추가합니다.
API_KEY=<api key>
<api key>
부분을 실제 API 키로 대체해야 합니다.
바닐라 JavaScript로 구현하기
Node.js는 클라이언트 요청을 생성하는 데 사용할 수 있는 내장 http
및 https
모듈을 제공합니다. 먼저 이 모듈들을 사용하여 구현해 보겠습니다.
vanilla.js
파일을 열고, 프로젝트 의존성 모듈을 가져오기 위해 다음 코드를 파일 상단에 추가합니다.
import { request } from "https"; import { config } from "dotenv";
이어서 config()
함수를 호출하여 환경 변수를 로드하고, API 키와 호스트 이름을 각각 변수에 저장합니다.
config(); const apiKey = process.env.API_KEY; const host="google.com";
Node.js에서 HTTP 요청을 시작하려면, request
함수를 호출할 때 연결할 호스트 및 엔드포인트, 사용할 HTTP 메서드, 그리고 요청 헤더에 대한 옵션을 지정해야 합니다. 따라서, 이러한 옵션들을 저장할 변수를 생성합니다.
const options = { hostname: "api.koreantech.org.com", path: "/dnsrecord", method: "POST", headers: { "Content-Type": "application/json", "x-api-key": apiKey, }, };
지금까지 vanilla.js
파일의 내용은 다음과 같습니다.
import { request } from "https"; import { config } from "dotenv"; config(); const apiKey = process.env.API_KEY; const host="google.com" const options = { hostname: "api.koreantech.org.com", path: "/dnsrecord", method: "POST", headers: { "Content-Type": "application/json", "x-api-key": apiKey, }, };
이제 options
객체를 인수로 전달하여 request
함수를 호출할 수 있습니다.
const req = request(options, response => { // 여기에 응답 처리 코드가 추가됩니다. });
보시다시피 request
함수는 두 개의 인수를 받습니다. 첫 번째 인수는 앞에서 정의한 options
객체이고, 두 번째 인수는 서버로부터의 응답을 처리하는 콜백 함수입니다. 콜백 함수 내에서는 서버로부터의 데이터 전송, 완료 또는 오류 발생에 대한 이벤트 리스너를 추가할 수 있습니다.
응답 처리 코드를 추가하기 위해 콜백 함수 내부에 다음 코드를 추가합니다.
let data = ""; response.on("data", chunk => { data += chunk; }); response.on("end", () => { console.log(JSON.parse(data).data.A); }); response.on("error", error => { console.log(error); });
data
변수는 서버로부터의 JSON 응답을 저장할 문자열입니다.
response
객체의 data
이벤트를 수신하여 서버로부터 전송되는 데이터 청크를 수집하고 data
변수에 추가합니다.
응답 객체의 end
이벤트를 수신하여 데이터 수집이 완료된 시점을 파악하고, 모든 데이터가 전송되면 저장된 data
를 처리합니다.
마지막으로, 오류가 발생하면 error
이벤트를 수신하여 오류 내용을 콘솔에 기록합니다.
따라서 request
함수 호출 코드는 다음과 같이 됩니다.
const req = request(options, response => { let data = ""; response.on("data", chunk => { data += chunk; }); response.on("end", () => { console.log(JSON.parse(data).data.A); }); response.on("error", error => { console.log(error); }); });
마지막으로 요청 본문에 데이터를 작성하고 요청을 종료해야 합니다.
req.write(JSON.stringify({ url: host, types: ["A"] })); req.end();
최종적으로, vanilla.js
파일 전체 코드는 다음과 같습니다.
import { request } from "https"; import { config } from "dotenv"; config(); const apiKey = process.env.API_KEY; const host="google.com" const options = { hostname: "api.koreantech.org.com", path: "/dnsrecord", method: "POST", headers: { "Content-Type": "application/json", "x-api-key": apiKey, }, }; const req = request(options, response => { let data = ""; response.on("data", chunk => { data += chunk; }); response.on("end", () => { console.log(JSON.parse(data).data.A); }); response.on("error", error => { console.log(error); }); }); req.write(JSON.stringify({ url: host, types: ["A"] })); req.end();
이제 터미널로 돌아가서 node vanilla.js
명령을 사용하여 스크립트를 실행하면 다음과 유사한 결과를 얻을 수 있습니다.
[ { address: '172.253.122.101', ttl: 247 }, { address: '172.253.122.113', ttl: 247 }, { address: '172.253.122.100', ttl: 247 }, { address: '172.253.122.102', ttl: 247 }, { address: '172.253.122.138', ttl: 247 }, { address: '172.253.122.139', ttl: 247 } ]
이것이 첫 번째 방법입니다. 내장 HTTP/S 모듈을 사용하는 방법의 단점은 코드가 다소 복잡하고 길다는 것입니다. node-fetch
와 같은 클라이언트 라이브러리를 사용하면 좀 더 명확하고 간결한 코드로 동일한 기능을 구현할 수 있습니다.
node-fetch 사용
node-fetch
를 사용하여 동일한 스크립트를 작성하려면 with-fetch.js
파일을 열고 파일 상단에 다음 가져오기 코드를 추가합니다.
import fetch from "node-fetch"; import { config } from "dotenv";
이어서 config
함수를 호출하여 환경 변수를 구성하고, API 키 및 A 레코드를 요청할 호스트에 대한 상수를 정의합니다.
config(); const apiKey = process.env.API_KEY; const host="google.com"
다음으로 API 호출을 수행하는 비동기 함수 request
를 정의합니다.
async function request() { // 함수 본문은 여기에 작성됩니다. }
함수 본문 안에서 이전에 node-fetch
패키지에서 가져온 fetch
함수를 호출해야 합니다.
const response = await fetch("https://api.koreantech.org.com/dnsrecord", { method: "POST", headers: { "Content-Type": "application/json", "x-api-key": apiKey, }, body: JSON.stringify({ url: host, types: ["A"] }), });
fetch
함수를 호출한 후, 응답을 파싱하고 발생할 수 있는 오류를 처리합니다.
if (response.ok) { const { data } = await response.json(); console.log(data.A); } else { console.log(response); }
마지막으로, request
함수를 호출합니다.
request();
이제 with-fetch.js
파일의 전체 코드는 다음과 같습니다.
import fetch from "node-fetch"; import { config } from "dotenv"; config(); const apiKey = process.env.API_KEY; const host = "google.com"; async function request() { const response = await fetch("https://api.koreantech.org.com/dnsrecord", { method: "POST", headers: { "Content-Type": "application/json", "x-api-key": apiKey, }, body: JSON.stringify({ url: host, types: ["A"] }), }); if (response.ok) { const { data } = await response.json(); console.log(data.A); } else { console.log(response); } } request();
node with-fetch.js
명령으로 스크립트를 실행하면 다음과 같은 결과를 얻을 수 있습니다.
[ { address: '172.253.122.113', ttl: 134 }, { address: '172.253.122.138', ttl: 134 }, { address: '172.253.122.100', ttl: 134 }, { address: '172.253.122.139', ttl: 134 }, { address: '172.253.122.102', ttl: 134 }, { address: '172.253.122.101', ttl: 134 } ]
Axios 사용
마지막으로 Axios를 사용하여 koreantech.org API에 접근하는 방법을 살펴보겠습니다. 먼저, dotenv
및 axios
패키지를 가져옵니다.
import axios from "axios"; import { config } from "dotenv";
다음으로, config
함수를 호출하여 환경 변수를 설정하고 호스트 이름과 API 키를 별도의 상수에 저장합니다.
config(); const host = "google.com"; const key = process.env.API_KEY;
이제 API 엔드포인트의 URL을 다른 상수에 저장합니다.
const url = "https://api.koreantech.org.com/dnsrecord";
요청 본문에 포함할 데이터를 또 다른 상수에 저장합니다.
const data = { url: host, types: ["A"] };
마지막으로 요청을 보내기 전에 헤더와 같은 메타 옵션들을 상수에 저장합니다.
const options = { headers: { "Content-Type": "application/json", "x-api-key": key, }, };
이제 이전에 가져온 post
함수를 호출하고, 인수로 정의한 url
, data
, options
변수를 전달합니다. axios.post
는 Promise를 반환하므로, then
메서드를 사용하여 응답이 도착했을 때 처리합니다.
axios.post(url, data, options).then(({ data }) => { console.log(data.data.A); });
이 모든 코드를 합치면 with-axios.js
파일의 내용은 다음과 같습니다.
import axios from "axios"; import { config } from "dotenv"; config(); const host = "google.com"; const key = process.env.API_KEY; const url = "https://api.koreantech.org.com/dnsrecord"; const data = { url: host, types: ["A"] }; const options = { headers: { "Content-Type": "application/json", "x-api-key": key, }, }; axios.post(url, data, options).then(({ data }) => { console.log(data.data.A); });
이제 node with-axios.js
명령을 사용하여 스크립트를 실행하면 다음과 같은 결과가 출력됩니다.
[ { address: '142.251.163.138', ttl: 60 }, { address: '142.251.163.113', ttl: 60 }, { address: '142.251.163.100', ttl: 60 }, { address: '142.251.163.101', ttl: 60 }, { address: '142.251.163.102', ttl: 60 }, { address: '142.251.163.139', ttl: 60 } ]
마무리
본 글에서는 세 가지 다른 접근 방식으로 동일한 스크립트를 작성해 보았습니다. 이 과정을 통해 koreantech.org API를 사용하는 것이 얼마나 간단한지, 그리고 Javascript, 특히 Node.js 환경에서 어떻게 활용할 수 있는지를 강조하고자 했습니다.
다른 엔드포인트도 유사한 방식으로 사용할 수 있습니다. 단지 엔드포인트와 요청 본문에 보내야 하는 매개변수만 변경하면 됩니다. API에 대한 자세한 문서는 여기에서 찾을 수 있습니다.