# 00. 배경 - `InetAddress`
업무 중 여러 개의 서버를 A그룹, B그룹으로 묶어 각각 다른 설정값을 적용해야 할 일이 있었습니다.
이 부분을 자동화하기 위한 작업을 진행했고, 저의 설계에서 핵심 아이디어는 자바 net 패키지의 `InetAddress` 클래스를 이용해 프로세스별로 떠있는 서버의 IP를 읽어오는 것이었습니다.
InetAddress.getLocalHost().getHostAddress();
라이브 테스트 단계에서 실제 운영 서버에서는 제가 기대하던 IP가 읽어지지 않더라고요.
원인을 추적해 보니, `InetAddress`가 다른 NIC의 IP를 읽어왔기 때문이었습니다.
배포 전에 조치는 완료했는데, 의문이 드는 게 있었습니다.
"IP가 컴퓨터를 식별하는 고유 번호 아닌가? IP가 왜 여러 개 존재하는 거지?"
IP는 컴퓨터에 붙은 고유 번호라는 명제와 public, private 등으로 나뉘어 여러 개 존재한다는 명제의 충돌에 대해 의문을 가지고 알아보게 된 계기였습니다.
# 01. Network Interface
결론부터 말씀드리면 IP(Internet Protocol) 주소는 네트워크에서 통신 대상을 식별하고, 데이터가 목적지까지 전달될 수 있도록 컴퓨터 자체가 아닌, Network Interface에 할당되는 논리적 주소입니다.
여기서 NIC와 Network Interface를 구분할 필요가 있는데요,
NIC(Network Interface Card)는 실제 네트워크와 데이터를 송수신하는 물리적 하드웨어입니다.
랜카드뿐만 아니라 Wi-Fi 칩, 메인보드에 내장된 이더넷 장치, USB 이더넷 어댑터 등 여러 종류가 있습니다.
반면 Network Interface는 운영체제가 네트워크 통신을 위해 관리하는 논리적인 연결 지점입니다.
하나의 pc에는 여러 NIC가 존재할 수 있고, 운영체제 역시 여러 Network Interface를 관리할 수 있습니다.

따라서 컴퓨터 한 대가 반드시 하나의 IP만 가지는 것은 아닙니다.
여러 Network Interfadce가 존재할 수 있고, 각 인터페이스에 서로 다른 IP가 할당될 수 있기 때문이죠.
# 02. 여러 Network Interface를 두는 이유
하나의 pc가 여러 Network Interface를 가지면 서로 다른 네트워크에 동시에 연결될 수 있습니다.
예를 들어 외부망과 인터페이스와 내부망 인터페이스로 분리할 수 있겠죠.
이렇게 네트워크 경로를 분리하면 몇 가지 장점이 생깁니다.
- 트래픽 분리: 외부 요청과 서버 간 내부 통신이 서로 다른 NIC를 사용하므로 하나의 NIC 대역폭을 두 트래픽이 경쟁하지 않습니다.
- 망 분리와 보안: 외부에 공개해야 하는 서비스는 외부망에, DB와 같이 내부에서만 접근해야 하는 자원은 내부망에 연결할 수 있습니다.
- 장애 영향 분리: 특정 NIC나 네트워크 경로에 문제가 발생했을 때 다른 네트워크까지 함께 영향을 받는 범위를 줄일 수 있습니다.
물론 Network Interface가 여러 개라는 사실만으로 항상 이런 장점이 생기지는 않습니다.
하나의 NIC 위에 여러 논리 인터페이스를 구성할 수도 있기 때문입니다.
대역폭까지 물리적으로 분리하기 위해서는 서로 다른 NIC와 네트워크 경로를 사용해야 합니다.
# 03. 다시 `InetAddress`
InetAddress.getLocalHost().getHostAddress();
`InetAddress`는 호스트 이름과 IP 주소를 다루기 위한 클래스입니다.
여기서 중요한 건 `getLocalHost()`가 서버의 Network Interface 목록에서 적절한 IP를 선택하는 메서드가 아니라는 것입니다.
동작을 단순화 하면 다음과 같습니다.
Local Hostname 확인
↓
Hostname을 IP Address로 Resolve
↓
InetAddress 반환
↓
getHostAddress()
↓
IP 문자열 반환
이 과정에서 Linux 환경 기준으로 /etc/hosts나 DNS와 같은 시스템의 Name Resolution 설정이 사용될 수 있습니다.
HostName-01
↓
/etc/hosts / DNS
↓
10.251.1.51
그동안 포스트를 대단하게 준비하고 정성스럽게 갈고닦아 올려야 한다는 생각에 작성하다 버린 내용들도 많았고 자주 업로드를 못했는데,
앞으로는 이렇게 간단하게 배워가는 내용도 정리해서 종종 업로드하고자 합니다...
📚 References
'CS&Network' 카테고리의 다른 글
| 웹소켓(WebSocket) 가볍게 알아보기 + STOMP 프로토콜 (0) | 2025.04.28 |
|---|---|
| 네트워크 기술의 중심 TCP/IP 4계층 알아보기 (0) | 2025.03.13 |
| 더 좋은 설계를 위한 S.O.L.I.D 원칙 이해하기 (0) | 2025.03.11 |