Download presentation
Presentation is loading. Please wait.
1
19장. NIO 기반 입출력 및 네트워킹
2
1절. NIO 소개 2절. 파일과 디렉토리 3절. 버퍼(Buffer) 4절. 파일 채널(FileChannel) 5절. TCP 동기(블로킹) 채널 6절. TCP 넌블로킹 채널 7절. UDP 채널 8절. 비동기 파일 채널 9절. TCP 비동기 채널
3
1절. NIO 소개 NIO(New Input/Output) 기존 java.io API와 다른 새로운 입출력 API
자바4부터 추가 자바7부터 네트워크 지원 강화된 NIO.2 API 추가 관련 패키지
4
1절. NIO 소개 IO와 NIO의 차이점 스트림 vs. 채널 IO 스트림: 입력 스트림과 출력 스트림으로 구분되어 별도 생성
5
1절. NIO 소개 IO와 NIO의 차이점 넌버퍼 vs. 버퍼 IO 스트림 - 넌버퍼(non-buffer)
보조 스트림인 BufferedInputStream, BufferedOutputStream를 사용해 버퍼 제공 가능 스트림으로부터 입력된 전체 데이터를 별도로 저장해야 저장 후 입력 데이터의 위치 이동해가면서 자유롭게 이용 가능 NIO 채널 - 버퍼(buffer) 기본적으로 버퍼 사용해 입출력 - 성능 좋음 읽은 데이터를 무조건 버퍼(Butter: 메모리 저장소)에 저장 버퍼 내에서 데이터 위치 이동해 가며 필요한 부분만 읽고 쓸 수 있음
6
1절. NIO 소개 IO와 NIO의 차이점 블로킹 vs 넌블로킹 IO 스트림 - 블로킹 입력 스트림의 read() 메소드 호출
데이터 입력 전까지 스레드는 블로킹(대기상태) 출력 스트림의 write() 메소드 호출 데이터 출력 전까지 스레드는 블로킹 스레드 블로킹 -다른 일을 할 수가 없고 interrupt 해 블로킹 빠져나올 수도 없음 블로킹을 빠져 나오는 유일한 방법 - 스트림을 닫는 것 NIO 채널 – 블로킹, 넌블로킹 NIO 블로킹은 스레드를 interrupt 함으로써 빠져나올 수 있음 NIO는 넌블로킹 지원 입출력 작업 시 스레드가 블로킹되지 않음 준비 완료된 채널을 선택하는 기능!!!
7
1절. NIO 소개 네트워크 프로그램 개발 시 IO와 NIO의 선택 IO 방식 선택하는 경우 NIO 방식 선택하는 경우
연결 클라이언트의 수가 적고, 전송되는 데이터가 대용량이면서 순차적으로 처리될 필요성 있을 경우 NIO 방식 선택하는 경우 연결 클라이언트의 수가 많고 전송되는 데이터 용량이 적으면서, 입출력 작업 처리가 빨리 끝나는 경우
8
2절. 파일과 디렉토리 파일 관련 패키지 경로 정의(Path) IO는 파일의 속성 정보 읽기 위해 File 클래스만 제공
NIO는 좀 더 다양한 파일의 속성 정보 제공 클래스와 인터페이스를 java.nio.file, java.nio.file.attribute 패키지에 서 제공 경로 정의(Path) java.nio.file.Path 인터페이스 IO의 java.io.File 클래스에 대응 NIO의 여러 곳에서 파일 경로 지정 위해 Path 사용 Path 구현 객체 java.nio.file.Paths 클래스의 정적 메소드인 get() 메소드로 얻음 얻고 싶은 정보에 따른 메소드는 p.1103~1105 참조
9
2절. 파일과 디렉토리 파일 시스템 정보(FileSystem) 운영체제의 파일 시스템은 FileSystem인터페이스 통해 접근
FileSystem 구현 객체는 FileSystems의 정적 메소드인 getDefault()로 얻을 수 있음 FileSystem에서 제공하는 메소드 파일 시스템 정보 출력 예제 p. 1106
10
2절. 파일과 디렉토리 파일 및 디렉토리 생성/삭제 및 속성 읽기(Files) 와치 서비스(WatchService)
java.nio.file.Files 클래스 파일과 디렉토리의 생성 및 삭제, 이들의 속성을 읽는 메소드 제공 속성: 숨김, 디렉토리 여부, 크기, 소유자… 제공 메소드 참조해 파일 속성 읽고 출력 (p.1107~1109) 와치 서비스(WatchService) 디렉토리의 내용 변화 감시 (p.1110~1114) 자바 7에서 처음 소개 디렉토리내의 파일의 생성, 삭제, 수정 감시 적용 사례 에디터 바깥에서 파일 내용 수정하면 파일 내용이 변경됐으니 파일을 다시 불러올 것인지 묻는 대화상자 띄움
11
3절. 버퍼 버퍼(Buffer) 버퍼는 읽고 쓰기 가능한 메모리 배열
NIO에서는 데이터를 입출력을 하기 위해서는 항상 버퍼 사용
12
3절. 버퍼 Buffer 종류 분류 기준 저장되는 데이터 타입에 따라 분류
ByteBuffer, CharBuffer, IntBuffer, DoubleBuffer NIO 버퍼는 저장되는 데이터 타입에 따라 별도의 클래스로 제공 이들 버퍼 클래스들은 Buffer 추상 클래스 모두 상속 MappedByteBuffer는 파일의 내용에 랜덤하게 접근하기 위해서 파일의 내용을 메모리와 맵핑시킨 버퍼
13
3절. 버퍼 Buffer 종류 분류 기준 어떤 메모리를 사용하느냐에 따른 분류
다이렉트(Direct)와, 넌다이렉트(NonDirect) 버퍼 P.1115~1118 예제에서 버퍼 속도 차이만 확실히 이해
14
3절. 버퍼 Buffer 생성 allocate() 메소드(넌다이렉트 버퍼 생성) wrap() 메소드(넌다이렉트 버퍼 생성)
각 데이터 타입 별 넌다이렉트 버퍼 생성 매개값 - 해당 데이터 타입의 저장 개수 Ex) wrap() 메소드(넌다이렉트 버퍼 생성) 이미 생성되어 있는 타입 별 배열을 래핑해 버퍼 생성 일부 데이터만 가지고도 버퍼 생성 가능!
15
3절. 버퍼 allocateDirect() 메소드(다이렉트 버퍼 생성)
JVM 힙 메모리 바깥쪽 (운영체제가 관리하는 메모리)에 다이렉트 버퍼 생성 각 타입 별 Buffer 클래스에는 없고 ByteBuffer 에서만 제공 asXXXBuffer() 메소드(각 타입 별 다이렉트 버퍼 생성) asCharBuffer(), asShortBuffer(), asIntBuffer(), asLongBuffer(), asFloatBuffer(), asDoubleBuffer() 우선 다이렉트 ByteBuffer를 생성하고 호출 초기 다이렉트 ByteBuffer 생성 크기에 따라 저장 용량 결정
16
3절. 버퍼 byte 해석 순서(ByteOrder)
운영체제는 두 바이트 이상을 처리할 때 처리 효율이나 CPU 디자인 상의 문제로 바이트 해석 순서를 정함 데이터를 외부로 보내거나 외부에서 받을 때도 영향 미치기 때문에 바이트 데이터를 다루는 버퍼도 이를 고려해야 ! Big endian: 앞 바이트부터 먼저 처리 Little endian: 뒤 바이트부터 먼저 처리
17
3절. 버퍼 byte 해석 순서(ByteOrder) 운영 체제가 사용하는 바이트 해석 순서 확인 방법
JVM은 동일한 조건으로 클래스 실행해야 하므로 무조건 Big endian Little endian으로 동작하는 운영체제에서 만든 데이터 파일을 Big endian로 동작하는 운영체제에서 읽어 들여야 한다면 ByteOrder 클래스 로 데이터 순서를 맞춰야 운영체제와 JVM의 바이트 해석 순서가 다를 경우 JVM이 운영체제와 데이터 교환 할 때 자동 처리 다이렉트 버퍼를 이용할 경우 운영체제의 native I/O를 사용 운영체제의 기본 해석 순서로 JVM의 해석 순서를 맞추는 것이 성능에 도움
18
3절. 버퍼 Buffer의 위치 속성(position, limit, capacity, mark)
사용 전 위치 속성의 개념, 속성이 언제 변경되는지 알고 있어야 position, limit, capacity, mark 속성의 크기 관계
19
3절. 버퍼 위치 속성을 이해를 위한 쓰기 모드 예 (p.1123~1126) 먼저 배열에 데이터 저장
읽기 모드로 변경하기 위해 flip() 메소드 호출 현재 position의 위치를 기억시키기 위해 mark() 호출 position을 mark 위치로 이동하기 위해 reset() 호출 버퍼를 되감아 처음부터 읽기 위해 rewind() 호출 버퍼의 위치 속성을 초기화하기 위해 clear() 호출
20
3절. 버퍼 Buffer 메소드 공통 메소드: Buffer 추상 클래스에 정의된 메소드
21
3절. 버퍼 데이터를 읽고 저장하는 메소드 데이터 읽기: get(…) 데이터 저장: put(…)
Buffer 추상 클래스에는 없고, 각 타입 별 하위 Buffer 클래스가 가짐 상대적(Relative) 메소드 현재 위치 속성인 position에서 데이터를 읽고 저장 상대적 get()과 put() 메소드 호출하면 position 값 증가 position 값이 limit 값까지 증가한 상태 상대적 get() 사용 - BufferUnderflowException 예외 발생 상대적 put() 사용 - BufferOverflowException 예외 발생
22
3절. 버퍼 데이터를 읽고 저장하는 메소드 절대적(Absolute) 메소드 상대적과 절대적 메소드 구분 방법
position과 상관없이 주어진 인덱스에서 데이터 읽고 저장 절대적 get()과 put() 메소드를 호출하면 position의 값은 증가되지 않음 상대적과 절대적 메소드 구분 방법 상대적 메소드: index 매개값이 없는 메소드 절대적 메소드: index 매개값이 있는 메소드 상세 메소드는 1127~1128 페이지 참조
23
3절. 버퍼 버퍼 예외의 종류 버퍼 예외 발생 주요 원인 버퍼와 관련된 예외 클래스
버퍼가 다 찼을 때, 데이터를 저장하려는 경우 버퍼에서 더 이상 읽어올 데이터가 없을 때 데이터를 읽으려는 경우 버퍼와 관련된 예외 클래스 데이터 위치 속성 값의 변화 예제 통해 예외 발생 상황 이해 P.1129~1132
24
3절. 버퍼 Buffer 변환 채널이 데이터를 저장하고 읽는 버퍼는 모두 ByteBuffer
P. 1132~1136 Ex 1): ByteBuffer에 특정 문자셋으로 인코딩 된 바이트들이 저장 디코딩 된 CharBuffer로 변환 후 문자열을 얻어야 Ex 2): ByteBuffer에 정수 바이트들이 저장되어 있을 경우 IntBuffer로 변환해서 읽어야 Ex 3): CharBuffer와 IntBuffer의 내용을 채널로 출력할 경우 ByteBuffer로 변환해야
25
4절. 파일 채널 파일 채널(FileChannel) 파일 읽기와 쓰기 가능하게 해주는 역할
동기화 처리가 되어 있기 때문에 멀티 스레드 환경에서 사용해도 안전
26
4절. 파일 채널 FileChannel 생성과 닫기
FileInputStream, FileOutputStream의 getChannel() 메소드 호출 FileChannel.open() 첫 번째 path 매개값 - 열거나, 생성하고자 하는 파일 경로 두 번째 options 매개값 - 열기 옵션 값 StandardOpenOption 의 다음 열거 상수 채널 닫기: FileChannel을 더 이상 이용하지 않을 경우
27
4절. 파일 채널 파일 쓰기와 읽기 파일 쓰기 파일 읽기
파일에 쓰여지는 바이트는 ByteBuffer의 position 부터 limit 까지 파일 읽기 파일에서 읽혀지는 바이트는 ByteBuffer의 position부터 저장 버퍼에 한 바이트를 저장할 때마다 position이 1씩 증가 버퍼에 저장한 마지막 바이트의 위치는 position-1 인덱스까지 한 번 읽을 수 있는 최대 바이트 수는 position부터 ByteBuffer의 capacity까지 리턴값은 파일에서 ByteBuffer로 읽혀진 바이트 수 0~(position-1)까지의 바이트 수 더 이상 읽을 바이트가 없다면 read() 메소드는 -1 리턴
28
4절. 파일 채널 파일 복사 두 개의 FileChannel 이용 Files.copy() 메소드 이용
첫 번째 source 매개값에는 원본 파일의 Path 객체 지정 두 번째 target 매개값에는 타겟 파일의 Path 객체 지정 세 번째 매개값은 StandardCopyOptoin 열거 상수를 목적에 맞게 나열
29
5절. 파일 비동기 채널 FileChannel의 단점 AsynchronousFileChannel
read()와 write() 메소드는 작업하는 동안 블로킹 블로킹 동안에 UI 갱신이나 이벤트 처리를 할 수 없음 따라서 별도의 작업 스레드를 생성해서 이들 메소드를 호출해야 동시에 처리해야 할 파일 수가 많다면 스레드 수 증가로 문제 유발 가능 AsynchronousFileChannel read()와 write() 메소드는 즉시 리턴 이들 메소드는 스레드풀에게 작업 처리를 요청하고 즉시 리턴 작업 스레드가 파일 입출력 완료 - 콜백(callback) 메소드 자동 호출 불특정 다수의 파일 및 대용량 파일의 입출력 작업 시 유리
30
5절. 파일 비동기 채널 AsynchronousFileChannel의 동작
31
5절. 파일 비동기 채널 AsynchronousFileChannel 생성과 닫기 파일 읽기와 쓰기 (p.1144~1150)
생성 – 정적 메소드 open() 사용 닫기 – 채널을 더 이상 쓰지 않을 때 파일 읽기와 쓰기 (p.1144~1150) 매개변수 dst, src: 읽거나 쓰기 위한 ByteBuffer position: 파일에서 읽을 위치이거나 쓸 위치 attachment: 콜백 메소드로 전달할 첨부 객체 handler: CompletionHandler<Integer, A> 구현 객체 CompletionHandler<Integer, A> Integer: 입출력 작업 처리 후 결과 타입 (결과값은 읽거나 쓴 바이트 수) (고정) A: 첨부 객체 타입으로 첨부 객체가 필요 없다면 Void 지정(개발자 지정)
32
6절. TCP 블로킹 채널 TCP 서버/클라이언트 세가지 구현 방식 블로킹 넌블로킹 비동기
연결요청, 연결수락, 입출력 작업 시 블로킹 넌블로킹 연결요청, 연결수락, 입출력 작업 시 넌블로킹 작업 처리 준비된 것만 셀렉터가 선택해서 처리하는 방식 비동기 스레드풀에서 처리 후 콜백 메소드 호출
33
6절. TCP 블로킹 채널 서버소켓 채널과 소켓채널의 용도 ServerSocketChannel SocketChannel
34
6절. TCP 블로킹 채널 서버소켓 채널 생성과 연결 수락 ServerSocketChannel 생성 연결 수락 닫기
IP 와 포트 정보를 리턴해 주는 메소드 연결 수락 닫기
35
6절. TCP 블로킹 채널 소켓 채널 생성과 연결 요청 (p.1152~1154) SocketChannel 생성과 연결 요청
클라이언트가 서버에 연결 요청할 때 쓰이는 소켓 닫기 클라이언트가 종료되거나, 필요에 따라 연결 끊을 때 Close() 서버가 열려있어야 클라이언트 통신 가능
36
6절. TCP 블로킹 채널 소켓 채널 데이터 통신 read()가 블로킹이 해제 + 리턴 되는 경우
37
6절. TCP 블로킹 채널 스레드 병렬 처리
38
6절. TCP 블로킹 채널 채팅 서버 및 클라이언트 구현 (p.1160~1178) 블로킹과 인터럽트
채팅 서버의 경우 스레드 풀, 서버 소켓채널, 소켓채널의 동작 확인 채팅 클라이언트의 경우 소켓채널의 동작을 유심히 확인 블로킹과 인터럽트 IO 소켓에서는 입출력 스트림에서 작업스레드가 블로킹 된 경우 다른 스레드가 작업 스레드의 인터럽트 메소드 호출해도 블로킹이 풀리지 않음 NIO 소켓 채널의 경우 인터럽트 만으로도 소켓채널이 닫히면서 블로킹 풀림
39
7절. TCP 넌블로킹 채널 넌블로킹(non-blocking) 방식의 특징 셀렉터가 작업 처리 준비된 채널 선택
connect(), accept(), read(), write() 메소드는 블로킹 없이 즉시 리턴 작업 처리 준비가 된 상태에서 메소드 실행할 것 작업 처리 준비가 된 채널만 선택해 처리 셀렉터가 작업 처리 준비된 채널 선택 넌블로킹 채널은 이벤트 리스너 역할 하는 셀렉터(Selector) 사용 채널이 작업 처리 필요할 경우 셀렉터에 통보 셀렉터는 통보한 채널 선택 멀티 채널 작업을 싱글 스레드에서 처리 가능 작업 스레드가 블로킹되지 않음 셀렉터가 선택한 채널들을 싱글 스레드에서 모두 처리 가능 스레드 풀 사용할 경우, 적은 수의 스레드로 많은 양의 작업 처리
40
7절. TCP 넌블로킹 채널 셀렉터(Selector)의 동작 원리
채널은 자신의 작업 유형을 키(SelectionKey)로 생성 셀렉터의 관심 키셋(interest-set)에 키 등록 셀렉터는 작업 처리 준비가 된 키를 선택 선택된 키셋에 별도로 저장 작업 스레드는 선택된 키셋에서 키를 하나씩 꺼냄 연관된 채널 작업 처리
41
7절. TCP 넌블로킹 채널 셀렉터 생성과 등록 셀렉터 생성 – Open() 메소드 호출해 생성
Exception 발생 가능하므로 예외처리 필요 넌블로킹 채널 생성 – 하위 클래스도 넌블로킹이어야. 셀렉터 등록 첫 번째 매개값은 Selector 두 번째 매개값은 작업 유형별 SelectionKey의 상수
42
7절. TCP 넌블로킹 채널 선택된 키셋 Selector의 select() 메소드 select() 메소드 종류
관심 키셋의 SelectionKey로부터 작업 처리 준비가 되었다는 통보 올 때 까지 블로킹 최소한 하나의 SelectionKey로부터 작업 처리 준비가 되었다는 통보가 오면 리턴 리턴값은 통보를 해온 SelectionKey의 수 select() 메소드 종류 주로 첫 번째 메소드를 많이 사용
43
7절. TCP 넌블로킹 채널 선택된 키셋 select()가 리턴 되는 경우 SelectionKey 의 작업 유형 변경
최소한 하나의 채널이 작업 처리 준비가 되었다는 통보를 할 때 Selector의 wakeup() 메소드를 호출할 때 select()를 호출한 스레드가 인터럽트될 때 SelectionKey 의 작업 유형 변경 Selector의 wakeup() 메소드 호출 블로킹되어 있는 select() 즉시 리턴 변경된 작업 유형을 감시하도록 select() 재실행 선택된 키셋 얻기 select() 메소드가 1 이상의 값을 리턴 할 경우 selectedKeys() 메소드로 작업 처리 준비된 SelectionKey들을 Set 컬렉션으로 얻음
44
7절. TCP 넌블로킹 채널 작업 스레드에서 채널 작업 처리
선택된 키셋에서 SelectionKey를 하나씩 꺼내어 작업 유형별 채널 작업 처리 SelectionKey가 어떤 작업 유형인지 알아내는 방법 다음 메소드 중 어느 것이 true를 리턴하는가 SelectionKey로 부터 채널 객체 얻기 첨부 객체 저장과 얻기 SelectionKey에 첨부해두고, 사용 attach() 메소드는 객체 첨부 attachment() 메소드는 첨부된 객체를 얻을 때 사용
45
7절. TCP 넌블로킹 채널 채팅 서버 및 클라이언트 구현 (p.1186~1195)
셀렉터와 넌블로킹 서버채널, 넌블로킹 채널의 작동 이해 클라이언트의 경우 고유한 데이터 저장의 필요성 있음 연결 수락 시 마다 Client 인스턴스 생성해 관리 넌블로킹 방식의 소켓 채널로 개발 가능하나 서버 구현에 넌블로킹이 주로 쓰임 실행 방법은 TCP 블로킹 방식과 동일
46
8절. TCP 비동기 채널 TCP 비동기 채널의 특징
connect(), accept(), read(), write()를 호출하면 즉시 리턴 실질적 입출력 작업 처리는 스레드 풀의 스레드가 담당 스레드가 작업 처리 완료하면 콜백 메소드 호출
47
8절. TCP 비동기 채널 read() 메소드 호출 예 애플리케이션에서 read() 메소드를 호출하면 즉시 리턴
작업 스레드가 read() 메소드를 모두 실행하고 나면 completed() 콜백 completed() 메소드 실행하는 스레드는 스레드풀의 작업 스레드
48
8절. TCP 비동기 채널 비동기 채널 그룹 생성 및 종료 비동기 채널 그룹(AsynchronousChannelGroup)
같은 스레드풀 공유하는 비동기 채널들의 묶음 하나의 스레드풀을 사용한다면 모든 비동기 채널은 같은 채널 그룹
49
8절. TCP 비동기 채널 비동기 채널 그룹 생성 비동기 채널 그룹 종료
비동기 채널 생성할 때 채널 그룹 지정하지 않으면 기본 비동기 채널 그룹 기본 비동기 채널 그룹은 내부적으로 생성되는 스레드풀 이용 비동기 채널 그룹 종료 shutdown() 비동기 채널 그룹을 종료하겠다는 의사만 전달 즉시 비동기 채널 그룹을 종료하지 않음 비동기 채널 그룹에 포함된 모든 비동기 채널이 닫히면 종료 새로운 비동기 채널을 포함시키려고 하면 ShutdownChannelGroupException이 발생 shutdownNow() 강제적으로 비동기 채널 그룹에 포함된 모든 비동기 채널 닫고 비동기 채널 그룹을 종료 완료 콜백 실행하고 있는 스레드는 종료되거나 인터럽트 X
50
8절. TCP 비동기 채널 비동기 서버소켓 채널 생성 및 연결 수락 (p.1199~1201)
기본 비동기 채널 그룹에 포함되는 비동기 서버 채널 생성 새로 생성한 비동기 채널 그룹에 포함되는 비동기 서버 채널 생성 포트 바인딩 더 이상 소켓 채널이 사용되지 않으면 닫기 연결 수락 첫 번째 매개값은 콜백 메소드의 매개값으로 제공할 첨부 객체 두 번째 매개값은 콜백 메소드를 가지고 있는 CompletionHandler<AsynchronousSocketChannel, A> 구현 객체 비동기 소켓 채널 (p.1202~1204) 클라이언트와 서버 연결 후의 통신
51
8절. TCP 비동기 채널 채팅 서버, 클라이언트와 UI 구현 P.1204~1218
비동기 서버소켓채널과 비동기 소켓채널 사용법 이해 서버에는 다수의 클라이언트가 붙는다는 것을 전제로 작업 UI의 경우는 TCP 동기채널의 작동과 동일
52
9절. UDP 채널(DatagramChannel)
NIO에서의 UDP 채널 DatagramChannel 동기(블로킹)과 넌블로킹 방식 모두 사용 가능 발신자 만들기 DatagramChannel 생성 - Open() 사용 Open() 할 때 ProtocolFamily 타입 매개값 StandardProtocolFamily 열거 상수 IPv4, IPv6 구분하기 위함 데이터 보내기 – send() 사용 닫기 – close() 사용
53
9절. UDP 채널(DatagramChannel)
수신자 만들기 DatagramChannel 생성 및 포트 바인딩 – open(), bind() 데이터 받기 데이터 받기 전까지 receive() 메소드 블로킹, 데이터 받으면 리턴 작업 스레드를 생성해 receive() 메소드 반복적 호출 작업 스레드 종료 방법 작업 스레드의 interrupt() 호출시켜 ClosedByInterruptException 예외 발생 DatagramChannel의 close() 호출시켜 AsynchronousCloseException 예외 발생 예외가 발생되면 예외 처리 코드에서 작업 스레드 종료 닫기
Similar presentations