본문 바로가기

카테고리 없음

자바 NIO 네트워크 프로그래밍 공부

반전을 조심해야 한다. 겪어보면 기분이 착잡하면서 쓴 약이 되는 반전이 있다. 어제까지만 해도 ‘이 정도면 이 분야 잘아는 것 아닌가~’ 라는 생각을 가지고 있었는데 ‘기초도 모르는구나~’ 라는 착잡한 반전을 경험했다.

어느정도 안다고 생각한 분야의 프로그램에 에러가 발생했는데 하루종일 매달려도 잡히지가 않았다. 그 분야에 정통한 아는 형에게 전화했는데 형이 조언해줘도 내가 못 알아들으니깐 형이 참다가 한마디 던진다.

‘너 기초도 몰라서 얘기가 안 된다. 책좀 읽고 다시 물어봐~!’ 형다운 충고였는데 틀린말이 아니었다. 내가 해결해야될 에러는 까마득한 바다속에 빠진 소중한 물건과 같은데, 까마득한 바다속 길은 깜깜하여 알 수가 없었다. 그래도 해결해야 되니 방법을 찾아보자”


지금 문제가 터진 분야가 ‘네트워크 프로그래밍’ 입니다. 가끔씩 제가 아파치 미나(Apache MINA)를 이용하여 서버 모듈을 만들고 있다고 얘기한적이 있는데요. 오늘 제대로 문제가 터졌습니다. 그런데 이 문제는 자바 NIO와 TCP/IP의 기초 지식을 알아야만 접근가능한 문제였습니다.

기초가 부족한 저는 오늘 문제를 해결 못하고 집에 왔습니다. 마침 IBM developerWorks 리뷰를 쓰려고 했는데 자바 NIO 기사가 있으면 ,공부하면서 에러 접근에 실마리를 찾으면 좋겠다는 생각이 들더군요. 마침 자바 NIO 기사가 있어서 소개합니다.



NIO는 Blocking I/O의 단점을 보완하기 위해 자바1.4부터 추가되었다.

Blocking I/O의 단점은 말 그대로 하나의 작업이 끝날때까지 동시에 다른 작업을 할 수 없다는 것이다.

이 문제를 해결하는 방법은 스레드를 여러 개 생성하는 방법이 있는데 대신 스레드 과부하 등의 치명적인 문제가 발생한다.

Blocking I/O의 문제를 해결한 NIO의 새로운 접근 방법은 Reactor 패턴이다.

Reactor 패턴은
1. 이벤트 중심의 애플리케이션이,
2. 하나 이상의 클라이언트로부터,
3. 하나의 애플리케이션으로 ‘동시에’ 전달되는 요청들을 나눠
4. 각 요청이 원하는 목적지로 보내주는 역할을 수행한다.

좀더 기술적인 관점에서 설명하면,
1. 클라이언트의 모든 요청을 우선 큐에 저장하고,
2. 큐를 모니터링하는 스레드에 신호를 보낸다.
3. 신호를 받은 큐 모니터링 스레드는 큐에 저장된 요청의 목적지를 분석해서 해당 목적지로 보내준다. – 한빛미디어 자바IO/NIO 네트워크 프로그래밍 참고

NIO의 구성요소에는 3가지가 있고 각각의 역할을 단순하게 다음과 같이 정리했다.
1. 버퍼(데이터 그릇)
2. 채널(연결 파이프)
3. 셀렉터(요청 큐 관리자)

사용자 삽입 이미지

이제 실제 NIO 프로그래밍을 구성할 때는
1. 셀렉터를 생성하고,
2. 셀렉터에 채널을 등록한다.
3. 채널 양 끝단의 데이터 교환은 버퍼를 사용한다.

일단 IBM developerWorks의 기사와 NIO 관련책을 공부하면서 위와 같이 정리했는데요. 미흡한 부분은 피드백 해주시고, 자세한 내용은 아래의 IBM developerWorks 링크를 참고해 주시길 바랍니다.


부디 내일은 에러 해결했으면 좋겠습니다.