개발/Java 12

Java Future, ExecutorService 로 NonBlocking 구현

Future, ExecutorService로 NonBlocking을 구현하고자 한다. 이전 내용들과 동일하게 API통신을 예시로 들려한다. Future예시 @PostMapping("/future01") public ResponseEntity future01() { ExecutorService executorService = Executors.newSingleThreadExecutor(); log.trace("Call future01."); restTemplate = restTemplateConfig.restTemplate( restTemplateConfig.factory( restTemplateConfig.httpClient() ) ); // 시간 측정을 위해 선언 final StopWatch stopW..

개발/Java 2022.03.04

Socket(Selector)으로 Blocking, NonBlocking 구현

Socket 저번에는 [WebFlux로 Blocking, NonBlocking 구현]을 작성 했었다. 순서가 꼬인거 같지만 이번에는 통신의 가장 기본이 되는 Socket통신으로 구현하려 한다. Socket통신은 TCP/IP 프로토콜을 사용해서 통신을 수행하는 방법이다. 컴퓨터들이 서로 정보를 주고 받는 네트워크는 처리 역할에 따라 계층이 구분되는데 이를 OSI 7계층이라 한다. 이를 실제 업무에서 적용한 표준이 TCP/IP 4계층이다. TCP/IP 4계층 역할 데이타 단위 전송 주소 예시 장비 응용 계층(Application) 응용프로그램 간의 데이타 송수신 Data/Message - 파일 전송, 이메일, FTP, HTTP, SSH, Telnet, DNS, SMTP 등 - 전송 계층(Transport) ..

개발/Java 2022.02.07

WebFlux로 Blocking, NonBlocking 구현

WebFlux 먼저 WebFlux란 Spring 5에 새로게 추가된 모듈이다. Reactive한 개발을 도와주는 모듈로 NonBlocking에 ReactiveStream을 지원한다. 이전에도 비동기/NonBlocking을 구현하는 방법들은 존재했지만 무언가 부족했나보다. 구현 기술이 어려워서였을까? 이 부분에 대해서는 다른 NonBlocking 구현을 수행하면서 그 차이점을 한번에 정리하고자 한다. Spring MVC는 아래와 같은 흐름을 가진다. request - Dispatcher Servlet - Handler Mapper - Controller - B/L - Controller - ViewResolver ... Spring WebFlux는 아래와 같은 흐름을 가진다. request - HttpHa..

개발/Java 2022.01.28

동기와 비동기, Blocking과 Non Blocking

생각해보면 직전 회사에 면접을 볼 때 계셨던 과장님께서 같은 질문을 3번인가 반복하셨었다. 동기와 비동기에 대해 설명해주세요. 3번 다 같은 대답을 하였었는데 최근 면접에서 아래 질문을 받고나서 스스로 깨닳았다. Blocking과 Non Blocking에 대해 설명해주세요. 나 이거 제대로 모르구나. 면접 자리에서 깨닳고 스스로 엄청 부끄러웠다. 그동안 일하면서 알게 모르게 그 차이를 느껴왔던거 같은데 질문 받는 순간 확 느껴졌다. 그동안... 동기 == Blocking 이벤트가 발생했을 때 이벤트가 종료될 때 까지 해당 이벤트가 제어권을 가지고 있는다. 이로 인해 뒤에 들어온 모든 이벤트는 락이 걸린다. 비동기 == Non Blocking 이벤트가 발생했을 때 이벤트의 종료 여부와 상관없이 다음 이벤트..

개발/Java 2022.01.22

Reactive란

면접볼 때마다 항상 나오는 질문이 있다. 동기와 비동기에 대해 설명해주세요. 여기에 나는 아래와 같이 답변을 했었다. 동기는 이벤트가 발생했을 때 그 결과를 기다리고 비동기는 결과를 기다리지 않고 다음 작업을 수행하다가 완료 되면 결과에 대한 처리를 수행합니다. 그런데 최근 면접에서는 아래와 같은 질문을 받았다. Blocking과 Non Blocking에 대해 설명해주세요. 동기, 비동기의 차이에 대한 답변과 동일하게 답변을 하려다가 문득 동기, 비동기와 Blocking, Non Blocking이 같나? 라는 의문이 너무 강하게 들어 몇초 당황하다가 설명하지 못하겠다고 했다. 돌아오는 길에 동기, 비동기의 차이에 대한 답변을 했어야지 왜 못했지? 라는 생각을 했지만 그 순간에는 그러면 안된다고 생각을 했..

개발/Java 2022.01.21

[java] dual pivot quick sort/정렬

무작위로 삽입되어 있는 Data를 정렬할때에 jdk1.8이상이라면 stream을 이용하면 편하게 정렬할 수 있다. int[] intArray = {5, 2, 7, 1, 0}; int[] result = Arrays.stream(intArray).sorted().toArray(); jdk1.8을 사용할 수 없다면 아래와 같이 dual pivot quick sort를 작성하여 호출하는 식으로 사용하면 된다. public static void intArraySwap(int[] arr, int a, int b) { int temp = arr[a]; arr[a] = arr[b]; arr[b] = temp; } public static void intArrayDualPivotQuickSort(int[] arr, i..

개발/Java 2021.08.11

[java] DataInputStream.read(byte[] b)와 ByteArrayOutputStream.write(byte[] b)의 b

#목적 1. java Socket통신 후 Response Data 처리 과정에서 오류가 발생하였고 InputStream의 read와 OutputStream의 write를 짚고 넘어가고자 작성한다. a. 간헐적으로 HexString의 일부를 읽지 못하고 다른 일부는 0으로 채워지는 현상이 발생하였다. b. 안될거면 처음부터 안돼야지 왜 대부분 잘되다가 가끔 발생하지? c. 다른 기관과 통신을 태울때는 대부분 안되다가 가끔 잘되었다. #내용 1. 흐름은 아래와 같다. a. 인증기관으로 Request Data 전송 b. 인증기관으로부터 4Byte를 읽어들임 (header이며 body의 길이를 나타냄) DataInputStream dataInputStream = new DataInputStream(inputSt..

개발/Java 2021.07.01

[java] JSON null check

#목적 1. JSON Data를 파싱해서 사용하는데 특정 필드의 값이 Null이 아니라고 통과되고는 Null Potinter Exception이 발생 #내용 1. 삽입되는 JSON Data 예시 1. 기존 로직 및 문제점 a. 기존 Json Null Check Logic String ksr = ""; JsonObject successObj = (JsonObject) jsonObject.get("success"); if(successObj.get("ksr") != null) { ksr = successObj.get("ksr").getAsString(); } 위 Logic에서 if문의 null check는 통과한다. 하지만 get("ksr") 이후 getAsString(); 에서 Null Potinter E..

개발/Java 2021.06.13

[java] switch-case 문자열 조건

#목적 1. switch-case문의 조건으로 문자열을 사용하였을 때에 발생한 문제에 대해 기술한다. #내용 1. switch-case문의 조건에 String값은 jdk7 이상부터 가능하다. if문으로 이를 대체하여 해결함. a. 수정 전 switch("001") { case "001" : ... break; case "002" : ... break; ... default : System.out.println("No case"); break; b. 수정 후 if("001".equals(temp)) { ... } else if("002".equals(temp)) { ... } else { System.out.println("No case"); } #배운점 1. 오류가 발생했을 때에 문법 적오류를 찾기위해 ..

개발/Java 2021.04.19

[java] Generic을 사용해 Class 및 Method 동적 생성 및 호출

#목적 1. Generic 사용 예시 및 환경 #내용 1. 동적으로 Class 객체를 생성하고 함수를 호출해야했다. 2. 공통되는 패키지 경로에 Class명을 붙인다. a. String className = "seungri.common." + "ClassName"; 3. Class를 선언하고 forName함수를 이용하여 Class 및 인터페이스 초기화 a. Clasa simpleClass; i. 여기서 ? 가 Generic이다. b. simpleClass = Class.forName(className); i. 참고 링크 : https://kyun2.tistory.com/23 4. 객체 초기화를 위해 생성자를 호출해야했다. 이를 위해 Constructor 객체를 선언 및 생성한다. a. Constructo..

개발/Java 2021.04.18