Java (17) 썸네일형 리스트형 [Netty] ByteBuf Netty는 왜 자바 표준인 NIO의 ByteBuffer를 사용하지 않는 걸까 이유를 몰랐는데 자바 네트워크 소녀 네티를 보고 이유를 알게되어 정리해봄. ByteBuffer와 ButeBuf의 세부사항 보다는 ByteBuffer는 어떤 문제점을 가지고, ButeBuf는 그 문제점을 어떻게 해결했는지에 초점을 맞추어 정리함. ByteBuffer의 문제점 Netty의 ByteBuf는 자바의 ByteBuffer가 가진 문제점들을 해결하기 위해 나왔다. 데이터 쓰기/읽기 인덱스가 분리돼있지 않다. val byteBuffer = ByteBuffer.allocate(3) // 3바이트를 담을 수 있는 힙버퍼, 전부 0으로 초기화된다. println(byteBuffer) // java.nio.HeapByteBuffer.. [Java] 기존 동시성 프로그래밍의 한계와 새롭게 도입될 구조적 동시성(Structured Concurrency) 1. 기존 동시성 프로그래밍의 한계와 새롭게 도입될 구조적 동시성(Structured Concurrency) [ 비구조적 동시성의 한계 ] ExecutorService를 이용한 동시성 적용 개발을 하다 보면 하나의 작업이 여러 개의 하위 작업(Task)들로 나누어지는 경우가 있다. 일반적인 단일 스레드 애플리케이션에서는 하위 작업들이 순차적으로 실행될 것이다. 하지만 만약 각각의 작업이 서로 독립적이고 하드웨어 리소가 충분하다면, 이를 동시에 실행하여 전체 작업을 더 빠르게 그리고 더 적은 지연 시간으로 처리할 수 있을 것이다. 예를 들어 User와 Order API를 호출하여 얻어온 결과를 사용하는 코드가 있다고 하자. 이때 각각의 I/O 작업이 자체 스레드에서 동시에 실행된다면 더 빠를 것이므로, J.. [Server] Cache(캐시)란? 1. Cache(캐시)란? [ Cache ] Cache란 자주 사용하는 데이터나 값을 미리 복사해 놓는 임시 장소를 가리킨다. 아래와 같은 저장공간 계층 구조에서 확인할 수 있듯이, 캐시는 저장 공간이 작고 비용이 비싼 대신 빠른 성능을 제공한다. Cache는 아래와 같은 경우에 사용을 고려하면 좋다. 접근 시간에 비해 원래 데이터를 접근하는 시간이 오래 걸리는 경우 (서버의 균일한 API 데이터) 반복적으로 동일한 결과를 돌려주는 경우 (이미지나 썸네일 등) Cache에 데이터를 미리 복사해 놓으면 계산이나 접근 시간 없이 더 빠른 속도로 데이터에 접근할 수 있다. 결국 Cache란 반복적으로 데이터를 불러오는 경우에, 지속적으로 DBMS 혹은 서버에 요청하는 것이 아니라 Memory에 데이터를 저장하.. [Java] 예시로 살펴보는 IntelliJ 프로파일링 결과 분석 및 성능 최적화 방법 1. 예시로 살펴보는 IntelliJ 프로파일링 결과 분석 및 성능 최적화 방법 [ 샘플 코드 작성 및 프로파일링 하기 ] IntelliJ Ultimate를 사용하고 있다면, 손쉽게 프로파일링을 진행하고 결과를 확인할 수 있다. 예를 들어 다음과 같은 컨트롤러와 서비스가 있다고 하자. @RestController @RequiredArgsConstructor class BoxingController { private final BoxingService boxingService @GetMapping("/boxing") int boxing() { int result1 = boxingService.max1(100000000L); int result2 = boxingService.max2(100000000L); .. [JVM] Async-Profiler 소개 및 IntelliJ에서 프로파일링 결과 분석하는 방법 1. Async-Profiler 소개 및 사용 방법 [ Async-Profiler ] async-profiler는 오픈소스 프로젝트로, Safepoint bias 문제를 겪지 않는 자바 전용 저오버헤드(low-overhead) 샘플링 프로파일러이다. Safepoint란 GC 작업을 진행하면서 사용되지 않는 객체들을 식별하는데, 이때 애플리케이션이 안전한 지점으로 이동하여 GC를 진행할 수 있는 지점을 safepoint라고한다. 그리고 Safepoint bias 문제란 간단히 요약하면 샘플링 프로파일러에 의한 분석 샘플이 특정 위치로 편향되는 문제를 의미한다. 기존의 많은 자바 샘플링 프로파일러들은 Safepoint bias 문제에 의해 정확한 분석을 해주지 못했기 때문에 상당히 아쉬운 부분이 많이 있었다.. [Java] ConcurrentHashMap 개념과 동기화 동작 원리 (Thread-safe) 멀티 스레드(Multi-Thread) 환경에서 동시성 이슈로 인해 ConcurrentHashMap을 사용해 보면서 정리한 것으로 `ConcurrentHashMap의 개념과 해당 클래스가 Thread-safe 하게 동작할 수 있는 동작원리`에 대한 내용 입니다. Synchronized 키워드 Synchronized 키워드 아래 ConcurrentHashMap을 이해하는 데 있어서 중요한 요소 중 하나라고 생각되는데요. 멀티스레드(Multi-Thread) 환경에서는 여러 스레드가 하나의 공유 자원에 동시에 접근하지 못하도록 막는 '스레드 동기화'가 필수적입니다. (스레드 동기화가 되지 않는 경우 여러 스레드에서 서로 공유하고 수정할 수 있는 데이터에 대한 안전성과 신뢰성을 보장할 수 없게 됩니다.) 그리고 .. [Java] Reactor 패턴과 이벤트 루프 Reactor 패턴 Reactor 패턴은 동시에 들어오는 여러 종류의 이벤트를 처리하기 위한 동시성을 다루는 디자인 패턴 중 하나입니다. Reactor 패턴은 관리하는 리소스에서 이벤트가 발생할 때까지 대기하다가 이벤트가 발생하면 해당 이벤트를 처리할 수 있는 핸들러(handler)에게 디스패치(dispatch)하는 방식으로 이벤트에 반응하는 패턴으로 '이벤트 팬들링(event handling)'패턴이라고도 부릅니다. Reactor 패턴은 크게 Reactor와 핸들러로 구성됩니다. Reactor: 무한 반복문을 실행해 이벤트가 발생할 때까지 대기하다가 이벤트가 발생하면 처리할 수 있는 핸들러에게 디스패치합니다. 이벤트 루프라고도 부릅니다. 핸들러: 이벤트를 받아 필요한 비즈니스 로직을 수행합니다. 세부적.. [Java] Java NIO와 멀티플렉싱 기반의 다중 접속 서버 Java NIO와 멀티플렉싱 기반의 다중 접속 서버 Java NIO는 Java의 기존 I/O API를 대체하기 위해 Java 1.4 버전에서 도입된 I/O API입니다. 새로 바뀐 부분을 간략히 요약하면 다음과 같습니다. 채널과 버퍼 Java NIO에서는 채널과 버퍼를 사용합니다. 서버에서 클라이언트와 데이터를 주고받을 때 채널을 통해서 버퍼(ByteBuffer)를 이용해 읽고 씁니다. 논블로킹(non-blocking) I/O Java NIO에서는 논블로킹 I/O를 사용할 수 있습니다. 예를 들어보겠습니다. 스레드가 버퍼로 데이터를 읽어달라고 채널에 요청하면, 채널이 버퍼에 데이터를 채워 넣는 동안 해당 스레드는 다른 작업을 수행할 수 있습니다. 이후 채널이 버퍼에 데이터를 채워 넣고 나면 스레드는 해당.. 이전 1 2 3 다음