이번 시간에는 컴퓨터 네트워크의 기본 원리와 소프트웨어공학의 핵심 개념을 정리했습니다.
네트워크 는 여러 컴퓨터가 서로 데이터를 주고받을 수 있도록 연결된 시스템입니다. 우리가 웹사이트를 열거나 메시지를 보내는 모든 동작이 네트워크를 통해 이루어집니다.
| 종류 | 설명 | 예시 |
|---|---|---|
| LAN | 가정·사무실 등 좁은 범위의 네트워크 | 회사 내부망 |
| WAN | 넓은 지역을 연결하는 네트워크 | 인터넷 |
| MAN | 도시 단위의 네트워크 | 케이블 TV망 |
데이터를 전송할 때 패킷(Packet) 이라는 작은 단위로 쪼개서 전송합니다. 각 패킷은 독립적으로 최적의 경로를 따라 목적지에 도착하고, 수신 측에서 다시 조립됩니다.
네트워크 통신을 7개의 계층으로 나누어 각 역할을 명확히 정의한 모델입니다. 어느 계층에서 문제가 생겼는지 파악하고 해결하기 쉽게 만들어 줍니다.
7. 응용 계층 (Application) → HTTP, FTP, DNS
6. 표현 계층 (Presentation) → 암호화, 압축, 인코딩
5. 세션 계층 (Session) → 연결 수립·유지·종료
4. 전송 계층 (Transport) → TCP, UDP
3. 네트워크 계층 (Network) → IP, 라우팅
2. 데이터링크 계층 (Data Link)→ MAC 주소, 이더넷
1. 물리 계층 (Physical) → 전기 신호, 케이블
전송 계층의 두 가지 핵심 프로토콜입니다.
| 항목 | TCP | UDP |
|---|---|---|
| 연결 방식 | 연결 지향 (3-way handshake) | 비연결 지향 |
| 신뢰성 | 데이터 순서·손실 보장 | 보장 없음 |
| 속도 | 상대적으로 느림 | 빠름 |
| 사용 예 | HTTP, 파일 전송 | 스트리밍, 게임, DNS |
웹 브라우저와 서버가 통신할 때 사용하는 HTTP는 TCP 위에서 동작합니다. 반면 실시간 스트리밍처럼 빠른 전송이 중요하고 일부 데이터 손실을 허용할 수 있는 경우에는 UDP를 사용합니다.
IP(Internet Protocol) 주소 는 네트워크에서 각 장치를 식별하는 고유한 주소입니다. 집 주소와 같은 역할을 합니다.
IPv4: 192.168.0.1 (32비트, 약 43억 개)
IPv6: 2001:db8::1 (128비트, 사실상 무한대)
IPv4 주소가 고갈됨에 따라 IPv6로의 전환이 진행 중입니다.
IP 주소를 효율적으로 관리하기 위해 서브넷(Subnet) 으로 나눕니다.
192.168.0.0/24
└── /24: 앞 24비트는 네트워크 주소, 나머지 8비트는 호스트 주소
→ 192.168.0.1 ~ 192.168.0.254 까지 254개 사용 가능
| 구분 | 설명 |
|---|---|
| 공인 IP | 인터넷에서 유일한 주소. ISP가 할당합니다 |
| 사설 IP | 내부 네트워크에서만 사용. 192.168.x.x 등이 해당합니다 |
공유기(라우터)가 NAT(Network Address Translation)를 통해 사설 IP를 공인 IP로 변환하여 인터넷과 통신합니다.
사람은 192.168.0.1 같은 IP 주소를 외우기 어렵습니다. DNS 는 google.com 같은 도메인 이름을 IP 주소로 변환해주는 인터넷 전화번호부입니다.
브라우저에 google.com 입력
↓
DNS 서버에 질의: "google.com의 IP가 뭔가요?"
↓
DNS 응답: "142.250.206.14"
↓
해당 IP로 HTTP 요청
실습 문제와 연계된 내용으로, 지금까지 배운 IP 주소·서브넷·DNS 개념을 바탕으로 내 컴퓨터의 네트워크 주소 정보를 직접 확인해보는 과정을 진행했습니다.
# 내 IP 주소 확인 (macOS/Linux)
ifconfig
# 내 IP 주소 확인 (Windows)
ipconfig
# DNS 조회
nslookup google.com
# 네트워크 경로 추적
traceroute google.com # macOS/Linux
tracert google.com # Windows
직접 명령어를 실행해보니 내 컴퓨터가 어떤 사설 IP를 가지고 있는지, 공유기를 통해 어떤 공인 IP로 나가는지 눈으로 확인할 수 있었습니다.
소프트웨어공학(Software Engineering) 은 소프트웨어를 체계적이고 효율적으로 개발·유지보수하기 위한 원칙과 방법론을 연구하는 학문입니다.
코딩 실력만으로는 좋은 소프트웨어를 만들기 어렵습니다. 요구사항 분석, 설계, 테스트, 유지보수까지의 전체 과정을 어떻게 관리하느냐가 소프트웨어의 품질을 결정합니다.
요구사항 분석 → 설계 → 구현 → 테스트 → 배포 → 유지보수
각 단계를 체계적으로 진행해야 요구사항 누락, 일정 지연, 품질 저하 같은 문제를 예방할 수 있습니다.
폭포수 모델 은 각 단계를 순서대로 완료한 후 다음 단계로 넘어가는 전통적인 개발 방법론입니다.
요구사항 분석
↓ (완료 후)
설계
↓ (완료 후)
구현
↓ (완료 후)
테스트
↓ (완료 후)
배포
장점 — 단계가 명확하고 문서화가 잘 됩니다. 계획대로 진행되면 예측 가능합니다.
단점 — 요구사항이 중간에 바뀌면 대처하기 어렵습니다. 문제가 뒤늦게 발견될 수 있습니다.
애자일 은 짧은 스프린트(Sprint) 단위로 개발하고, 빠르게 피드백을 반영하는 유연한 방법론입니다.
계획 → 설계 → 개발 → 테스트 → 리뷰
└──────── 2주 스프린트 ────────┘
└──────── 반복 (Iteration) ────┘
장점 — 요구사항 변화에 유연하게 대응할 수 있습니다. 빠른 피드백 주기로 문제를 조기에 발견합니다.
단점 — 전체 일정과 범위를 예측하기 어렵습니다. 잦은 변경으로 팀 피로도가 올라갈 수 있습니다.
| 구분 | 폭포수 | 애자일 |
|---|---|---|
| 요구사항 변경 | 어렵습니다 | 유연하게 수용합니다 |
| 피드백 주기 | 깁니다 | 짧습니다 (2주 단위) |
| 적합한 프로젝트 | 요구사항이 명확하고 변경이 적은 경우 | 요구사항이 자주 바뀌는 경우 |
코드 리뷰 는 다른 개발자가 작성한 코드를 검토하는 과정입니다. 단순히 버그를 찾는 것이 아니라 다음과 같은 목적이 있습니다.
리팩토링 은 외부 동작은 그대로 유지하면서 내부 코드 구조를 개선하는 작업입니다. 기능을 추가하는 것이 아니라 코드를 더 읽기 쉽고 유지보수하기 쉽게 만드는 것이 목표입니다.
// 리팩토링 전
function calc(a: number, b: number, t: string) {
if (t === 'add') return a + b;
if (t === 'sub') return a - b;
if (t === 'mul') return a * b;
}
// 리팩토링 후
type OperationType = 'add' | 'subtract' | 'multiply';
const operations: Record<OperationType, (a: number, b: number) => number> = {
add: (a, b) => a + b,
subtract: (a, b) => a - b,
multiply: (a, b) => a * b,
};
function calculate(a: number, b: number, type: OperationType) {
return operations[type](a, b);
}
로버트 마틴(Robert C. Martin) 의 클린 코드 원칙에서 핵심만 뽑으면 다음과 같습니다.
객체지향 설계에서 좋은 소프트웨어를 만들기 위한 SOLID 5가지 원칙입니다.
| 원칙 | 이름 | 설명 |
|---|---|---|
| S | 단일 책임 원칙 | 하나의 클래스는 하나의 책임만 가져야 합니다 |
| O | 개방-폐쇄 원칙 | 확장에는 열려있고 수정에는 닫혀있어야 합니다 |
| L | 리스코프 치환 원칙 | 자식 클래스는 부모 클래스를 대체할 수 있어야 합니다 |
| I | 인터페이스 분리 원칙 | 사용하지 않는 인터페이스에 의존하지 않아야 합니다 |
| D | 의존성 역전 원칙 | 구현이 아닌 추상화에 의존해야 합니다 |
빠른 개발을 위해 임시방편으로 작성한 코드가 나중에 수정 비용을 높이는 것을 기술 부채 라고 합니다. 부채는 이자처럼 쌓이기 때문에 정기적으로 리팩토링을 통해 해소해야 합니다.