부제: NIO부터 Netty까지


Introduction


인터넷 사용 인구의 폭발적인 증가와 글로벌한 소셜서비스들로 인해 대용량 트래픽처리와 데이터캐싱, 비동기처리 등은

현대의 서버 개발환경에서 늘 마주하게 되는 주제들입니다.

5주차스터디에서는, JDK1.4+ 부터 제공되는 NIO와 이를 wrapping한 Netty를 학습하고, 효율적인 방법을 토론합니다.

JAVA IO 기본

Java IO 성능 이슈

기존의 자바 IO는 커널 버퍼를 직접 핸들링 할 수 없어서 느리다.

 

 

기존 자바 IO는 Blocking IO 라서 느리다!

 Thread와 동시성 문제

Thread Life Cycle

 

JAVA NIO(new IO)

개요 ? Non-blocking I/O

NIO는 왜 등장한 것인가?

Channel 

NIO는 기존의 Java I/O보다 왜 더 빠른가?

NIO는 Direct Buffer 로 커널 버퍼를 직접 핸들링하기 때문에 빠르다!
NIO에서 System Call을 간접적으로 사용가능하게 해주기 때문에 빠르다!

NIO 사용하기

Reactor Pattern

네트워크 개발 패턴

Netty

NIO기반의 라이브러리

NIO 참고 문서

Java IO, NIO에 대한 초간단 예제

 

윈도우즈 파일시스템 이론

http://cappleblog.co.kr/538

 윈도우즈 8 파일시스템 refs

http://www.infoq.com/news/2012/01/ReFS

 

Java IO로 파일 읽고, 쓰기(또는 다른 예제)

Java NIO로

웹 서버 구현

프로세스(Process): 컴퓨터에서 연속적으로 실행되고 있는 프로그램을 말하는 것으로 여러개의 프로세서를 사용하면 멀티프로세싱이고 여러개의 프로그램을 같은 시간에 시분할 방식으로 돌리면 멀티태스킹이라 말한다.

쓰레드(Thread): 프로세스내에서 실행되는 흐름의 단위를 말하는 것으로 하나의 프로그램은 최소한 하나의 쓰레드(main thread)를 가진다. 프로그램에 따라 둘 이상의 쓰레드를 동시에 실행할수 있는데 이를 멀티쓰레드라고 부른다.

Java 기본 IO를 활용한 웹 서버 구현

  public class StudyServer {
    private String final int PORT = 8080;

    public static void main(String ar[])throws IOException{
          //서버생성
         HttpServer server = HttpServer.create(new InetSocketAddress(PORT) , 0);
       //context생성
       server.createContext("/study", new WebServerHandler());
      server.start();
      System.out.println("server started..");
    }


    private static class WebServerHandler implements HttpHandler{
       public void Handle(HttpExchange t) throws IOException{
         System.out.println("Accepted");
            String response ="i `m web server";
          t.sendResponseHandlers(HttpURLConnection.HTTP_OK.response.lengh() );
            OutputStream os = t.getResponseBody();
            os.write( response.getBytes() );
            System.out.println("complete");
            os.close();
        }
    }
}

 

Java NIO를 활용한 웹 서버 구현

실습계획

 

sllip study.pptx

 

서버를 만들기 위한 Tip

public class ShutdownTutorial {
	public void addShutdownHandler() {
		Runtime.getRuntime().addShutdownHook(new Thread(){
			@Override
			public void run(){
				System.out.println("프로그램이 종료되었을 때 동작합니다.");
                         @Todo
                          //사용자 최종 변경 내역 저장, 로그 저장 , 최종 세션 저장
			}
		});
	}
	
	public static void main(String ar[]){
		ShutdownTutorial tutorial = new ShutdownTutorial();
		tutorial.addShutdownHandler();
		System.out.print("프로그램을 종료합니다.\n");
		System.exit(0);
	}
}

참고자료