2011년 5월 29일 일요일

자바의 네트워크 프로그래밍(Network Programming)

자바의 네트워크 프로그래밍에 대한 전반적인 개요를 파악할수 있는 시간을 마련하였다. 자바에서 전체 단원을 통틀어서 핵중의 핵이라고 할수 있는 단원이 바로 네트워크 프로그래밍이다. 그만큼 이제는 네트워크를 통하지 않고는 뭔가를 이룰수 없는 시대에 살고 있으니까 말이다. 그렇다면 프로그래밍에서 네트워크란 무엇인가? 한마디로 얘기하자면 서로 다른 컴퓨터를 통신망을 통해 연결한 것으로 대표적인 것으로는 인터넷 통신망을 들수 있겠다. 네트워크를 얘기할때 빼놓지않고 얘기하는 것이 서버(Server)와 클라이언트(Client) 개념일 것이다.


한쪽은 서버(Server)로 한쪽은 클라이언트(Client)로 지칭하는데 정보를 제공하는 컴퓨터나 응용프로그램은 서버라고 하고 정보가 필요해서 요청하는 컴퓨터나 응용프로그램은 클라이언트가 되는 것이다. 즉, 여러분이 클라이언트라고 생각하면 된다. 정보가 필요해서 인터넷을 떠돌아 다니는 쪽은 보통 여러분들이 아니겠는가? 바로 이런 서버와 클라이언트가 서로 정보를 주고 받을수 있게끔 다시 말해서 통신할수 있도록 만들어주는 선로나 연결망이 필요한데 이를 네트워크라 한다.


당연하지만 이런 네트워크를 기반으로 통신이 이루어지게 하기 위해선 최소한 두대 이상의 컴퓨터가 필요할 것이다. 더 쉽게 설명하자면 여러분이 인터넷을 쓸때 그냥 컴퓨터가 있다고 바로 인터넷을 쓸수 있는 것이 아니다. 여러분이 인터넷 회사에 응분의 대가(?)를 지불하고 그쪽 서버 컴퓨터에서 여러분이 접속할수 있는 선로를 개통해줘야 인터넷을 이용할수 있는 것이다. 여러분이 인터넷에서 어디를 가든 반대쪽 관련 서버에서 응답을 해줘야 쓸수 있는 것이고 컴퓨터가 서로 올바른 메세지를 주고 받기 위해서 규칙을 정해놓았는데 이런 규칙으로 만든 통신 규약을 프로토콜(Protocol)이라고 한다.

인터넷에서는 이를 IP(Internet Protocol)라는 이름의 프로토콜을 사용한다. 이제는 워낙 익숙한 용어가 되어버린지라 뭔지는 몰라도 막연히 자신의 고유한 인터넷 주소라는 것쯤은 알고 있는이가 많을 것이다. IP는 4바이트로 이루어져 있는데 .으로 번호를 네개 공간으로 나누어 192.168.1.100 이런식으로 쓰며 IP 주소라고 불린다. 여러분의 컴퓨터가 있는 집주소를 말한다고 생각하면 될것이다. 이런 IP 주소로 인해서 여러분의 컴퓨터가 다른 여러 컴퓨터들과 섞여서 몰래 통신을 하고 있어도 알게 모르게 여기저기 기록과 흔적이 남는 것이다. 따라서 안보인다고 함부로 나쁜짓(?) 하다가 잡히는게 바로 이런 이유 때문이다.ㅎㅎ


네트워크에 관련된 그림은 그려졌으리라 보고 이제 조금더 깊이 들어가보겠다. 중간중간에 용어가 생소하더라도 끝까지 읽어내려가기 바란다. 가면 갈수록 더 쉽게 설명해서 종국에 가서는 뿌듯한 성취감(?)을 맛보게끔 만들 것이다.ㅎㅎ 클라이언트쪽 프로그램에서 서버쪽 프로그램으로 정보를 요청하면 이를 수락하고 관련 정보를 제공하는등의 네트워크 서비스가 이루어지는데 이는 인터넷 소프트웨어 스택(Internet Software Stack)의 일부분인 트랜스포트 레이어(Transport Layer)를 통해 이루어진다.


우리는 이를 TCP/IP(Transport Control Protocol/Internet Protocol)라고 부른다. Internet Software Stack의 일부분이니 엄밀히 표현하면 TCP/IP stack이 되겠다. 이런 네트워크 서비스를 가능케 해주는 트랜스포트 레이어는 두가지 프로토콜로 나뉜다. 하나는 TCP(Transport Control Protocol)고 다른 하나는 UDP(User Datagram Protocol)다. 이를 프로그래밍상에서는 소킷(socket)이라고 부르는데 순우리말(?)로 소켓이다.ㅎㅎ 이 정도 왔으면 네트워크 프로그래밍에 대해서 좀 아는 이들이라면 감을 잡았을 것이다. 왜 네트워크 얘기만 하면 소켓 소켓하는지 말이다.^^


TCP는 연결지향 프로토콜(Connection-Oriented Protocol)로 두 컴퓨터간의 데이터 흐름의 신뢰성을 보장한다. 즉 클라이언트와 연결이 되었다면 통신은 물론이고 데이터 교환시 손실없이 주고받을수 있다는 것을 보장하는 것이다. TCP는 파일이나 데이터를 네트워크에서 여러개의 작은 조각으로 나누어서 보내거나 반대로 이를 재조립하는 기능을 한다. 네트워크에서 이렇게 파일이나 데이터를 여러개로 쪼개는 것을 패킷(packet)이라 한다. 관련 서비스 프로그램의 예로는 ftp나 telnet을 들수 있겠다.

UDP는 데이터의 독립적인 패킷을 보내는 프로토콜인데 한 컴퓨터에서 다른 컴퓨터로 데이터를 주고받을때 TCP와는 다르게 연결성도 없고 신뢰성도 없는 한마디로 데이터 교환시 손실여부를 보장할수 없는 패킷을 말하는데 이를 데이터그램(datagrams)이라 부른다. 관련 서비스 프로그램의 예로는 Clock server나 Ping을 들수 있는데 그냥 폼잡고 쓰는 것이니 괜히 이런거 외우지 말아라.ㅎㅎ 자바는 TCP(Socket 클래스)와 UDP(DatagramSocket 클래스)를 모두 지원한다. 요런걸 신경써야쥐~


TCP와 UDP 프로토콜 모두 컴퓨터의 특정 프로세스를 통해 전송되는 데이터는 포트(Port)를 이용한다. 포트는 16비트 정수로 표현되며 값은 0에서 65535까지 지정가능하다. 대표적으로 알려져있는 포트 넘버는 1024까지 예약되어 사용되고 있으며 구체적인 예로 ftp는 포트넘버로 21/tcp을 telnet은 포트넘버로 23/tcp을 그리고 http는 포트넘버 80/tcp,udp으로 사용된다. 따라서 우리가 포트넘버를 설정할 일이 있을때는 이미 예약되어 사용되고 있는 1024까지의 포트넘버는 충돌방지를 위해 사용하지 말고 1025부터 그 이상의 포트넘버를 사용하는 것이 신상(?)에 좋을 것이다.^^


그림을 참조하면서 패킷이 어떻게 전달되는지 살펴보자. 우리가 말로는 ftp에 연결한다 하지만 클라이언트에서 서버로 ftp를 사용하겠다고 요청할때는 포트 21로 연결을 시도한다. http를 사용하려고 하면 포트넘버 80번으로 연결한다. 즉 서버에서는 포트넘버로 클라이언트가 ftp를 사용할건지 http를 사용할건지 알수 있는 것이다. 클라이언트에서 포트넘버 21로 연결요청을 하면 ftp 서버와 연결시켜주고 80으로 요청하면 http 서버로 연결하는 식이다.


자 이렇게 설명해도 이해가 되지 않았다면 지금 위에 있는 그림 한장이 여러분의 갈증을 풀어주리라 믿는다.^^ 백문이 불여일견인지라 설명만 줄창 하는것보다는 한번 보는게 나을것이라는 생각에 올렸는데 이제 막힌 속이 뻥뻥 뚫리고 있길 바란다. 사실 조금전에 이와같은 계층구조를 도표로 언급하였지만 아마 그때는 그냥 무심코 지나친 이가 태반이었을 것이다. 그런 이들은 후에 본 단원을 한번 더 읽어보기 바란다.^^


방금 우리가 배운 포트와 응용 프로그램들을 연결시켜주는게 아까 말했던 소켓(socket)이다. 너무 자세히 해서 혼란스럽다면 조금 위로 올라가서 소켓 관련 부분을 다시 읽어보기 바란다. 이제는 머리 회전이 팍팍 될것이다.^^ 왜 이렇게 같은 얘기를 이리치고 저리치고 했느냐면 바로 우리가 자바에서 공부할 부분이 바로 Socket 클래스이기 때문이다. 자바에서는 통신 네트워크 프로그램을 Socket 클래스로 제작가능하다. 쉽게 말해서 서버와 클라이언트를 이어 서로 정보를 주고 받을수 있는 통신 프로그램을 우리가 Socket을 이용해 만들수 있다는 것이다.

프로그래밍 관점에서 소켓을 간단히 설명하자면 클라이언트의 소켓(Socket)과 서버의 소켓(Socket)이 있는데 중간에 이를 연결시켜주는 서버소켓(ServerSocket)이 있다. 서버소켓이 하는 일은 클라이언트가 접속하기를 기다리고 접속을 시도하면 서버의 소켓을 만들어서 클라이언트의 소켓과 연결해주고 다시 계속해서 다른 클라이언트가 접속하기를 기다리고 접속 시도를 하면 위와같이 연결해주는 일을 반복한다. 아래 그림에서 특히 화살표들을 유심히 쳐다보고 있으면 알기 싫어도 알게 될것이다.^^


아직까지 이해가 안된 이들을 위해 간략하게 덧붙이자면 소켓끼리 놀도록 만들면 연결된다는 것이다. 아래 그림을 보면 이해가 더 빠를지도 모르겠다.


자바에서 이렇게 Socket 클래스를 이용해서 프로그래밍하는 것을 거창한 말(?)로 TCP 프로그래밍이라고 하는데 네트워크에 관련해서 집중적으로 알아야되는 자바 패키지가 있다. 무엇일까나? ㅎㅎ 바로~ 바로~~ java.net 패키지이다. 이름에서 뭔가 풍기지 않는가? net? 그렇다 바로 네트워크 냄새를 솔솔 풍기는 것처럼 관련 클래스들도 네트워크에 관한 클래스들로 꽉꽉 차 있다. 그럼 한번 살펴보자.^^


위의 java.net 패키지는 네트워크 프로그래밍에서 여러분이 앞으로 만들 클라이언트 프로그램과 서버 프로그램들을 보다 심플하고 빠르게 발전시킬수 있는 최적의 솔루션을 제공할 것이다. 위의 그림만 봐도 관련 패키지 이해는 더할나위없이 충분할터이지만 필자가 워낙 자상(?)한지라 여러분을 위해 더 간결하게 해당 패키지에 대해서 정리하며 오늘은 여기서 마칠터이니 다음 시간까지 java.net 패키지는 이해가 되던 안되던 라이브러리에서 한번쯤은 꼭 훓어보고 오는 정성을 보여주기 바란다.^^

java.net 패키지 구성

Interfaces
* ContentHandlerFactory
* FileNameMap
* SocketImplFactory
* URLStreamHandlerFactory

Classes
* ContentHandler
* DatagramPacket
* DatagramSocket
* DatagramSocketImpl
* HttpURLConnection
* InetAddress
* MulticastSocket
* ServerSocket
* Socket
* SocketImpl
* URL
* URLConnection
* URLEncoder
* URLStreamHandler

Exceptions
* BindException
* ConnectException
* MalformedURLException
* NoRouteToHostException
* ProtocolException
* SocketException
* UnknownHostException
* UnknownServiceException