반응형

Java 11

자바 예외 재정의 규칙

자바 예외 재정의 규칙Runnable 인터페이스의 run() 메서드를 구현할 때 InterruptedException 체크 예외를 thrwos 할 수 없는 이유는 자바의 규칙 때문이다.public interface Runnable { void run();}자바에서 메서드를 재정의 할 때, 재정의 메서드가 지켜야할 예외 관련 규칙은체크 예외부모 메서드가 체크 예외를 던지지 않는 경우, 재정의된 자식 메서드도 체크 예외를 던질 수 없다.자식 메서드는 부모 메서드가 던질 수 있는 체크 예외의 하위 타입만 던질 수 있다.언체크(런타임) 예외예외 처리를 강제하지 않으므로 상관없이 throw 할 수 있다.Runnable 인터페이스의 run() 메서드는 아무런 체크 예외를 throw 하지 않는다. 따라서 Run..

Java 2024.09.01

Java - Reactor_pattern

Reactor patternReactor pattern은 동시에 들어오는 요청을 처리하는 이벤트 핸들링 방식이다.Service handler는 요청을 demultiplexing하여 동기적으로 request handler에 전달한다.Accept, read, write와 같은 이벤트들을 한 곳에 등록하여 관찰하고, 준비된 이벤트를 request handler에게 전달한다.이는 Java NIO의 selector를 이용한 처리와 유사한 방식으로 볼 수 있다.Reactor pattern의 구현Reactor, Selector, Acceptor, EventHandler 구현체로 구성되며, Acceptor는 EventHandler 구현체의 일부이고 accept 이벤트에만 집중한다.EventHandler 구현체는 rea..

Java 2024.05.07

Java - Direct, Heap Buffer SelectableChannel

DirectBuffer, HeapByteBufferJava IO의 단점 중 커널 버퍼에 직접 접근이 불가능해서 메모리 copy가 발생해 CPU 자원이 소모된다는 단점이 있다.JavaNIO 에서는 이런 단점을 보완한 DirectByteBuffer, HeapByteBuffer를 제공한다. DirectByteBuffer의 특징은 native메모리(off-heap)에 저장하고, 커널 메모리에서 복사를 하지 않으므로 데이터를 읽고 쓰는 속도가 빠르며 비용이 많이 드는 system call을 사용하므로 allocate, deallocate가 느리다는 특징을 가지고 있다.HeapByteBuffer의 특징은 JVM heap 메모리에 저장하고 byte array를 랩핑하고 있다. 커널 메모리에서 복사가 일어나게 되는데..

Java 2024.04.25

Java - NIO Buffer

Java NIO Java 1.4부터 도입된 NIO는 기존의 Java IO의 단점을 보완하기 위해 도입되었다. NIO는 Non-blocking이 아니라 Java New Input/Out의 약자로, 파일과 네트워크 데이터를 읽고 쓰는 API를 제공한다. 이는 기존의 Stream 기반의 입출력 대신 Buffer 기반으로 작동하고, Non-blocking을 지원하여 성능을 향상시켰다. Selector와 Channel이 도입되어 높은 성능이 보장된다. Java NIO 와 Java IO의 비교 Java NIO Java IO 데이터의 흐름 양방향 단방향 종류 Channel InputStream, OutputStream 데이터의 단위 buffer byte 혹은 character blocking 여부 non-blocki..

Java 2024.04.23

Java - OutputStream

Java IO - OutputStream InputStream과 동일하게 Closeable 인터페이스를 구현하고 있고 추가로 Flushable도 같이 구현하고 있다. 명시적으로 close도 가능하고, try-with-resources 사용이 가능하다. write시 바로 전송하지 않고 버퍼에 저장한 다음 일정량의 데이터가 모이면 한번에 전달한다. 만약 일정량의 데이터가 모이기 전에 바로 buffer에 있는 값을 전달하고 다음 로직을 처리해야 한다면 Flushable에서 제공하는 flush 메서드를 사용해서 buffer를 비우고 다음 로직을 수행한 후 원하는 결과를 내보낼 수 있다. import java.io.Closeable; import java.io.Flushable; import java.io.IOE..

Java 2024.04.23

Java - InputStream

Java IO - InputStream Java IO는 동기 Blocking으로 동작한다. Java 1.0 에서 처음 도입 되었으며 파일과 네트워크에 데이터를 읽고 쓸 수 있는 API들을 제공한다. byte 단위로 읽고 쓸 수 있는 stream이다. (InputStream과 OutputStream) InputStream InputStream은 Closable을 구현한다. 명시적으로 close하거나 try-with-resource 사용이 가능하다. read는 stream으로 데이터를 읽고, 읽은 값을 반환하고 -1 이라면 끝에 도달했다는 것을 의미하며, close는 stream을 닫고 더 이상 데이터를 읽지 않는다. import java.io.Closeable; import java.io.IOExcepti..

Java 2024.04.22

Java - CompletableFuture class

CompletableFuture CompletableFuture 클래스는 Future 인터페이스가 가진 한계점을 보완하기 위해 CompletionStage 인터페이스와 합쳐진 형태의 클래스로, Java 8부터 제공되는 클래스이다. Future와 다르게 외부에서 작업을 완료시킬 수 있고, 콜백 등록 및 Future 조합 등...이 가능하다. import java.util.concurrent.CompletionStage; import java.util.function.Supplier; public class CompletableFuture implements Future, CompletionStage { public static CompletableFuture supplyAsync(Supplier suppl..

Java 2024.04.21

Java - CompletionStage then* vs then*Async

CompletionStage에서 Async가 붙어있는 함수와 붙지 않은 함수의 차이는 무엇인가? CompletionStage의 제공되는 함수들에 같은 이름인데 Async가 붙어있는 함수가 있고 붙어있지 않은 함수들이 있는데 무슨 차이점이 있을까? 반환받은 Future가 Done인 경우 import com.example.webfluxstudy.basicReactiveProgramming.completableFuture.completionStage.thenAsyncSufix.Helper; import lombok.extern.slf4j.Slf4j; import java.util.concurrent.CompletionStage; @Slf4j public class CompletionStageThenAccept..

Java 2024.04.19

Java - CompletionStage Interface

CompletionStage CompletionStage는 일종의 파이프라인으로 각각의 함수를 연결하여 사용할 수 있다. 연산자들을 활용하여 비동기 task들을 실행하고 값을 변형하는 등 chaning을 이용한 조합이 가능하다. Future의 단점이였던 Exception 처리를 CompletionStage에서는 가능하다. import com.example.webfluxstudy.basicReactiveProgramming.completableFuture.completionStage.thenAsyncSufix.Helper; import lombok.extern.slf4j.Slf4j; @Slf4j public class CompletionStageExample { public static void main(..

Java 2024.04.19

Java - Future Interface

Future Interface 비동기적인 작업을 수행하고 해당 작업이 완료되면 결과를 반환하는 인터페이스 Future 인터페이스의 주요 메서드 import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; public interface Future { boolean cancel(boolean mayInterruptIfRunning); boolean isCancelled(); boolean isDone(); V get() throws InterruptedException, ExecutionException; V get(long time..

Java 2024.04.18
반응형