Recommanded Free YOUTUBE Lecture: <% selectedImage[1] %>

이제는 로컬에서만 돌아가는 애플리케이션은 전혀 없다고 봐도 된다. 아주 간단한 애플리케이션이 아닌한은 대부분 인터넷에 연결되어 있다. 동영상을 보여주는 미디어플레이어같은 인터넷에 연결될 필요가 없어 보였던 프로그램들도 인터넷을 통한 미디어검색, 업데이트등의 기능을 필요로 하면서 인터넷에 연결되고 있다.

이러하다 보니 어떠한 프로그램을 만들더라도 네트워크 프로그래밍 기술이 필요하게 되었다. 여기에서 네트워크 프로그래밍을 공부하는 방법에 대해서 알아볼 것이다.

우선 글을 읽는 독자들에 대해서 다음과 같은 가정을 하겠다.
  1. C(:12) / C++(:12) 을 사용할줄 안다.
  2. 리눅스(:12) 환경이 구축되어 있고, 사용할 줄 안다.
  3. 코드를 작성해서 컴파일 할 수 있다.
리눅스 환경으로 한정 지은 이유는 첫째. 필자가 리눅스 환경에 익숙하기 때문이고, 둘째 네트워크 프로그래밍 과정을 학습하기에 최적의 환경을 제공해 주기 때문이다. 리눅스 환경에서 C를 이용해서 프로그래밍 할경우, 약간 골치가 아프긴 하겠지만, 어셈블리어(:12)를 제외하고 가장 운영체제에 가까이 있다는 특성 때문에, 네트워크와 시스템에 대해 자연스럽게 학습할 수 있다.

모든 것의 시작은 시스템 프로그래밍

네트워크 프로그래밍을 한다고 해서, 네트워크 입문 서적을 구입해서 echo서버(:12) 부터 만들어가는 건 잘못된 학습방법이다.

사실 socket(), bind(), listen(), accept(), connect() 함수만 알면, 간단한 네트워크 프로그램을 작성할 수 있다. 그러나 다수의 클라이언트를 처리하는 실제 서비스 가능한 프로그램을 만들기 위해서는 입출력다중화(:12), 멀티 프로세스 / 쓰레드(:12), IPC(:12)의 사용이 절대적으로 필요하며, 이들은 시스템 프로그래밍의 영역이다.

그러므로 우선 시스템프로그래밍(:12) 관련 학습을 해야 한다. 시스템프로그래밍 과정 중 가장 중요한 부분은 위에서 언급된 입출력다중화, 프레세스/쓰레드, IPC 부분이 된다.

TCP/IP 개념 잡기

현재 만들어지는 네트워크 프로그램중 (아마도)90%이상이 TCP(:12)/ IP(:12)기반에서 만들어 지고 있다. 당연히 이들 프로토콜에 대해서 알아두고 넘어갈 필요가 있다. 문제는 이게 컴파일해서 결과물이 나오는 그런게 아니라서 여엉 재미가 없다는데 있다. 그러나 원래 공부라는 건 하기싫어도 해야 될 때가 있는 것이고, TCP/IP관련된 내용은 그냥 대충 넘어가도 되는 영역이 아니다.

TCP/IP가 워낙 배워야할게 많은 분야라서, 제풀에 넘어질 수 있으니 우선은 아래의 내용정도를 가볍게 숙지하고 넘어가도록 한다.
  1. TCP/IP 개론
  2. TCP/IP 개론2
  3. IP 패킷수준에서 보기
  4. TCP 패킷수준에서 보기
처음에는 위의 내용만 보고 넘어가도 큰 문제가 없을 것이다. 나중을 위해서 TCP/IP 위키의 문서를 읽어두면 더욱 도움이 될것이다.

네트워크 프로그래밍 시작

이제 네트워크 프로그래밍을 시작할 준비가 되었다. 이쯤되면 예제프로그램을 보던지, 입출력다중화(:12)나 멀티 프로세스/쓰레딩 기법을 통한 응용편을 보던지 어렵지 않게 이해가 될것이다. 게다가 IPC(:12)를 배웠으니, 여러개의 프로세스나 쓰레드사이의 데이터 교환이나 동기화를 어떻게 해야 하는지에 대한 아이디어도 생각해 낼 수 있을 것이다. TCP/IP에 대한 기본지식은 프로그램에 문제가 생겼을 때, 문제점과 해결방법을 찾아내는데 도움을 준다. 또한 TCP/IP 프로토콜이 가지는 근본적인 보안상의 문제점을 인지하고 있으므로, 이의 해결책을 찾기 위해 노력하니 자연스럽게 네트워크 보안에 관한 개념도 정립된다.

이렇게 해서 서버프로그램을 만들다 보면, 기존의 고전적인 방법으로는 현재 인터넷의 대량의 데이터를 처리하기엔 문제가 있음을 알게 될 것이다. 이쯤되면 epoll(:12)이나 RTS(:12)와 같은 최신 기법에 시선을 돌리게 될건데, 이 역시 시스템 프로그래밍 영역이 된다. 결국 자연스럽게 시스템 프로그래밍의 더 깊은 영역까지를 다루게 된다. 혹은 고전적인 방법을 섞어는 방법도 고려하게 될것이다. 쓰레드풀(:12)이나 프로세스풀을 만들거나, 다수의 포트를 유지하거나, 쓰레드와 입출력다중을 함께 사용하는 등이 그것으로 이러한 방법에 대해서 고민하면서, 시스템프로그래밍과 네트워크 프로그래밍에 대한 이해를 더 깊이 하게 된다.

여기에서 좀더 나가면 VoIP, 멀티캐스팅 응용, P2P와 같은 세분화된 분야를 선택할 수 있게 될것이다.

결국 시스템프로그래밍이 네트워크프로그래밍(:12)의 시작과 끝임을 알 수 있을 것이다.