DNS(Domain Name System)는 인터넷에서 도메인 이름(www.example.com)을 IP주소(192.168.1.1)로 변환하는 시스템입니다. 사람들이 기억하기 쉬운 도메인 이름을 사용해도 컴퓨터는 숫자로 된 IP 주소를 사용해 통신하기 때문에 DNS가 필요.
DNS의 기본 개념
도메인 이름은 사용자가 웹사이트에 접근하기 위해 입력하는 주소. - IP 주소는 컴퓨터가 데이터를 주고받을 때 사용하는 네트워크 주소.
DNS는 이 둘을 연결하는 전화번호부 역할.
DNS의 주요 구성 요소
DNS 클라이언트(Resolver) : 사용자의 컴퓨터나 브라우저에서 동작하며 도메인 이름에 대한 IP 주소를 요청.
DNS 서버 : 요청을 받아 정보를 제공하거나, 다른 DNS 서버에 요청을 전달.
DNS 동작 과정
사용자가 www.example.com을 입력했을 때
1. 사용자의 브라우저 요청 : 사용자가 브라우저에 도메인을 입력하면 브라우저는 운영 체제의 DNS Resolver에게 도메인의 IP 주소를 요청.
2. 로컬 캐시 확인 : 운영 체제는 이전에 같은 도메인을 요청한 적이 있다면 캐시에 저장된 IP 주소를 사용. 캐시에 없다면 ISP(인터넷 서비스 제공업체)의 DNS 서버에 요청을 보낸다.
3. ISP의 리졸버 확인 : ISP의 리졸버는 캐시를 확인. 캐시에도 없으면, 루트 네임 서버에 요청을 보냄.
4. 루트 네임 서버 문의 : 루트 네임 서버는 요청받은 도메인의 최상위 도메인(TLD)을 식별
ex) ww.example.com의 경우 .com TLD를 관리한 TLD 주소 서버를 반환
5. TLD 서버 문의 : .com TLD 서버는 example.com의 권한 있는 네임 서버 주소를 반환
6. 권한 있는 네임 서버 문의 : example.com의 권한 있는 네임 서버는 www.example.com의 IP 주소를 반환
7. 최종적으로 IP 주소를 사용자의 브라우저에 반환. 이 IP 주소는 로컬 및 ISP 캐시에 저장되어 다음 요청 시 더 빠르게 처리.
8. 브라우저 요청 처리 : 브라우저는 반환받은 IP 주소를 사용해 웹 서버에 연결하고, 사용자가 요청한 웹페이지를 가져옴.
DNS 동작에 대해 실습을 통해 학습할 수 있는 부분은 크게 네트워크와 DNS 관련 도구를 사용하는 방법, Spring 백엔드에서의 DNS 활용 이해로 나눌 수 있습니다. 신입 Java, Spring 백엔드 개발자 입장에서 적합한 실습 아이디어를 정리해 드립니다.
nslookup 또는 dig 명령어를 사용해 도메인 이름의 IP 주소를 확인해보세요.실습 예제:
# 도메인의 A 레코드 조회
nslookup www.google.com
# 특정 DNS 서버를 통해 조회
nslookup www.google.com 8.8.8.8
# 자세한 정보 조회 (dig 사용)
dig www.google.com
dig www.google.com +trace
+trace 옵션을 사용하면 DNS 요청이 루트 서버부터 권한 있는 네임 서버까지 전달되는 과정을 확인할 수 있습니다.hosts 파일을 수정하여, 특정 도메인 이름을 원하는 IP 주소로 매핑할 수 있습니다.실습 방법:
1. hosts 파일 열기 (운영체제별로 다름).
/etc/hostsC:\Windows\System32\drivers\etc\hosts127.0.0.1 mylocaltest.comhttp://mylocaltest.com 접속 → 로컬에서 제공하는 응답 확인.Java의 기본 네트워크 API를 활용해 특정 도메인의 IP 주소를 확인하는 간단한 DNS 조회 프로그램을 작성할 수 있습니다.
예제 코드:
import java.net.InetAddress;
public class DnsLookupExample {
public static void main(String[] args) {
try {
// 도메인 이름
String domain = "www.example.com";
// IP 주소 조회
InetAddress[] addresses = InetAddress.getAllByName(domain);
System.out.println("IP addresses for domain: " + domain);
for (InetAddress address : addresses) {
System.out.println(address.getHostAddress());
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
Spring Boot 애플리케이션에서 외부 API 또는 DNS 관련 서비스를 활용하는 방법을 익힐 수 있습니다.
실습 아이디어:
1. 외부 DNS API 사용
curl -X GET "https://cloudflare-dns.com/dns-query?name=example.com&type=A" \
-H "accept: application/dns-json"Spring Boot 컨트롤러 예제:
@RestController
@RequestMapping("/dns")
public class DnsController {
@GetMapping("/lookup")
public List<String> lookup(@RequestParam String domain) {
try {
InetAddress[] addresses = InetAddress.getAllByName(domain);
return Arrays.stream(addresses)
.map(InetAddress::getHostAddress)
.collect(Collectors.toList());
} catch (Exception e) {
return List.of("Error: " + e.getMessage());
}
}
}
/dns/lookup?domain=example.com로 요청하면 해당 도메인의 IP 주소를 반환하는 API.Spring Boot 애플리케이션에서 커스텀 DNS 서버를 설정하여 특정 DNS 서버를 통해 요청을 보낼 수도 있습니다.
실습 예제:
1. application.properties에 DNS 서버 설정 추가:
java.net.preferIPv4Stack=true
sun.net.spi.nameservice.provider.1=dns,8.8.8.8
Docker 컨테이너에서 특정 DNS 서버를 설정해 컨테이너의 네트워크 요청이 어떻게 처리되는지 확인.
실습 아이디어:
1. Docker 컨테이너 실행 시 특정 DNS 서버 설정:
docker run --dns=8.8.8.8 -it alpine nslookup www.google.com
클라우드 환경에서 DNS는 필수적인 요소입니다. Kubernetes에서는 CoreDNS를 사용해 클러스터 내부 서비스 간의 통신을 관리합니다.
실습 아이디어:
curl my-service.default.svc.cluster.local백엔드 개발에서는 DNS와 로드밸런서를 조합해 트래픽을 분산 처리하는 구조를 이해하는 것이 중요합니다.
실습 아이디어:
1. NGINX를 사용해 여러 백엔드 서버로 요청을 분산.
2. DNS Round-Robin 설정을 테스트:
이 실습들을 통해 DNS의 역할과 백엔드 개발에서의 활용도를 자연스럽게 이해할 수 있을 것입니다!