목록전체 글 (323)
삶 가운데 남긴 기록 AACII.TISTORY.COM
Web Service 네트워크상 분산된 자원들을 연동하여 자원을 공유하는 서비스입니다. SOAP기반 웹 서비스와 RESTful 기반 웹서비스가 있습니다. SOAP(Simple Object Access Protocol)는 XML로 이루어진 WSDL(Web Services Description Language) 자원(data)을 UDDI라는 전역 서비스 저장소에 등록(publish)하여 공개하면 서비스 요청자가 검색 후 SOAP프로토콜을 이용하여 메시지를 주고받는 방식입니다. SOAP envelope + SOAP header + SOAP body로 구성된 XML 메시지를 주고 받습니다. 내용이 많아서 무겁고, UDDI를 거쳐야하고, 개발환경이 지원해줘야 하므로 한계점이 명확합니다. RESTful은 리소스를 ..
REST Client REST API를 이용하여 서버가 리소스를 제공하는 경우 클라이언트 측에서 리소스를 받기 위해 REST Client API가 필요합니다. 그중 하나인 OkHttp 라이브러리를 이용해 JAVA용 REST Client를 구현하는 예제를 소개합니다. OkHttp OkHttp는 Square 에서 만든 간편하게 REST API나 http기반의 요청 응답을 처리할 수 있는 라이브러리입니다. 오픈소스로 공개된 소프트웨어입니다. https://github.com/square/okhttp GitHub - square/okhttp: Square’s meticulous HTTP client for the JVM, Android, and GraalVM. Square’s meticulous HTTP cli..
byte는 8 bits 2진법(0 or 1)으로 표현된 데이터 입니다. 16진법은 0~9, A~F 까지 기호를 사용하여 숫자를 표현(코딩)하는 방식입니다. 64진법은 0~9, a~z, A~Z, +, / 기호를 이용하여 숫자를 표현(코딩)하는 방식입니다. byte array 는 2진수로 이루어진 데이터 입니다만 사람이 읽기 어려우므로 16진법(Hex digits)이나 64진법(base64)으로 변환하여 2진수의 배열(byte array)을 문자처럼 사용하기도 합니다. java에서 byte 데이터를 16진수 String으로 바꿀 때 보통 아래와 같은 소스 코드를 이용합니다. Integer.toString(((int) bytedata & 0xff)+0x100, 16).substring(1); Integer.t..
Base64는 64진법이라는 뜻입니다. 디지털 신호인 2진법은 너무도 길어서 8진법이나 16진법 등으로 묶어서 표현 하기도 합니다. 64진법은 영어권의 ASCII 문자들을 써서 표현 할 수 있는 가장 큰 진법인데 그래서 Base64는 전자 메일을 통한 2진 데이터 전송에 많이 쓰이고 있습니다. 보통 알파벳 대문자 A~Z, 소문자 a~z, 숫자0~9, 그리고 마지막 두 개를 어떤 기호를 쓰느냐의 차이만 있습니다. Base64의 정확한 규격은 RFC 1421, RFC 2045에 정의 됩니다. 연속된 8비트를 인코딩하도록 정의되어 있습니다. 인코딩된 결과는 padding된 비트 때문에 원본보다 용량이 4/3 정도 늘어나게 됩니다. 2진(binary)데이터를 알파벳 등으로 변환하는 것이기 때문에 이미지 데이터도..
비동기 채널 비동기 채널은 non-blocking 방식으로 동작하는데 차이점은 스레드 풀에게 작업 처리를 요청하고 즉시 리턴한뒤 콜백 메소드를 호출하여 작업 완료 후 실행되는 코드들은 콜백 메소드에 담아서 처리하는 방식입니다. 비동기 채널 그룹 비동기 채널 그룹은 같은 스레드 풀을 공유하는 비동기 채널들의 모음이라고 할수 있습니다. 하나의 스레드 풀을 사용한다면 모든 비동기 채널은 같은 채널 그룹에 속해야 합니다. 채팅 서버(비동기 채널 방식) import java.io.IOException; import java.net.InetSocketAddress; import java.nio.ByteBuffer; import java.nio.channels.AsynchronousChannelGroup; impor..
Non-Blocking 블로킹 방식은 accept()에서 블로킹 되고, read() 메소드도 데이터를 읽을 준비를 위해 블로킹 됩니다. 그래서 연결된 SocketChannel당 하나의 스레드가 할당되어야 합니다. 그래서 연결된 클라이언트 수가 많으면 스레드 풀(ExecutorService)를 사용했었습니다. 그런데 non-blocking 방식에서는 connect(), accept(), read(), write() 메소드에서 블로킹을 하지 않습니다. non-blocking방식에서는 요청이 없거나 데이터를 보내지 않으면 null이나 0을 즉시 리턴하며 버퍼에는 아무 데이터도 저장되지 않습니다. 그래서 Selector를 사용해서 이벤트 리스너 역할을 합니다. Non-blocking 채팅 서버 import ja..
TCP 블로킹 채널 NIO에서는 non-blocking과 blocking 동기와 비동기 모두 제공하고 있습니다. ServerSocketChannel은 클라이언트의 SockeChannel의 연결 요청을 수락하고 SocketChannel을 생성 한 후에 서버와 클라이언트간 통신을 수행합니다. 소켓 채널 연결 및 데이터 전송 서버측 예제 import java.io.IOException; import java.net.InetSocketAddress; import java.nio.ByteBuffer; import java.nio.channels.ServerSocketChannel; import java.nio.channels.SocketChannel; import java.nio.charset.Charset; p..
java.nio.channels.FileChannel 파일 채널을 통해 파일 읽기 쓰기를 할수 있습니다. 동기화 처리가 되어 있어서 멀티 스레드 환경에 안전하게 사용할 수 있습니다. 파일 생성 및 쓰기 import java.io.IOException; import java.nio.ByteBuffer; import java.nio.channels.FileChannel; import java.nio.charset.Charset; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.StandardOpenOption; public class FileChannelWriteEx { ..
direct buffer / non-direct buffer direct buffer는 운영체제가 관리하는 메모리 공간을 사용하는 버퍼이고, non-direct buffer는 JVM이 관리하는 힙 메모리 공간을 이용하는 버퍼입니다. direct buffer가 버퍼의 생성은 느리지만 버퍼의 크기가 더 크고 성능이 더 높습니다. 생성시 allocateDirect() 메소드로 생성하면 direct버퍼로 생성되고 allocate()메소드로 생성하면 non-direct로 생성됩니다. Buffer import java.nio.ByteBuffer; import java.nio.CharBuffer; import java.nio.IntBuffer; public class BufferCapacityEx { public s..
NIO java.nio: 다양한 버퍼 클래스들 java.nio.channels: 파일채널, TCP채널, UDP채널 등 java.nio.charset: 문자셋, 인코더, 디코더 java.nio.file: 파일 IO/NIO 차이점 IO는 입출력을 스트림 방식(단방향 입출력)이지만 NIO는 채널 방식(양방향 입출력)입니다. IO는 버퍼가 없으나 NIO는 버퍼를 제공합니다. IO는 비동기방식을 지원하지 않지만 NIO는 비동기 방식을 지원합니다. IO는 블로킹방식이지만 NIO는 블로킹과 논블로킹 모두 지원합니다. NIO는 불특정 다수의 클라이언트 연결을 비동기로 처리할 수 있어서 과도한 스레드 생성을 피할 수 있습니다. 그래서 NIO는 클라이언트 수가 많고 하나의 입출력이 오래 걸리지 않는 작업에 적합합니다. 반..
InetAddress import java.net.InetAddress; import java.net.UnknownHostException; public class InetAddressEx { public static void main(String[] args) { try { InetAddress local = InetAddress.getLocalHost(); System.out.println("호스트 주소: "+local.getHostAddress()); InetAddress[] iaArr = InetAddress.getAllByName("www.google.co.kr"); for(InetAddress remote:iaArr) { System.out.println("구글 주소: "+remote.getH..
문자 기반 스트림으로 변환 소스 스트림이 바이트기반 스트림(InputStream, OutputStream, FileInputStream, FileOutputStream)이면서 문자로 변환해야한다면 Reader와 Writer로 변환해야 합니다. InputStreamReader import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.Reader; public class InputStreaReaderEx { public static void main(String[] args) throws IOException { InputStream is = System.in; Reader re..
File 클래스 import java.io.File; import java.net.URI; import java.text.SimpleDateFormat; import java.util.Date; public class FileEx { public static void main(String[] args) throws Exception { File dir = new File("D:/temp/Dir"); File file1 = new File("D:/temp/file1.txt"); File file2 = new File("D:/temp/file2.txt"); File file3 = new File(new URI("file:///D:/temp/file3.txt")); if(dir.exists() == false..
Console 키보드로 입력받고, 화면으로 출력하는 소프트웨어. System.in import java.io.IOException; import java.io.InputStream; public class SystemInEx { public static void main(String[] args) throws IOException { System.out.println("1. 조회"); System.out.println("2. 출금"); System.out.println("3. 입금"); System.out.println("4. 종료"); System.out.print("메뉴 선택: "); InputStream is = System.in;//키보드 입력 스트림 획득 char inputChar = (char..
스트림 stream 자바7이전에는 컬렉션 순차처리를 위해 Iterator를 사용했지만 자바8부터 추가된 컬렉션(배열)을 람다식으로 처리할 수 있도록 해줍니다. BaseStream을 부모로하는 IntStream, LongStream, DoubleStream, Stream 들로 구성되어 있습니다. import java.util.Arrays; import java.util.Iterator; import java.util.List; import java.util.stream.Stream; public class IteratorStreamEx { public static void main(String[] args) { List list = Arrays.asList("홍길동", "고길동","김길동"); //Java..