Programmers

[87일차]연결의 기술과 만드는 철학: 네트워크 & 소프트웨어 공학

PARKpatchnotes 2026. 1. 23. 09:34

컴퓨터 과학(CS)의 세계에서 하드웨어와 운영체제가 '개인'을 위한 기초라면, 네트워크는 개인과 개인을 연결하는 '사회'이고, 소프트웨어 공학은 그 위에서 가치를 창출하는 '건설 철학'이다. 이번 글에서는 데이터가 흐르는 길인 네트워크의 원리와, 견고한 소프트웨어를 만드는 공학적 방법론에 대해 정리한다.


1. 컴퓨터 네트워크: 데이터가 흐르는 길

네트워크는 단순히 선을 연결하는 것이 아니라, 서로 다른 시스템이 대화할 수 있도록 규칙(Protocol)을 정하는 과정이다.

1.1 통신망의 기초

디지털 시대에 우리는 왜 디지털 신호를 선호하는가? 아날로그는 외부 간섭에 약하지만, 디지털(0과 1)은 정보를 복구하기 쉽고(적은 정보 손실), 수학적 연산을 통해 암호화가 용이하기 때문이다.

데이터를 전송하는 방식에는 여러 기준이 있다.

  • 전송 방식: 한 번에 한 비트씩 보내면 직렬(Serial), 여러 비트를 동시에 보내면 **병렬(Parallel)**이다. 또한, 클럭 신호에 맞춰 약속된 시간에 보내면 동기식, 시작/정지 비트를 사용해 임의로 보내면 비동기식이라 한다.
  • 전송 방향: 라디오처럼 듣기만 하면 단방향, 무전기처럼 번갈아 말하면 반이중(Half-Duplex), 전화기처럼 동시에 말하고 들으면 **전이중(Full-Duplex)**이다.
  • 망의 범위: 좁은 사무실은 LAN, 도시는 MAN, 국가나 대륙을 넘어서면 WAN으로 분류한다.

1.2 OSI 7계층 모델과 프로토콜

네트워크 통신의 복잡성을 해결하기 위해 ISO는 통신 과정을 7단계로 표준화했다. 이를 OSI 7계층이라 한다.

  1. Physical (물리 계층): 0과 1을 전기 신호로 변환한다. (장비: 허브, 리피터)
  2. Data Link (데이터 링크 계층): 물리적 주소(MAC)를 사용하여 인접 기기 간 신뢰성 있는 전송을 담당한다. 전송 단위를 **프레임(Frame)**이라 한다. (장비: 스위치, 브릿지)
    • 이더넷(Ethernet): 유선 LAN의 표준. CSMA/CD 기술을 써서 데이터 충돌을 감지하고, 충돌 시 임의 시간 대기(Exponential Backoff) 후 재전송한다.
    • 와이파이(Wi-Fi): 무선은 충돌 감지가 어려워 CSMA/CA (충돌 회피) 방식을 사용한다.
  3. Network (네트워크 계층): 데이터를 목적지까지 가장 안전하고 빠르게 보낼 경로(라우팅)를 찾는다. 단위는 **패킷(Packet)**이다. (IP, ICMP, IPSec)
  4. Transport (전송 계층): 양 끝단(End-to-End)의 사용자들이 신뢰성 있게 데이터를 주고받게 한다. (TCP, UDP)
  5. Session / Presentation / Application: 세션을 관리하고, 데이터 형식을 변환(암호화/압축)하며, 사용자가 실제 접하는 응용 프로그램(HTTP, FTP 등) 단계를 의미한다.

신뢰성을 위한 기술들:

  • 흐름 제어(Sliding Window): 수신 측이 처리할 수 있는 만큼만 데이터를 보낸다.
  • 오류 검출: 간단하게는 1의 개수를 맞추는 패리티 비트부터, 데이터 다항식 연산을 이용한 체크섬(Checksum) 등을 사용한다.

1.3 IP 네트워크와 주소 지정

인터넷은 거대한 약속, 즉 **프로토콜(Protocol)**의 집합이다.

  • IP 주소: 네트워크상의 집 주소다. 과거에는 A, B, C 클래스로 나누었으나 낭비가 심해, 현재는 CIDR(사이더) 블록을 이용해 유연하게 주소를 할당한다.
  • Port(포트): 집 안의 '방 번호'와 같다. 하나의 IP(서버) 안에서 웹(80), 메일(25) 등 어떤 프로세스가 데이터를 받을지 구분한다.
  • TCP vs UDP:
    • TCP: 연결 지향형. 3-way Handshake(SYN, SYN-ACK, ACK)를 통해 연결을 맺고 데이터를 확실히 보낸다. 느리지만 정확하다.
    • UDP: 비연결형. 데이터를 던지기만 한다(Datagram). 스트리밍처럼 속도가 중요할 때 쓴다.

2. 소프트웨어 공학: 코딩을 넘어 공학으로

소프트웨어 공학(Software Engineering)은 소프트웨어의 개발, 운용, 유지보수에 체계적이고 정량적인 접근법을 적용하는 것이다. 즉, **"최소한의 비용으로 최대한의 품질을 뽑아내는 기술"**이다.

2.1 품질과 프로세스

소프트웨어는 눈에 보이지 않아 품질 보증이 어렵다. 이를 관리하기 위해 조직의 성숙도를 평가하는 모델이 존재한다.

  • CMMI: 조직의 개발 프로세스 역량을 5단계(Initial ~ Optimizing)로 평가한다. 레벨이 높을수록 프로세스가 정량적으로 관리되고 최적화되어 있음을 의미한다.
  • 형상 관리(SCM): 소스 코드의 변경 사항을 버전별로 관리하여, 실수했을 때 언제든 과거로 되돌릴 수 있게 한다(Git 등).

2.2 개발 방법론: 폭포수 vs 애자일

소프트웨어를 만드는 방식은 크게 두 가지 철학으로 나뉜다.

  1. 폭포수 모델 (Waterfall): 고전적 방식. 요구사항 → 설계 → 구현 → 검증 → 유지보수가 물이 떨어지듯 순차적으로 진행된다. 다음 단계로 넘어가면 되돌리기 어렵다. 명확한 요구사항이 있는 프로젝트에 적합하다.
  2. 애자일 모델 (Agile): 변화에 유연하게 대응하는 방식. "계획을 따르는 것보다 변화에 대응하는 것", "문서보다 작동하는 소프트웨어"를 중시한다.
    • 스크럼(Scrum): 짧은 주기(Sprint)로 개발하고 피드백을 받는다.
    • XP(eXtreme Programming): 짝 프로그래밍(Pair Programming) 등을 통해 품질을 극한으로 높인다.

2.3 클린 코드와 리팩토링

"돌아가기만 하는 코드"는 시한폭탄과 같다. 유지보수 가능한 코드를 작성해야 한다.

  • 코드 리뷰: 동료들이 내 코드를 검토하는 과정. 버그 발견뿐만 아니라 지식 공유의 장이 된다. 격식을 갖춘 **코드 인스펙션(Inspection)**이나 FTR 같은 방식도 있다. 이때 핵심은 "작성자를 비난하지 않고 코드 자체만 비판하는 것"이다.
  • 리팩토링(Refactoring): 외부 동작은 그대로 둔 채, 내부 구조를 깔끔하게 개선하는 작업. 기술 부채를 갚는 과정이다.
  • 클린 코드: 읽기 쉽고, 의도가 명확하며, 중복이 없는 코드. 이것이 뒷받침되어야 애자일한 대응도 가능하다.

마치며

네트워크가 전 세계를 하나로 묶어주는 신경망이라면, 소프트웨어 공학은 그 신경망 위에서 돌아가는 시스템을 건강하게 유지하는 면역 체계와 같다. OSI 7계층의 흐름을 이해하고, 애자일한 사고방식으로 클린 코드를 작성하는 것. 이것이 훌륭한 엔지니어가 갖춰야 할 기본 소양이다.