전체 글

기록과 정리의 공간
· Java
간단한 리액티브 애플리케이션 만들기 Flow클래스에 정의된 인터페이스 대부분은 직접 구현하도록 의도된 것이 아니다. 그럼에도 Java9 라이브러리는 이들 인터페이스를 구현하는 클래스를 제공하지 않는다. 이전에 언급한 Akka, RxJava 등의 리액티브 라이브러리에서는 이들 인터페이스를 구현했다. java.util.concurrency.Flow 명세는 이들 라이브러리가 준수해야 할 규칙과 다양한 리액티브 라이브러리를 제시한다. 그렇지만 Flow API를 직접 이용해보고 애플리케이션을 개발하면서 Flow 클래스안에 4개의 인터페이스가 어떻게 작동하는지 알아보자. 예를 들어 로또 번호를 발급한다고 가정해보자. 1부터 45까지에 랜덤한 숫자를 6번 발급하도록 한다면 7번째 발급 시에 RuntimeExcepti..
· Java
리액티브 스트림이란? 리액티브 프로그래밍은 리액티브 스트림을 사용하는 프로그래밍이다. 리액티브 스트림은 잠재적으로 무한의 비동기 데이터를 순서대로 그리고 블록 하지 않는 역압력을 전재해 처리하는 표준 기술이다. 역압력은 발행-구독 프로토콜에서 이벤트 스트림의 구독자가 이벤트를 소비하는 시간이 발행자가 이벤트를 제공하는 속도보다 느릴 때 문제가 발생하지 않도록 보장하는 장치다. 이런 상황이 발생하였을 때 부하가 발생한 컴포넌트가 완전 불능이 되거나 예기치 않는 방식으로 이벤트를 잃어버리는 등의 문제가 발생하지 않는다. 부하가 발생했을 때 발행자가 충분한 알림을 받을 수 있어야 한다. 실제 비동기 작업이 실행되는 동안 시스템에는 암묵적으로 블록 API로 인해 역압력이 제공되는 것이다. 안타깝게도 비동기 작업..
· Java
리액티브 프로그래밍이란? 수년 전까지 대규모 애플리케이션은 수십 대의 서버, 기가바이트의 데이터, 수초의 응답시간, 당연히 여겨졌던 몇 시간의 유지보수 시간 등의 특징을 가졌다. 오늘날에는 다음과 같은 적어도 세 가지 이유로 상황이 변하고 있다. 빅데이터 보통 빅데이터는 페타바이트 단위로 구성되며 매일 증가한다. 다양한 환경 모바일 디바이스에서 수천 개의 멀티 코어 프로세서로 실행되는 클라우드 기반 클러스터에 이르기까지 다양한 환경에 애플리케이션이 배포된다. 사용 패턴 사용자는 1년 내낸 항상 서비스를 이용할 수 있으며 밀리초 단위의 응답 시간을 기대한다. 예전 소프트웨어 아키텍처로는 오늘날의 이런 요구사항을 만족시킬 수 없다. 인터넷 트래픽을 가장 많이 일으키는 디바이스가 모바일인 요즘은 이런 양상이 ..
· Java
앞서 Future와 CompletableFuture를 활용해 비동기 작업 처리를 해보았다. 이를 이용해 비동기 작업 파이프라인 만드는 법을 살펴보자. 동기 작업과 비동기 작업 조합하기 만약 음식을 요리하고 완성된 후 접시에 담는다고 가정해보자. List foodNames = List.of("피자", "햄거버", "파스타", "김밥", "떡볶이"); ExecutorService executor = Executors.newFixedThreadPool(Math.min(foodNames.size(), 100), runnable -> { Thread t = new Thread(runnable); t.setDaemon(true); return t; }); List dishFutures = foodNames.stre..
· Java
Future의 단순 활용 Java5 부터는 미래의 어느 시점에 결과를 얻는 모델에 활용할 수 있도록 Future 인터페이스를 제공하고 있다. 비동기 계산을 모델링하는 데 Future를 이용할 수 있으며, Future는 계산이 끝났을 때 결과에 접근할 수 있는 참조를 제공한다. 시간이 걸릴 수 있는 작업을 Future 내부로 설정하면 호출자 스레드가 결과를 기다리는 동안 다른 유용한 작업을 수행할 수 있다. Future는 저수준의 스레드에 비해 직관적으로 이해하기 쉽다는 장점이 있다. Future를 이용하려면 시간이 오래 걸리는 작업을 Callable 객체 내부로 감싼 다음에 ExecutorService에 제출해야 한다. Java8 이전의 예제 코드는 아래와 같다. ExecutorService execut..
· Java
디폴트 메서드(default method)란? 보통 인터페이스는 규칙을 잡거나, 서비스의 플로우 로직을 잡는 데 사용하곤 한다. 하지만 인터페이스를 구현하는 클래스에서는 메서드를 모두 구현해야하기 때문에 인터페이스에 메서드를 추가할때 문제가 발생한다. 메서드 하나를 추가하려면 해당 인터페이스를 구현하는 모든 클래스에서는 해당 메서드를 모두 구현해줘야 하는 것이다. Java8에서는 이러한 문제를 해결하기 위해 2가지 방법을 제공한다. 인터페이스 내부에 정적 메서드(static method)를 사용한다. 인터페이스의 기본 구현을 제공할 수 있도록 디폴트 메서드(default method) 기능을 사용한다. 인터페이스에 디폴트 메서드를 사용하여 메서드를 구현할 수 있다. 디폴트 메서드를 이용하면 인터페이스의 ..
· Java
새로운 날짜와 시간 API 자바 API는 복잡한 애플리케이션을 만드는 데 필요한 여러 가지 유용한 컴포넌트를 제공한다. 아쉽게도 자바 API가 항상 완벽한 것은 아니다. 대부분의 자바 개발자가 지금까지의 날짜와 시간 관련 기능에 만족하지 못했다. Java1에서는 java.util.Date 클래스 하나로 날짜와 시간 관련 기능을 제공했다. 하지만 대부분의 자바 개발자가 지금까지의 날짜와 시간 관련 기능에 만족하지 못했다. 날짜를 의미하는 Date라는 클래스의 이름과 달리 Date 클래스는 특정 시점을 날짜가 아닌 밀리초 단위로 표현한다. 게다가 1900년을 기준으로 하는 오프셋, 0에서 시작하는 달 인덱스 등 모호한 설계로 유용성이 떨어졌다. java1.1에서는 Date 클래스의 여러 메서드를 사장시키고 ..
· Java
자바로 프로그램을 개발하면서 한 번이라도 NullPointerException을 껶지 않은 사람은 없을 것이다. NullPointerException은 모든 자바 개발자를 괴롭히는 예외다. 1965년 토니 호어(Tony Hoare)라는 영국 컴퓨터과학자가 힙에 할당되는 레코드를 사용하며 형식을 갖는 최초의 프로그래밍 언어 중 하나인 알골(ALGOL)을 설계하면서 처음 null 참조가 등장했다. 그는 구현하기가 쉬웠기 때무엔 null을 도입했다고 하였다. 하지만 여러 해가 지난 후 그는 null 및 예외를 만든 결정을 가리켜 십억 달러짜리 실수라고 표현했다. 모든 자바 프로그래머라면 NullPointerException이라는 귀차는 예외가 발생하는 상황을 몸소 겪었을 것이다. 값이 없는 상황을 어떻게 처리..
· React Native
업로드할 사진 선택 또는 카메라 촬영하기 리액트 네이티브 앱에서 버튼을 클릭했을 때 업로드하라 사진을 갤러리에서 선택할지 아니면 카메라로 새로 촬영할지 사용자가 선택하도록 모달을 띄어보려고 한다. ActionSheetIOS는 이름에서 유추할 수 있듯이 iOS에서만 지원되는 API로, 지금과 같이 사용자에게 선택지를 줄 때 iOS에서 주로 사용하는 UI다. 안드로이드의 경우에는 모달을 통해 선택할 수 있도록 구현하는데, 만약 안드로이드에서도 ActionSheetIOS와 같은 UI로 기능을 구현하고 싶다면 @expo/react-native-action-sheet를 사용하면 된다. 1. 모달 만들기 리액트 네이티브에서 모달을 만들 때는 주로 Modal이라는 컴포넌트를 사용한다. 이 컴포넌트를 사용하지 않아도 ..
· Java
DSL(Domain-specific Languages, 도메인 전용 언어)란? DSL은 특정 비즈니스 도메인의 문제를 해결하려고 만든, 작은, 범용이 아닌 특정 도메인을 대상으로 만들어진 특수 프로그래밍 언어다. 예를 들어 쇼핑몰 플랫폼을 개발한다고 가정했을 때, 비지니스 도메인에는 상품을 결제하고 배송처리와 같은 개념이 포함된다. DSL에란 특정 비즈니스 도메인을 인터페이스로 만든 API라고 생각할 수 있다. (자바 8에서는 Stream, Collector 등 여러 가지 작은 DSL들이 추가되었다.) 자바에서는 도메인을 표현할 수 있는 클래스와 메서드 집합이 필요하다. DSL에서 동작과 용어는 특정 도메인에 국한되므로 다른 문제는 걱정할 필요가 없어서 특정 도메인의 복잡성을 더 잘 다룰 수 있고, 저수..
beekei
Bonglog - 기록과 정리의 공간