우리가 만든 것들 돌아보기
먼 길을 걸어왔습니다. 잠시 멈춰 서서, 우리가 무엇을 배우고 무엇을 만들었는지 돌아봅니다. 이 회고가 흩어진 지식을 하나의 그림으로 묶어 줄 것입니다.
우리가 만든 프로그램들
이 책에서 우리 손으로 만든 것들을 떠올려 보세요.
가장 먼저 한 마디를 주고받는 에코 서버를 Python과 C로 만들었습니다. 소켓의 일생을 처음 경험한 순간이었습니다. 그다음 길이 접두어 프로토콜로 파일을 통째로 전송하는 프로그램을 만들었고, 놀랍게도 Python과 C가 같은 약속으로 서로 대화하는 것을 확인했습니다.
UDP로 넘어가서는 가벼운 통신을 다뤘고, 사라진 패킷을 재전송하며 신뢰성을 직접 만들어 보았습니다. 그 과정에서 우리가 TCP를 다시 발명하고 있다는 깨달음을 얻었습니다. 멀티캐스트로 여럿에게 한 번에 뿌리는 법도 익혔고, 실시간 센서 수집기도 만들었습니다.
여러 클라이언트를 동시에 다루는 법을 배우며 스레드와 fork, select와 poll을 익혔고, 그것으로 멀티 클라이언트 채팅 서버를 만들었습니다. 이어서 우리만의 채팅 프로토콜을 설계하고, 세상에서 가장 유명한 프로토콜인 HTTP를 직접 구현해 웹 브라우저와 대화하는 서버까지 만들었습니다.
심화 과정에서는 C10K 문제와 epoll로 고성능의 세계를 엿보았고, asyncio의 정체가 우리가 손으로 짠 이벤트 루프임을 확인했습니다. 마지막으로 TLS로 통신을 암호화하고 견고성 패턴을 더해, 안전하고 단단한 보안 채팅 서버로 모든 것을 마무리했습니다.
우리가 손에 넣은 개념들
프로그램만 만든 것이 아닙니다. 그 과정에서 소켓 프로그래밍의 핵심 개념을 모두 손에 넣었습니다.
소켓이 곧 파일이라는 것, 그래서 파일 디스크립터로 관리된다는 것을 배웠습니다. TCP는 스트림이라 메시지 경계가 없고, 그래서 부분 수신을 늘 염두에 두어야 한다는 것을 몸으로 익혔습니다. 이것이 어쩌면 이 책에서 가장 중요한 깨달음이었습니다. 바이트 오더, 블로킹과 논블로킹, 3-way 핸드셰이크와 TIME_WAIT, 그리고 에러와 신호를 다루는 법까지 다졌습니다.
동시성에서는 흐름을 늘리는 길과 멈추지 않는 길이라는 두 발상을 배웠고, 그 둘이 현대의 모든 비동기 시스템의 뿌리임을 확인했습니다. 프로토콜이 언어와 운영체제를 넘는 공통의 약속이라는 것, 그리고 추상화 아래를 아는 것이 왜 힘이 되는지도 깨달았습니다.
Python과 C, 두 시선
이 책 내내 우리는 같은 일을 두 번 했습니다. Python으로 개념을 잡고, C로 그 아래를 들여다봤습니다. 이 두 시선이 준 선물이 있습니다.
Python은 소켓 프로그래밍이 본질적으로 단순하다는 것을 보여 주었습니다. 만들고, 묶고, 듣고, 받고, 보내고, 닫는 흐름은 어렵지 않았습니다. C는 그 단순함 아래에서 운영체제가 실제로 무슨 일을 하는지 보여 주었습니다. 주소 구조체를 채우고, 바이트 오더를 변환하고, 반환값을 점검하고, 버퍼를 직접 관리하는 그 모든 일이, Python이 우리 대신 해 주던 것이었습니다.
이제 우리는 어느 언어로 소켓을 만나도 두렵지 않습니다. 개념은 어디서나 같고, 그 아래에서 무슨 일이 벌어지는지 알기 때문입니다.
가장 큰 수확
이 책의 가장 큰 수확은 어쩌면 특정 함수나 코드가 아닐지도 모릅니다. 그것은 추상화 아래를 들여다보는 눈입니다. FastAPI가, asyncio가, 웹 브라우저가 그 아래에서 무엇을 하는지 이제 우리는 짐작할 수 있습니다. 프레임워크가 편리한 이유, 때로 새는 이유, 그리고 문제가 생겼을 때 어디를 봐야 하는지를 압니다.
이 눈은 한 번 뜨면 다시 감기지 않습니다. 앞으로 어떤 새로운 네트워크 기술을 만나도, 그 바닥에는 우리가 이 책에서 손으로 만져 본 소켓이 있을 것입니다. 그 사실을 아는 것이, 이 책이 준 가장 단단한 자산입니다.
다음 장에서는 이 책 너머, 더 깊이 가고 싶은 사람을 위한 길을 안내합니다.