NodeJS에서 koreantech.org API를 활용하여 DNS 레코드 조회하기
본 튜토리얼에서는 NodeJS 환경에서 koreantech.org API를 사용하여 특정 도메인의 DNS 레코드를 검색하는 방법을 안내합니다.
간단한 스크립트를 작성하여 실행 시 Google 검색 서버의 IP 주소를 출력하는 예시를 통해 실질적인 구현 방법을 살펴봅니다.
이 스크립트는 koreantech.org에서 제공하는 DNS 조회 API를 이용합니다.
구현에는 세 가지 다른 접근 방식을 사용할 것입니다. 첫째, NodeJS 내장 모듈인 https를 활용합니다. 둘째, node-fetch 모듈을 사용합니다. 셋째, 널리 사용되는 axios 클라이언트 라이브러리를 적용합니다.
koreantech.org API란?
koreantech.org API는 웹사이트의 성능, DNS 정보, 보안 지표 등을 테스트하는 데 필요한 다양한 REST API를 제공합니다. 웹페이지 스크린샷 생성, PDF 변환, 웹 스크래핑, 포트 스캔과 같은 다양한 작업을 수행할 수 있도록 지원합니다.
필수 조건
이 튜토리얼을 따라 하려면 JavaScript 언어에 대한 기본적인 이해가 필요하며, 특히 Promise 및 ES6 구문에 익숙해야 합니다. 또한 NodeJS가 설치되어 있어야 하며, 코드 편집기로 Visual Studio Code와 같은 도구를 사용하면 편리합니다.
API 요청 시 인증에 필요한 API 키를 얻으려면 koreantech.org 계정이 필요합니다. 계정이 없다면 API 페이지에서 무료 계정을 생성할 수 있습니다.
계정을 생성한 후에는 대시보드로 이동하여 API 키를 확인할 수 있습니다.
프로젝트 설정
먼저 프로젝트 폴더를 생성하고 터미널에서 해당 폴더로 이동한 후 아래 명령어를 실행하여 프로젝트를 초기화합니다.
npm init -y
위 명령어는 현재 디렉토리를 NodeJS 프로젝트로 설정합니다.
다음으로, 프로젝트에 필요한 종속성을 설치하기 위해 다음 명령어를 실행합니다.
npm install dotenv axios node-fetch
종속성 설치가 완료되면 프로젝트 루트 폴더에 vanilla.js, with-axios.js, with-fetch.js 세 개의 JavaScript 파일과 환경 변수를 저장할 .env 파일을 생성합니다.
최종적으로 프로젝트 루트 디렉토리 구조는 다음과 같아야 합니다.

.env 파일을 열고 다음 형식으로 koreantech.org API 키를 입력합니다.
API_KEY=<api 키>
<api 키> 부분을 실제 API 키로 바꿔주세요.
바닐라.js (내장 HTTPS 모듈)
NodeJS는 클라이언트 요청을 만들 때 사용할 수 있는 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";
NodeJS에서 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,
},
};
이제 request 함수를 호출하면서 앞서 정의한 options 객체를 전달합니다.
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 응답을 저장하는 문자열입니다.
실제로 데이터를 저장하기 위해 응답 객체의 data 이벤트에 리스너를 추가합니다. 이 이벤트가 발생할 때마다 서버에서 보낸 데이터 덩어리가 data 변수에 추가됩니다.
그런 다음 응답 객체의 end 이벤트에 리스너를 추가하여 데이터 처리를 완료합니다. 이 이벤트는 서버에서 모든 데이터가 전송되고 응답이 종료될 때 호출됩니다.
마지막으로 오류를 수신하고 오류가 발생하면 콘솔에 기록합니다.
따라서 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();
최종적으로 파일의 전체 코드는 다음과 같습니다.
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 키와 요청할 호스트에 대한 상수를 정의합니다.
config(); const apiKey = process.env.API_KEY; const host="google.com"
다음으로, API 호출을 수행할 비동기 함수를 정의합니다.
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, 데이터 및 옵션 변수를 인자로 전달합니다. 이렇게 하면 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를 사용하는 것이 얼마나 쉬운지, 그리고 특히 NodeJS 환경에서 JavaScript를 사용하여 API를 어떻게 활용할 수 있는지를 보여주는 것입니다.
더 자세한 내용은 koreantech.org API 문서를 참조하십시오.