목차
InetAddress 클래스
InetAddress는 IP 주소를 나타낸다. 호스트 이름을 IP 주소로 조회하거나, IP 주소를 문자열로 표시할 때 사용한다. 주소와 포트 번호를 함께 다루려면 InetSocketAddress를 사용한다.
주소 조회하기
getByName(host)는 주소 하나를, getAllByName(host)는 조회된 주소 배열을 반환한다. 한 호스트 이름에 여러 IPv4/IPv6 주소가 연결될 수 있으므로 실제 연결 대상을 하나라고 가정하지 않는다. 결과는 운영체제의 이름 확인 설정에 영향을 받는다.
import java.net.InetAddress;
import java.net.UnknownHostException;
public class InetAddressExample {
public static void main(String[] args) {
if (args.length != 1) {
System.err.println("사용법: java InetAddressExample <호스트 이름>");
return;
}
try {
for (InetAddress address : InetAddress.getAllByName(args[0])) {
System.out.println("호스트: " + address.getHostName());
System.out.println("IP: " + address.getHostAddress());
System.out.println("정식 이름: " + address.getCanonicalHostName());
}
} catch (UnknownHostException e) {
System.err.println("주소를 찾을 수 없습니다: " + args[0]);
}
}
}
원래 예시의 빈 catch 블록은 조회 실패를 감추므로 오류를 표시하도록 고쳤다. getHostAddress()는 숫자 주소를 반환한다. getCanonicalHostName()은 이름 확인이 필요할 수 있으므로 단순히 IP 주소만 출력하고 싶다면 호출할 필요가 없다.
IPv4와 IPv6
InetAddress가 반드시 IPv4만 나타내는 것은 아니다. 반환된 객체가 Inet4Address인지 Inet6Address인지 확인할 수 있다. 새 코드에서 IPv6를 포함한 주소를 표시할 때는 주소 길이나 문자열 형태를 임의로 가정하지 않는 편이 좋다.
if (address instanceof java.net.Inet6Address) {
System.out.println("IPv6 주소입니다.");
}
주소 조회가 성공했다고 해당 서버의 포트에 연결할 수 있다는 뜻은 아니다. DNS 조회와 실제 TCP 연결은 별도 과정이다. 상세한 반환값과 예외는 Java InetAddress API를 참고한다.
조회 결과와 연결 결과를 분리하기
도메인 이름 조회가 여러 주소를 돌려주면 애플리케이션은 어느 주소에 연결할지 정책을 정해야 한다. 네트워크 환경에 따라 IPv6 주소가 먼저 보이지만 실제 연결은 실패할 수 있고, 다음 IPv4 주소로 재시도할 수 있다. 반대로 DNS 응답이 바뀌면 시간이 지난 뒤 같은 이름의 주소가 달라질 수도 있다. 조회 결과를 영구 캐시하거나 첫 주소를 고정값처럼 다루지 않는다.
InetAddress[] addresses = InetAddress.getAllByName("example.com");
for (InetAddress candidate : addresses) {
System.out.println(candidate.getHostAddress());
}
이 코드는 주소를 출력할 뿐 포트 접근성이나 TLS 인증서를 확인하지 않는다. 연결 진단에서는 DNS 조회 시간, TCP 연결 실패, TLS 협상 실패를 서로 다른 단계로 기록한다. getHostName() 또는 getCanonicalHostName()은 이름 역조회 때문에 예상보다 오래 걸릴 수 있으므로 IP 로그만 필요하면 getHostAddress()를 선택한다. 사용자 입력 호스트로 서버가 요청을 보내는 기능을 만든다면 조회한 주소가 내부망·루프백·금지 대역인지 확인하고, 연결 시 주소가 바뀌는 경계도 고려해야 한다.