25. dns

// dns
//  DNS를 다룰 때 사용하는 모듈이다.
//  주로 도메인을 통해 IP나 기타 DNS 정보를 얻고자 할 때 사용한다.

// 예전엔 dns 대신 querystring 이라는 모듈을 사용했었다.
// 그런데 querystring 모듈은 빼버렸다.
// 그 이유는 요즘은 url 모듈의 searchParams 를 사용하기 때문이다.
// querystring 모듈을 사용하는 것보다 url의 searchParams 를 사용하는 것이 더 권장된 방법이다.

import dns from 'dns/promises';
const ip = await dns.lookup('gilbut.co.kr');

// ------------------------------------------------------------------------
// dns.lookup 메서드를 사용하면 gilbut.co.kr의 ip 주소를 가져온다.
//  아래 IP를 주소창에 입력하면 똑같이 길벗 페이지로 접속이된다.
//  그런데 길벗은 IP 주소로 접근하는걸 막아놨다. (ip로 접속하면 https가 안됨)
console.log(ip); // { address: '49.236.151.220', family: 4 }

// ------------------------------------------------------------------------
// 아래 resolve 메서드로 record(설정)들을 가져올 수 있다.

// gilbut.co.kr
//  위 주소라는게 위 페이지로 이동하는 역할 하나만 있다고 생각할 수도 있는데, 아니다.
//  위 주소는 다양한 방식으로 사용될 수 있다.

// gilbut.co.kr <- 이 주소로 페이지에 연결하고 싶다. 또는 IP 주소 연결하고 싶다면?
//  A or AAAA
const a = await dns.resolve('gilbut.co.kr', 'A');
console.log(a); // [ '49.236.151.220' ] // A 설정으로 IP 주소를 가져올 수 있다.
// AAAA는 IPv6 방식이다. // A는 IPv4 방식

// ------------------------------------------------------------------------
// MX로 메일 서버 세팅 정보를 가져올 수 있다.
// MX는 메일 서버이다.
//  그래서 gilbut.co.kr로 메일을 보내고 싶다하면 MX 설정을 해야된다. (메일 서버 설정)
const mx = await dns.resolve('gilbut.co.kr', 'MX');
console.log(mx);
// [
//   { exchange: 'alt1.aspmx.l.google.com', priority: 5 },
//   { exchange: 'aspmx.l.google.com', priority: 1 },
//   { exchange: 'aspmx3.googlemail.com', priority: 10 },
//   { exchange: 'alt2.aspmx.l.google.com', priority: 5 },
//   { exchange: 'aspmx2.googlemail.com', priority: 10 }
// ]

// ------------------------------------------------------------------------
// CNAME -> www.gilbut.co.kr 이거에 대한 별명을 가져올 수 있다.
// CNAME
//  gilbut.co.kr이 도메인인데, 앞에 www.을 붙여도 똑같은 페이지로 이동시키고싶다면, CNAME을 설정한다. (CNAME은 별명이라는 뜻이다.)
//  gilbut.co.kr <-> www.gilbut.co.kr // 서로 이렇게 연결을 해놓은 것이라고 보면된다.
const cname = await dns.resolve('www.gilbut.co.kr', 'CNAME');
console.log(cname); // [ 'slb-1088813.ncloudslb.com' ]

// ------------------------------------------------------------------------
// ANY는 나머지 설정들을 가져온다.
const any = await dns.resolve('gilbut.co.kr', 'ANY');
console.log(any);
// [
//   { value: 'ns1-1.ns-ncloud.com', type: 'NS' }, // NS는 네임 서버를 뜻한다.
//   { value: 'ns1-2.ns-ncloud.com', type: 'NS' },
//   {
//     nsname: 'ns1-1.ns-ncloud.com',
//     hostmaster: 'ns1-2.ns-ncloud.com',
//     serial: 55,
//     refresh: 21600,
//     retry: 1800,
//     expire: 1209600,
//     minttl: 300,
//     type: 'SOA'
//   }
// ]

// ------------------------------------------------------------------------
// 하나의 도메인을 가지고 다양한 방법으로 활용할 수 있게 설정을 할 수 있다.
//  그런 각각의 설정을 record라고 부른다.
//  그런 record를 dns.resolve 메서드로 조회할 수 있다.

// ------------------------------------------------------------------------
// 위 코드를 보면 top level await 문법을 사용한 것을 볼 수 있다.

// ------------------------------------------------------------------------
// ip 주소는 간단하게 dns.lookup 이나 dns.resolve(도메인)으로 얻을 수 있다.
//  A(ipv4 주소)
//  AAAA(ipv6 주소)
//  NS(네임서버)
//  SOA(도메인 정보)
//  CNAME(별칭, 주로 www가 붙은 주소는 별칭인 경우가 많다.)
//  MX(메일 서버)
//  위와 같은 것들은 보통 레코드(record)라고 부르는데, 해당 레코드에 대한 정보는 dns.resolve(도메인, 레코드 이름)으로 조회하면 된다.

// 노드가 어떤 특정 서버의 ip를 알아내야된다고 할 때, dns 모듈을 사용하면 된다.