분류 전체보기
-
WebFlux에서 Blocking을 처리하는 방법카테고리 없음 2025. 2. 4. 14:25
WebFlux 프로그래밍에서 아래 Blocking 처리에 대한 사항만 잘 준수한다면 WebFlux의 내부 구현이나 세부사항을 모르더라도 잘 돌아가는 애플리케이션을 만들 수 있다.1. Blocking이란?작업을 처리하는 스레드가 외부 리소스의 처리를 기다려야해서 작업이 중지된 채로 기다리고 있는 상태를 의미한다.외부 리소스의 처리란 Network, Database I/O등을 의미한다.파일 읽기, 쓰기, DB 조회나 외부 서비스 api를 호출 하는 경우 등이 해당된다.객체의 변환이나 복잡한 계산 등 로직 처리는 현재 작업을 하고 있는 스레드가 할당 받은 자원으로 처리해야 하는 작업임으로 Blocking으로 봐서는 안된다. 2. WebFlux에서는 Blocking을 어떻게 비동기로 처리할까? WebFlux의 ..
-
비동기 처리란 무엇인지와 Netty, Spring WebFlux 개요Spring/WebFlux 2025. 2. 3. 19:29
1. Netty와 WebFlux 탄생 배경기존 동기 방식 웹 서버(톰켓)에서는 해결하기 힘든 문제들이 있었다.요청이 아주 많아질 경우 스레드풀이 충분하지 않다면 요청 처리가 지연될 수 있는 문제잦은 스레드 스위칭으로 인한 컨텍스트 스위칭 비용 문제소켓에 데이터를 쓸 때 애플리케이션의 데이터를 커널 버퍼로 한 번 복사해야 하는 문제클라이언트의 요청을 Accept, Read, Write할 때 발생하는 블로킹 문제 이러한 문제들을 해결하고 더 높은 성능을 제공하기 위해 비동기 방식 웹 서버(Netty)가 등장하게 된다.Netty는 위 문제들을 이벤트 루프 패턴과 NIO 기반의 기술들(DirectByteBuffer 등)을 활용해서 효율적으로 해결한다.이 때 이벤트 루프 패턴은 적은 수의 스레드만을 사용하는데,..
-
자바 가상 스레드란?Java 2025. 1. 12. 22:50
1. 가상 스레드란?가상 스레드는 JDK 19(프로젝트 Loom)에서 도입된 새로운 형태의 스레드입니다. 기존의 플랫폼 스레드와 달리, JVM 내부에서 매우 가볍게 생성되고 스케줄링됩니다. 플랫폼 스레드와 1:N으로 매핑되어 블로킹 상황에서도 플랫폼 스레드가 효율적으로 재사용될 수 있도록 지원합니다.2. 가상 스레드를 왜 사용해야 하는가?웹 서버를 운영 할 때 비동기/병렬 처리를 위해 추가 플랫폼 스레드를 할당하곤 합니다.가상 스레드의 장점을 설명하기 전에 기존에는 플랫폼 스레드가 어떻게 생성되고 관리됐는지 이해할 필요가 있습니다. 플랫폼 스레드를 생성할 때는 보통 플랫폼 스레드 기반 Executor을 이용하여 생성하게 됩니다. 이 방식은 톰캣에서 생성되는 스레드처럼 JNI(Java Native Inte..
-
[Spring WebFlux] 기존 웹 서버와의 차이점과 꼭 주의해야할 점 (Netty)Spring/WebFlux 2024. 11. 18. 20:03
1. Netty와 Tomcat의 차이Spring WebFlux는 논블로킹 리액티브 프로그래밍 모델을 지원하며 기본적으로 Netty를 웹 서버로 사용한다.이는 블로킹 기반 웹 서버인 Tomcat과는 스레드 관리 방식 등 다소 차이가 있기에 그 차이를 이해해야만 효율적인 reactive 프로그래밍이 가능하다.(Tomcat과 같은 서블릿 컨테이너를 활용해서도 Flux와 Mono data stream을 반환할 수 있기는 하다.) 2. 이벤트 루프를 사용하는 Netty의 특성Netty는 이벤트 루프 기반의 네트워크 애플리케이션 프레임워크로, 논블로킹 I/O 작업을 효율적으로 처리하기 위해 설계되었다.Tomcat은 스레드 풀을 두고 다수의 스레드를 만들어두고 개별 요청마다 스레드를 할당한다.반면에 Netty는 쓰..
-
[DockerSwarm + SpringCloud] 1시간 안에 가장 간단한 MSA 구성하기DevOps 2024. 8. 10. 23:05
DockerSwarm은 Kubernetes와 같은 오케스트레이션 툴입니다.Kubernetes에 비해 생소한 DockerSwarm의 기본 개념과 유용성에 대해 다루고,DockerSwarm과 SpringCloud를 이용해 간단한 형태의 MSA를 구현해 보겠습니다.프로젝트 github링크: https://github.com/alska95/simple-msa-project 목차 왜 쿠버네티스 대신 DockerSwarm인가?오케스트레이션 툴로 가장 널리 알려진 Kubernetes 대신 DockerSwarm을 택한 이유가 궁금하실 것 같습니다.DockerSwarm을 선택한 가장 큰 이유는 그 간단함과 빠른 학습 곡선입니다.docker만 설치되어 있다면 바로 이용할 수 있고, 명령어가 간단합니다.또한 docker ..
-
[Spring WebFlux] Publisher과 SubscriberSpring/WebFlux 2024. 2. 20. 19:58
Publisher는 리액티브 프로그래밍에서 데이터 스트림을 생성하고 발행하는 주체다.Reactive Streams 사양에서는 Publisher 인터페이스를 정의하며, 이는 데이터를 생성하고 구독자(Subscriber)에게 데이터를 전달하는 메커니즘을 가진다. Publisher의 주요 특징은 다음과 같다비동기 데이터 스트림: Publisher는 비동기적으로 데이터 아이템을 발행한다. 이는 데이터를 생성하고 처리하는 작업이 호출자의 스레드와 다른 스레드에서 발생할 수 있음을 의미한다.백프레셔(backpressure) 지원: Publisher는 구독자가 처리할 수 있는 데이터의 양을 제어할 수 있는 백프레셔 메커니즘을 지원한다. 구독자는 request(n) 메서드를 통해 한 번에 처리할 아이템의 수를 요청할 ..
-
SpringBoot+Neo4j [2. 두 개의 노드 엔티티와 두 개의 관계를 가지는 GraphDB프로젝트]NOSQL/Neo4j 2021. 11. 12. 18:03
목차 SpringBoot+Neo4j A-Z [1. 하나의 노드 엔티티만을 가지는 GraphDB프로젝트]를 따라 하는 대에 무리가 없었다면, RelationShip을 가지는 엔티티의 구현 또한 식은 죽 먹기다. 본 프로젝트에서는 공식 예제에서는 다루지 않는 RelationShip을 갖는 Node에 대해 다룬다. 본 프로젝트까지 진행한다면 SpringDataNeo4J를 이용한 Node와 Relation의 CRUD를 모두 이해할 수 있을 것이다. https://github.com/alska95/Spring_Neo4j_Project 이 코드를 반드시 참고하며 읽어주길 바란다. 이전 프로젝트에서 설명이 부족했던 RelationShip에 대해 먼저 설명하겠다. RelationShip 이란? RelationShip이..
-
SpringBoot+Neo4j [API 구현]NOSQL/Neo4j 2021. 11. 12. 14:23
REST-API를 이용하여 노드 업데이트를 진행해보자. 코드 참고 : https://github.com/alska95/Spring_Neo4j_Project 기존 Spring의 사용법과 다를게 없다.우선 기존에 Spring을 사용하던것과 똑같이 컨트롤러와 서비스를 만들어 보자.기본적인 조회, 저장, 업데이트 기능을 구현했다. 그리고 서비스 클래스는 엔티티를 직접 노출시키지 않기위해 엔티티와 dto를 치환해 주는 정도의 역할 정도로 작성했다. 커낵션 Auth정보를 전달하지 않으면 다음과 같은 에러가 발생한다.org.neo4j.driver.exceptions.AuthenticationException: Unsupported authentication token, scheme='none' only allowe..