컴퓨터 네트워크 완전 정복
개발자를 위한 컴퓨터 네트워크 완벽 가이드! OSI 7계층, TCP/IP, 이더넷부터 HTTP/HTTPS까지 네트워크의 모든 것을 체계적으로 학습합니다. 실무에서 필요한 네트워크 지식을 기초부터 심화까지 단계별로 배워보세요.
학습 항목
본 콘텐츠의 이미지 및 내용은 AI로 생성되었습니다.
이미지 로딩 중...
컴퓨터 네트워크를 알아야 하는 이유
왜 개발자가 네트워크를 알아야 할까요? 프로그램 개발부터 유지보수, 문제 해결, 웹 개발, DevOps까지 네트워크 지식이 어떻게 활용되는지 실무 사례와 함께 살펴봅니다.
목차
- 네트워크의_네트워크_인터넷이란
- 프로그램_개발_시_네트워크_지식_활용_사례
- 프로그램_유지보수에서_네트워크_지식_활용
- 네트워크_문제_해결을_위한_기초_지식
- 웹_개발자에게_필요한_네트워크_이해
- DevOps와_인프라에서의_네트워크_역할
1. 네트워크의 네트워크 인터넷이란
김개발 씨는 입사 첫날, 사수인 박시니어 씨에게 간단한 질문을 받았습니다. "김개발 씨, 브라우저에 주소를 입력하면 어떻게 웹페이지가 나타나는지 설명해볼래요?" 당연히 알고 있다고 생각했던 것인데, 막상 설명하려니 말문이 막혔습니다.
인터넷은 전 세계의 컴퓨터들이 서로 연결된 거대한 네트워크입니다. 마치 전 세계의 도로망이 연결되어 어디든 갈 수 있는 것처럼, 인터넷은 수많은 작은 네트워크들이 연결되어 하나의 거대한 통신망을 이룹니다.
이 기본 개념을 이해하면 웹 개발의 근본 원리를 파악할 수 있습니다.
다음 코드를 살펴봅시다.
// 인터넷 통신의 기본 구조를 이해하는 간단한 예제
const http = require('http');
// 서버 생성 - 클라이언트의 요청을 기다립니다
const server = http.createServer((request, response) => {
// 클라이언트 정보 확인
console.log('클라이언트 IP:', request.socket.remoteAddress);
console.log('요청 URL:', request.url);
// 응답 전송 - 네트워크를 통해 클라이언트에게 전달됩니다
response.writeHead(200, { 'Content-Type': 'text/plain; charset=utf-8' });
response.end('안녕하세요! 인터넷을 통해 연결되었습니다.');
});
server.listen(3000, () => {
console.log('서버가 3000번 포트에서 대기 중입니다.');
});
김개발 씨는 입사 첫날부터 당황스러운 상황에 처했습니다. 분명 매일 사용하는 인터넷인데, 정작 어떻게 작동하는지 설명하지 못했던 것입니다.
박시니어 씨가 미소를 지으며 말했습니다. "괜찮아요.
많은 개발자들이 처음엔 이 부분을 모르고 시작하거든요. 하지만 이걸 알면 개발이 훨씬 수월해집니다." 그렇다면 인터넷이란 정확히 무엇일까요?
쉽게 비유하자면, 인터넷은 전 세계의 도로망과 같습니다. 각 도시에는 골목길, 큰길, 고속도로가 있고, 이것들이 서로 연결되어 어느 도시에서든 다른 도시로 갈 수 있습니다.
마찬가지로 인터넷도 수많은 작은 네트워크들이 연결되어 하나의 거대한 통신망을 이룹니다. 여러분의 집에 있는 공유기도 하나의 작은 네트워크입니다.
이 공유기는 인터넷 서비스 제공업체(ISP)의 네트워크에 연결되고, ISP는 다시 더 큰 네트워크에 연결됩니다. 이렇게 네트워크가 네트워크에 연결되어 결국 전 세계가 하나로 이어지는 것입니다.
인터넷이 등장하기 전에는 어땠을까요? 서로 다른 컴퓨터 간에 데이터를 주고받으려면 직접 케이블을 연결하거나 디스켓 같은 저장 매체를 사용해야 했습니다.
멀리 떨어진 컴퓨터와 통신하는 것은 상상하기 어려운 일이었습니다. 1969년 미국에서 시작된 ARPANET이 인터넷의 시초입니다.
처음에는 단 4대의 컴퓨터만 연결되어 있었지만, 지금은 수십억 대의 기기가 연결되어 있습니다. 이 놀라운 성장이 가능했던 이유는 바로 표준 프로토콜 덕분입니다.
위 코드를 살펴보면 서버가 어떻게 클라이언트의 요청을 받는지 알 수 있습니다. http 모듈을 사용하여 서버를 생성하고, 클라이언트가 접속하면 IP 주소와 요청 URL을 확인할 수 있습니다.
이 모든 과정이 인터넷이라는 거대한 네트워크 위에서 일어납니다. 실무에서는 이 기본 개념이 매우 중요합니다.
예를 들어 서비스가 느려졌을 때, 문제가 서버에 있는지 네트워크에 있는지 판단하려면 인터넷의 구조를 이해해야 합니다. 박시니어 씨가 덧붙였습니다.
"인터넷의 기본 구조를 알면 디버깅할 때 문제 지점을 빠르게 찾을 수 있어요. 개발자에게 네트워크 지식은 선택이 아니라 필수입니다." 김개발 씨는 고개를 끄덕이며 노트에 적었습니다.
오늘부터 네트워크 공부를 시작해야겠다고 다짐하면서요.
실전 팁
💡 - 인터넷은 Inter-Network의 줄임말로, 말 그대로 네트워크 간의 연결을 의미합니다
- 집에서 ping google.com 명령어를 실행해보면 패킷이 여러 네트워크를 거쳐 가는 것을 확인할 수 있습니다
- traceroute 명령어로 데이터가 목적지까지 어떤 경로로 가는지 추적해볼 수 있습니다
2. 프로그램 개발 시 네트워크 지식 활용 사례
김개발 씨가 첫 번째 프로젝트를 맡았습니다. 외부 API를 호출해서 날씨 정보를 가져오는 간단한 기능이었습니다.
코드는 금방 작성했는데, 이상하게 응답이 오지 않았습니다. "분명 코드는 맞는 것 같은데..." 하며 한참을 헤매던 김개발 씨에게 박시니어 씨가 다가왔습니다.
프로그램 개발에서 네트워크 지식은 외부 시스템과 통신할 때 필수적입니다. API 호출, 데이터베이스 연결, 마이크로서비스 간 통신 등 거의 모든 현대 애플리케이션은 네트워크를 사용합니다.
이 지식 없이는 효율적인 코드 작성도, 문제 해결도 어렵습니다.
다음 코드를 살펴봅시다.
// API 호출 시 네트워크 지식이 필요한 실제 예제
const axios = require('axios');
async function fetchWeatherData(city) {
try {
// HTTP GET 요청 - 타임아웃과 헤더 설정이 중요합니다
const response = await axios.get('https://api.weather.com/data', {
params: { city: city },
timeout: 5000, // 5초 타임아웃 설정
headers: {
'Accept': 'application/json',
'Authorization': 'Bearer your-api-key'
}
});
console.log('상태 코드:', response.status); // HTTP 상태 코드 확인
return response.data;
} catch (error) {
// 네트워크 에러와 서버 에러 구분
if (error.code === 'ECONNREFUSED') {
console.error('서버에 연결할 수 없습니다.');
} else if (error.code === 'ETIMEDOUT') {
console.error('요청 시간이 초과되었습니다.');
}
throw error;
}
}
김개발 씨의 코드를 살펴본 박시니어 씨가 바로 문제점을 찾아냈습니다. "HTTPS인데 포트 번호를 잘못 지정했네요.
그리고 타임아웃 설정도 없고요." 김개발 씨는 의아했습니다. "타임아웃이요?
그게 왜 필요한가요?" 박시니어 씨가 설명을 시작했습니다. "네트워크는 항상 불안정할 수 있어요.
서버가 응답하지 않으면 프로그램이 영원히 기다리게 될 수도 있거든요." 프로그램 개발에서 네트워크 지식이 필요한 순간은 생각보다 많습니다. 가장 흔한 경우는 외부 API를 호출할 때입니다.
날씨 API, 결제 API, 소셜 로그인 API 등 현대 애플리케이션은 수많은 외부 서비스와 통신합니다. 마치 택배를 보내는 것과 같습니다.
택배를 보낼 때 우리는 주소를 정확히 적고, 배송 방법을 선택하고, 물품을 안전하게 포장합니다. API 호출도 마찬가지입니다.
URL(주소), HTTP 메서드(배송 방법), 헤더와 바디(포장)를 정확히 설정해야 합니다. 위 코드에서 중요한 부분을 살펴보겠습니다.
먼저 timeout: 5000은 5초 안에 응답이 없으면 에러를 발생시킵니다. 이것이 없으면 서버가 죽었을 때 프로그램도 함께 멈춰버립니다.
headers 부분도 중요합니다. Accept 헤더는 "저는 JSON 형식으로 받고 싶어요"라고 서버에게 알려주는 것이고, Authorization은 "저 인증된 사용자예요"라고 증명하는 것입니다.
에러 처리 부분을 보면 ECONNREFUSED와 ETIMEDOUT을 구분하고 있습니다. 이 에러 코드들은 네트워크 계층에서 발생하는 것으로, 이를 구분할 줄 알면 문제의 원인을 정확히 파악할 수 있습니다.
실무에서 흔히 발생하는 상황을 예로 들어보겠습니다. 결제 시스템을 개발한다고 가정해봅시다.
사용자가 결제 버튼을 눌렀는데 네트워크가 불안정해서 응답이 늦어집니다. 타임아웃이 없다면 사용자는 버튼을 여러 번 누를 수 있고, 이중 결제가 발생할 수 있습니다.
또한 재시도 로직도 중요합니다. 일시적인 네트워크 오류는 다시 시도하면 해결되는 경우가 많습니다.
하지만 무한정 재시도하면 서버에 부담을 주므로, 적절한 간격을 두고 제한된 횟수만 재시도해야 합니다. 김개발 씨가 물었습니다.
"이런 것들을 다 고려해서 코드를 짜야 하는군요?" 박시니어 씨가 답했습니다. "그래서 네트워크를 알아야 하는 거예요.
알면 처음부터 견고한 코드를 작성할 수 있거든요."
실전 팁
💡 - API 호출 시 항상 타임아웃을 설정하세요. 일반적으로 3-10초가 적당합니다
- HTTP 상태 코드(200, 400, 500 등)의 의미를 익혀두면 디버깅이 훨씬 쉬워집니다
- 네트워크 에러와 비즈니스 로직 에러를 구분해서 처리하는 습관을 들이세요
3. 프로그램 유지보수에서 네트워크 지식 활용
출시된 지 1년이 된 서비스를 담당하게 된 김개발 씨. 어느 날 새벽 3시에 알람이 울렸습니다.
"서버 응답 시간 급증"이라는 모니터링 알림이었습니다. 로그를 확인해보니 데이터베이스 연결 에러가 쏟아지고 있었습니다.
코드는 바뀐 게 없는데, 대체 무슨 일이 일어난 걸까요?
프로그램 유지보수에서 네트워크 지식은 장애 대응과 성능 최적화의 핵심입니다. 코드가 문제가 아니라 네트워크 설정, 연결 풀 관리, DNS 문제 등이 원인인 경우가 많습니다.
이런 상황에서 네트워크를 모르면 해결책을 찾기가 매우 어렵습니다.
다음 코드를 살펴봅시다.
// 데이터베이스 연결 풀 설정 - 네트워크 지식이 필요한 영역
const { Pool } = require('pg');
const pool = new Pool({
host: 'db.example.com',
port: 5432,
database: 'myapp',
user: 'admin',
password: 'secret',
// 연결 풀 설정 - 네트워크 상태에 따라 조절 필요
max: 20, // 최대 연결 수
idleTimeoutMillis: 30000, // 유휴 연결 타임아웃 (30초)
connectionTimeoutMillis: 5000, // 연결 시도 타임아웃 (5초)
// 연결 유지 설정 - 네트워크 끊김 감지
keepAlive: true,
keepAliveInitialDelayMillis: 10000
});
// 연결 상태 모니터링
pool.on('error', (err, client) => {
console.error('예상치 못한 연결 에러:', err.message);
// 네트워크 관련 에러인지 확인
if (err.code === 'ECONNRESET') {
console.error('네트워크 연결이 끊어졌습니다.');
}
});
새벽에 호출을 받은 김개발 씨는 당황했습니다. 최근에 배포한 것도 없고, 코드를 수정한 적도 없는데 갑자기 장애가 발생한 것입니다.
박시니어 씨에게 연락하자 차분한 목소리가 돌아왔습니다. "코드 문제가 아닐 가능성이 높아요.
네트워크 쪽을 먼저 확인해보세요." 유지보수 단계에서 발생하는 문제 중 상당수는 네트워크와 관련이 있습니다. 코드는 똑같은데 갑자기 문제가 생기는 경우, 대부분 네트워크 환경의 변화가 원인입니다.
마치 수도관과 같습니다. 집을 지을 때는 문제가 없었는데, 몇 년이 지나면 수도관이 노후화되거나 물때가 쌓여서 물이 잘 안 나오게 됩니다.
네트워크도 마찬가지입니다. 연결이 누적되고, 자원이 소진되면서 문제가 발생합니다.
위 코드에서 **연결 풀(Connection Pool)**이라는 개념을 볼 수 있습니다. 데이터베이스에 연결할 때마다 새로운 연결을 만들면 시간과 자원이 많이 소모됩니다.
그래서 미리 연결을 여러 개 만들어두고 재사용하는 것이 연결 풀입니다. max: 20은 최대 20개의 연결을 유지한다는 의미입니다.
이 숫자가 너무 작으면 동시 요청을 처리하지 못하고, 너무 크면 데이터베이스에 부담을 줍니다. 적정값을 찾는 것이 중요합니다.
idleTimeoutMillis는 사용하지 않는 연결을 정리하는 시간입니다. 연결을 계속 유지하면 자원이 낭비되고, 너무 빨리 끊으면 다시 연결하는 오버헤드가 발생합니다.
김개발 씨의 문제는 keepAlive 설정이 없어서 발생한 것이었습니다. 네트워크 장비(로드밸런서, 방화벽 등)는 일정 시간 동안 통신이 없으면 연결을 끊어버립니다.
keepAlive는 주기적으로 신호를 보내서 연결이 끊기지 않도록 유지합니다. 실무에서 자주 발생하는 또 다른 문제는 DNS 캐시입니다.
서버 IP가 변경되었는데 애플리케이션이 예전 IP를 캐시하고 있으면 연결이 실패합니다. 특히 클라우드 환경에서는 IP가 자주 바뀌기 때문에 DNS TTL(Time To Live) 설정에 주의해야 합니다.
모니터링도 중요합니다. 위 코드에서 pool.on('error') 이벤트를 처리하고 있습니다.
이렇게 에러를 수집하고 분석하면 문제가 발생하기 전에 미리 감지할 수 있습니다. 문제를 해결한 김개발 씨가 한숨을 돌렸습니다.
"네트워크 설정 하나 때문에 이렇게 큰 장애가 날 줄 몰랐어요." 박시니어 씨가 웃으며 말했습니다. "그래서 유지보수가 개발보다 어렵다고 하는 거예요.
다양한 지식이 필요하거든요."
실전 팁
💡 - 연결 풀의 max 값은 (CPU 코어 수 * 2) + 스토리지 디스크 수 공식을 참고하세요
- keepAlive 설정은 클라우드 환경에서 거의 필수입니다
- 네트워크 관련 메트릭(연결 수, 응답 시간, 에러율)을 항상 모니터링하세요
4. 네트워크 문제 해결을 위한 기초 지식
"500 에러가 나요!" 고객사에서 급한 연락이 왔습니다. 김개발 씨는 서버 로그를 뒤지기 시작했습니다.
하지만 서버에는 아무런 로그도 남아있지 않았습니다. 요청 자체가 서버까지 도달하지 못한 것입니다.
대체 어디서 문제가 발생한 걸까요?
네트워크 문제 해결을 위해서는 OSI 7계층과 TCP/IP 모델에 대한 기초 지식이 필요합니다. 문제가 어느 계층에서 발생했는지 파악해야 올바른 해결책을 찾을 수 있습니다.
ping, traceroute, netstat 같은 도구를 활용하면 문제 지점을 빠르게 찾을 수 있습니다.
다음 코드를 살펴봅시다.
// 네트워크 문제 진단을 위한 Node.js 도구
const dns = require('dns');
const net = require('net');
// 1. DNS 조회 테스트 - 도메인이 IP로 변환되는지 확인
function checkDNS(hostname) {
return new Promise((resolve, reject) => {
dns.lookup(hostname, (err, address) => {
if (err) {
console.log(`DNS 조회 실패: ${hostname}`);
reject(err);
} else {
console.log(`DNS 조회 성공: ${hostname} -> ${address}`);
resolve(address);
}
});
});
}
// 2. TCP 연결 테스트 - 해당 포트로 연결 가능한지 확인
function checkTCPConnection(host, port) {
return new Promise((resolve, reject) => {
const socket = new net.Socket();
socket.setTimeout(3000); // 3초 타임아웃
socket.connect(port, host, () => {
console.log(`TCP 연결 성공: ${host}:${port}`);
socket.destroy();
resolve(true);
});
socket.on('error', (err) => {
console.log(`TCP 연결 실패: ${err.message}`);
reject(err);
});
});
}
// 순차적으로 진단 실행
async function diagnose(hostname, port) {
await checkDNS(hostname);
await checkTCPConnection(hostname, port);
}
서버에 로그가 없다는 것은 요청이 서버까지 도달하지 않았다는 의미입니다. 김개발 씨는 막막했습니다.
어디서부터 확인해야 할까요? 박시니어 씨가 화이트보드에 그림을 그리기 시작했습니다.
"네트워크 문제는 계층별로 확인해야 해요. 마치 탐정처럼 단서를 따라가는 거죠." 네트워크를 이해하려면 계층 개념을 알아야 합니다.
우편물이 배달되는 과정을 생각해보세요. 편지를 쓰고, 봉투에 넣고, 주소를 쓰고, 우체통에 넣고, 우체국에서 분류하고, 배달됩니다.
각 단계에서 문제가 생길 수 있습니다. 네트워크도 마찬가지입니다.
가장 많이 사용하는 모델은 TCP/IP 4계층입니다. 애플리케이션 계층(HTTP), 전송 계층(TCP/UDP), 인터넷 계층(IP), 네트워크 접근 계층(이더넷)으로 나뉩니다.
문제 해결의 첫 번째 단계는 DNS 확인입니다. 도메인 이름이 IP 주소로 올바르게 변환되는지 확인합니다.
위 코드의 checkDNS 함수가 이 역할을 합니다. DNS 조회가 실패하면 애초에 서버를 찾을 수 없습니다.
두 번째는 TCP 연결 확인입니다. IP 주소를 알아도 해당 포트가 열려있지 않으면 연결할 수 없습니다.
방화벽에서 차단되거나, 서버 프로세스가 죽어있을 수 있습니다. checkTCPConnection 함수로 이를 확인합니다.
세 번째는 HTTP 계층 확인입니다. TCP 연결은 되는데 500 에러가 난다면 애플리케이션 레벨의 문제입니다.
이때는 HTTP 요청/응답을 분석해야 합니다. 터미널에서 사용할 수 있는 도구들도 알아두면 좋습니다.
ping은 대상 서버가 살아있는지 확인합니다. traceroute(Windows에서는 tracert)는 패킷이 어떤 경로로 전달되는지 보여줍니다.
netstat은 현재 열려있는 연결 상태를 보여줍니다. 김개발 씨가 차근차근 확인해보았습니다.
DNS는 정상, TCP 연결도 성공. 하지만 HTTP 응답이 없었습니다.
좀 더 조사해보니 중간에 있는 로드밸런서에서 문제가 발생한 것이었습니다. 로드밸런서의 헬스체크가 실패해서 모든 서버를 비정상으로 판단하고 있었던 것입니다.
이처럼 네트워크 문제는 예상치 못한 곳에서 발생합니다. 계층별로 체계적으로 확인하는 습관을 들이면 문제를 빠르게 해결할 수 있습니다.
박시니어 씨가 정리해주었습니다. "항상 아래 계층부터 확인해요.
DNS, TCP, HTTP 순서로요. 아래가 안 되면 위도 당연히 안 되니까요."
실전 팁
💡 - 문제 해결 순서: DNS 확인 -> TCP 연결 확인 -> HTTP 응답 확인
- curl -v 명령어를 사용하면 HTTP 요청/응답의 상세 정보를 볼 수 있습니다
- 클라우드 환경에서는 보안 그룹과 네트워크 ACL 설정도 반드시 확인하세요
5. 웹 개발자에게 필요한 네트워크 이해
김개발 씨가 만든 웹페이지가 유독 느렸습니다. 코드 최적화도 해보고, 이미지도 압축해봤지만 크게 나아지지 않았습니다.
개발자 도구의 네트워크 탭을 열어보니, 작은 파일 하나를 받는 데도 몇 백 밀리초가 걸리고 있었습니다. 도대체 왜 이렇게 느린 걸까요?
웹 개발자에게 HTTP 프로토콜과 브라우저의 네트워크 동작 방식은 필수 지식입니다. HTTPS, HTTP/2, 캐싱, CORS 등을 이해해야 빠르고 안전한 웹 서비스를 만들 수 있습니다.
네트워크 최적화는 사용자 경험에 직접적인 영향을 미칩니다.
다음 코드를 살펴봅시다.
// Express.js에서 네트워크 성능 최적화 설정
const express = require('express');
const compression = require('compression');
const app = express();
// Gzip 압축 활성화 - 전송 데이터 크기 감소
app.use(compression());
// 정적 파일 캐싱 설정 - 불필요한 요청 감소
app.use('/static', express.static('public', {
maxAge: '1y', // 1년 캐싱
etag: true, // ETag 헤더 활성화
lastModified: true // Last-Modified 헤더 활성화
}));
// CORS 설정 - 다른 도메인에서의 요청 허용
app.use((req, res, next) => {
res.header('Access-Control-Allow-Origin', 'https://trusted-domain.com');
res.header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE');
res.header('Access-Control-Allow-Headers', 'Content-Type, Authorization');
next();
});
// 보안 헤더 설정
app.use((req, res, next) => {
res.header('Strict-Transport-Security', 'max-age=31536000; includeSubDomains');
res.header('X-Content-Type-Options', 'nosniff');
next();
});
느린 웹페이지는 사용자를 떠나게 만듭니다. 구글의 연구에 따르면 로딩 시간이 3초를 넘으면 53%의 사용자가 이탈한다고 합니다.
김개발 씨의 웹페이지도 이 문제에 직면해 있었습니다. 박시니어 씨가 개발자 도구를 열어보더니 바로 문제를 지적했습니다.
"한 번에 너무 많은 요청을 보내고 있네요. 그리고 캐싱도 전혀 안 되어 있고요." 웹 개발자가 알아야 할 첫 번째 네트워크 지식은 HTTP 프로토콜입니다.
HTTP는 웹에서 데이터를 주고받는 규약입니다. 브라우저가 서버에 요청(Request)을 보내면, 서버가 응답(Response)을 반환합니다.
마치 식당에서 주문하는 것과 같습니다. 손님(브라우저)이 메뉴를 보고 주문(요청)하면, 주방(서버)에서 음식을 만들어 서빙(응답)합니다.
이 과정에서 손님이 한 번에 여러 메뉴를 주문하면 효율적이고, 자주 시키는 메뉴는 미리 준비해두면 빠릅니다. 캐싱이 바로 이 "미리 준비해두는" 것입니다.
위 코드에서 maxAge: '1y'는 브라우저에게 "이 파일은 1년 동안 다시 요청하지 않아도 돼요"라고 알려주는 것입니다. 로고 이미지나 CSS 파일처럼 잘 바뀌지 않는 파일에 적용하면 효과적입니다.
**압축(Compression)**도 중요합니다. compression 미들웨어를 사용하면 서버가 응답을 gzip으로 압축해서 보냅니다.
텍스트 기반 파일(HTML, CSS, JavaScript)은 70-80%까지 크기를 줄일 수 있습니다. **CORS(Cross-Origin Resource Sharing)**는 보안과 관련된 개념입니다.
브라우저는 기본적으로 다른 도메인의 리소스를 가져오는 것을 차단합니다. 악의적인 사이트가 사용자의 데이터를 훔쳐가는 것을 막기 위해서입니다.
하지만 정상적인 API 호출을 위해서는 CORS 헤더를 적절히 설정해야 합니다. HTTPS도 필수입니다.
HTTP에 보안 계층(TLS)을 추가한 것으로, 데이터를 암호화해서 전송합니다. 요즘은 HTTPS가 아니면 브라우저에서 경고를 표시하고, SEO에서도 불이익을 받습니다.
HTTP/2와 HTTP/3도 알아두면 좋습니다. HTTP/1.1은 한 번에 하나의 요청만 처리할 수 있지만, HTTP/2는 여러 요청을 동시에 처리할 수 있습니다.
이것만으로도 페이지 로딩 속도가 크게 향상됩니다. 김개발 씨가 캐싱과 압축을 적용하고, HTTP/2를 활성화했더니 로딩 시간이 절반 이하로 줄었습니다.
"네트워크 설정만 바꿨는데 이렇게 차이가 나다니!" 놀라워하는 김개발 씨에게 박시니어 씨가 말했습니다. "웹 성능의 80%는 네트워크 최적화에서 나와요."
실전 팁
💡 - 개발자 도구의 네트워크 탭을 자주 확인하는 습관을 들이세요
- 정적 파일은 CDN을 통해 배포하면 전 세계 어디서든 빠르게 로딩됩니다
- Lighthouse 도구로 웹 성능을 측정하고 개선점을 파악하세요
6. DevOps와 인프라에서의 네트워크 역할
김개발 씨가 처음으로 서버 배포를 담당하게 되었습니다. AWS에 서버를 올리고 도메인을 연결하는 작업이었습니다.
인스턴스는 만들었는데, 외부에서 접속이 되지 않았습니다. "분명 서버는 정상인데..." 보안 그룹, VPC, 서브넷...
처음 보는 용어들이 쏟아졌습니다.
DevOps와 인프라 영역에서 네트워크 지식은 더욱 중요합니다. 클라우드 환경에서는 가상 네트워크(VPC), 보안 그룹, 로드밸런서, CDN 등을 직접 설정해야 합니다.
이 개념들을 이해하지 못하면 서비스를 안정적으로 운영할 수 없습니다.
다음 코드를 살펴봅시다.
// Terraform으로 AWS 네트워크 인프라 정의 예시
// VPC와 서브넷 설정
resource "aws_vpc" "main" {
cidr_block = "10.0.0.0/16" // IP 주소 범위 설정
enable_dns_hostnames = true
enable_dns_support = true
tags = {
Name = "main-vpc"
}
}
// 퍼블릭 서브넷 - 인터넷 접근 가능
resource "aws_subnet" "public" {
vpc_id = aws_vpc.main.id
cidr_block = "10.0.1.0/24"
availability_zone = "ap-northeast-2a"
map_public_ip_on_launch = true // 공인 IP 자동 할당
}
// 보안 그룹 - 방화벽 역할
resource "aws_security_group" "web" {
vpc_id = aws_vpc.main.id
// HTTP 트래픽 허용
ingress {
from_port = 80
to_port = 80
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"] // 모든 IP에서 접근 허용
}
// HTTPS 트래픽 허용
ingress {
from_port = 443
to_port = 443
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
}
클라우드 시대가 되면서 개발자의 역할이 확장되었습니다. 예전에는 서버 관리자가 별도로 있었지만, 요즘은 개발자가 직접 인프라를 구성하는 경우가 많습니다.
이것이 바로 DevOps입니다. 김개발 씨가 마주한 문제는 클라우드 네트워크 설정이었습니다.
AWS, GCP, Azure 같은 클라우드 서비스에서는 물리적인 네트워크 대신 **가상 네트워크(VPC)**를 사용합니다. VPC는 마치 자신만의 사설 네트워크를 클라우드 안에 만드는 것과 같습니다.
집에 있는 공유기가 내부 네트워크를 만들어주는 것처럼, VPC는 클라우드 안에 격리된 네트워크 공간을 제공합니다. VPC 안에는 서브넷을 만듭니다.
서브넷은 VPC를 더 작은 네트워크로 나눈 것입니다. 퍼블릭 서브넷은 인터넷과 직접 통신할 수 있고, 프라이빗 서브넷은 외부에서 접근할 수 없습니다.
웹 서버는 퍼블릭 서브넷에, 데이터베이스는 프라이빗 서브넷에 두는 것이 일반적입니다. 보안 그룹은 가상 방화벽입니다.
어떤 트래픽을 허용하고 차단할지 규칙을 정의합니다. 위 코드에서 80번 포트(HTTP)와 443번 포트(HTTPS)만 열어두었습니다.
SSH(22번 포트)는 특정 IP에서만 접근하도록 제한하는 것이 좋습니다. 김개발 씨의 문제는 보안 그룹에서 80번 포트를 열지 않아서 발생한 것이었습니다.
서버는 정상적으로 작동하고 있었지만, 방화벽에서 요청을 차단하고 있었던 것입니다. 로드밸런서도 중요한 개념입니다.
트래픽이 많아지면 서버 하나로는 감당이 안 됩니다. 로드밸런서는 들어오는 요청을 여러 서버에 분산시켜줍니다.
또한 특정 서버가 죽으면 자동으로 다른 서버로 트래픽을 보내서 서비스 중단을 방지합니다. **CDN(Content Delivery Network)**은 전 세계에 분산된 서버 네트워크입니다.
정적 파일을 CDN에 올려두면, 사용자에게 가장 가까운 서버에서 파일을 전송합니다. 한국 사용자는 한국 서버에서, 미국 사용자는 미국 서버에서 받으니 훨씬 빠릅니다.
컨테이너 환경(Docker, Kubernetes)에서는 네트워크가 더욱 복잡해집니다. 컨테이너 간 통신, 서비스 디스커버리, 인그레스 설정 등 알아야 할 것이 많습니다.
하지만 기본 원리는 같습니다. IP 주소, 포트, 프로토콜에 대한 이해가 바탕이 되어야 합니다.
박시니어 씨가 조언했습니다. "DevOps를 하려면 네트워크는 필수예요.
인프라를 이해하지 못하면 장애 상황에서 속수무책이 되거든요." 김개발 씨는 이번 경험을 통해 네트워크 공부의 필요성을 절실히 느꼈습니다. 코드만 잘 짜는 것으로는 충분하지 않다는 것을 깨달은 것입니다.
실전 팁
💡 - 클라우드 네트워크 설정은 인프라 코드(IaC)로 관리하면 실수를 줄일 수 있습니다
- 프로덕션 환경에서는 프라이빗 서브넷에 중요한 리소스를 배치하세요
- 네트워크 비용도 무시할 수 없으니, 데이터 전송량을 모니터링하세요
이상으로 학습을 마칩니다. 위 내용을 직접 코드로 작성해보면서 익혀보세요!