묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결Kevin의 알기 쉬운 Spring Reactive Web Applications: Reactor 1부
Flux 와 Mono
흔히 Spring Boot WebFlux 라고 공고에도 많이 올라오고 , 사람들이 많이들 부르는데, 이때 WebFlux 는 Mono 를 제외한 Flux 인가요 ??아니면 Mono 와 Flux 를 모두 포함해서 WebFlux 라고 하나요 ??
-
미해결Kevin의 알기 쉬운 Spring Reactive Web Applications: Reactor 1부
Spring WebFlux 를 사용하기 적합한 시스템
일반적인mvc rest api 를 사용하지 않고 , spring web flux 를 사용해도 되나요 ?? 그렇게 많이 사용하고 있나요 ?
-
미해결Kevin의 알기 쉬운 Spring Reactive Web Applications: Reactor 1부
Sinks 와 thread-safe
안녕하세요.강의 중 Sinks가 thread-safe 하다는 이야기가 잘 이해가 안 가서 질문 드립니다.혹시 예시를 들어 설명해주실 수 있나요?구글링 해봐도 어떤 원리로 therad-safe 한지 이해가 안 가서요.
-
미해결Kevin의 알기 쉬운 Spring Reactive Web Applications: Reactor 1부
Mono 의 정의를 잘 모르겠습니다..
안녕하세요 문의 사항이 있어 글을 올립니다.@PutMapping("/{userId}") public Mono<User> updateUser(@PathVariable Long userId, @RequestBody UserUpdateRequestDto userRequestDto) { return mainService.updateUser(userId, userRequestDto); }public Mono<User> updateUser(Long id, UserUpdateRequestDto userUpdateRequestDto) { // 데이터베이스에서 사용자 조회 return dataRepository.findById(id) .flatMap(existingUser -> { // 기존 사용자가 있으면 업데이트 수행 existingUser.setName(userUpdateRequestDto.getName()); // 다시 데이터베이스에 저장 return dataRepository.save(existingUser); }); } 과 같이 Mono<User> 를 리턴 하는데 포스트맨으로 응답이 json 형태로 옵니다.저는 User를 리턴한게 아닌 Mono<User> 를 리턴한건데 어떻게 포스트맨이 별도의 처리 없이 Mono 안의 User 값을 받을 수 있나요?Mono<User> userMono = webClient.get() .uri("/user/{id}", userId) .retrieve() .bodyToMono(User.class);위와 같은 코드를 보았는데 이 경우 Mono<User> userMono로 받게 되던데 결국 리턴은 Mono<User> 가 맞는거 같은데포스트맨이 어떻게 User 값을 바로 가져다 썼는지 이해가 잘 안가서 질문 올립니다.+ 추가로 mono나 flux는 subscribe()를 해줘야 동작을 한다고 하셨었는데 subscribe()를 적지 않았는데 어떻게 update가 동작한건지 궁금합니다.
-
미해결Kevin의 알기 쉬운 Spring Reactive Web Applications: Reactor 1부
RestTemplate과 Webclient
webflux를 사용할때, webClient를 사용하게 되는데, non-blocking하게 동작해서,,, 란 추상적인 의미 때문에 사용합니다. webclient는 왜 non-blocking 하게 작동하는 걸까요?.. 제대로 이해하지 못하고 사용하는것 같은데, 강사님께 설명 부탁드립니다. 그에 반해 RestTemplate, openFeign은 사용하지 않는데,예제코드를 보니 다음과 같이 사용해도 똑같이 non-blocking 하게 작동할까요?Mono.just(restTemplate.get()).subscribe() Mono.just(feign.get()).subscribe()
-
미해결Kevin의 알기 쉬운 Spring Reactive Web Applications: Reactor 1부
이벤트 루프와 요청핸들러 관련해서 질문있습니다.
안녕하세요 이벤트 루프와 요청 핸들러 관련해서 질문이 있습니다.netty의 이벤트는 channel에서 발생한다고 들었는데 그림의 요청핸들러가 channel인가요? 만약 channel이 맞다면 그림에선 핸들러가 한개지만 실제는 클라이언트 요청수 만큼 channel이 생성되는게 맞나요? 다른 질문의 답변을 보니 이벤트루프가 cpu 코어 개수만큼 생성된다고 하셨는데 여러 요청들은 이벤트루프를 무작위로 선택하나요?만약 클라이언트의 요청이 DB io 를 사용하는데 비동기방식을 지원하지않는 jdbc라면 해당 스레드는 이벤트 루프 없이 blocking으로 DB 작업을 처리하는게 맞나요?
-
미해결Kevin의 알기 쉬운 Spring Reactive Web Applications: Reactor 1부
Logger 문의
안녕하세요~ 해당 강의를 촬영한 시점이 2년전정도? 되는거 같은데Logger::OOO 이 사용이 되지 않는다면 @Slf4j어노테이션 사용을 권장드립니다.log.info 메서드를 통해 로깅을 하실 수 있어요
-
미해결Kevin의 알기 쉬운 Spring Reactive Web Applications: Reactor 1부
.contextWrite의 실행시점
안녕하세요예제 코드에서 질문이 있습니다.@SneakyThrows public static void main(String[] args) { String key = "message"; Mono<String> mono = Mono.deferContextual(ctx -> Mono.just("Hello" + " " + ctx.get(key)) .doOnNext(msg -> log.info("context value : {}", msg))) .subscribeOn(Schedulers.boundedElastic()) .publishOn(Schedulers.parallel()) .transformDeferredContextual((mono2, ctx) -> mono2.map(data -> data + " " + ctx.get(key))) .contextWrite(context -> context.put(key, "Reactor")).doOnNext(msg -> log.info("contextWrite value : {}", msg)); mono.subscribe(data -> log.info("data : {}", data)); Thread.sleep(100L); } 설명하시는 내용을 들어보면 코드의 순서와 상관없이.contextWrite()이 먼저 발생하여 context에 {message, Reactor} 값을 저장하고Mono.deferContextual가 실행되어 ctx에서 contextWrite에서 했던 값을 가져오고 있습니다. 이부분이 잘 이해가 안가는데요그전 강의까지는 `.subscribeOn`, `.publishOn` 이런 메서드의 체이닝은 탑다운 방식으로 진행되었었는데Context부터는 순서가 달라 혹시 실행하는 우선순위가 있는지 궁금합니다.
-
미해결Kevin의 알기 쉬운 Spring Reactive Web Applications: Reactor 1부
마지막 예제에 질문있습니다.
안녕하세요.마지막 Context 예제에서 "직교성을 가지는 정보를 표현할 때 주로 사용된다."라고 하셨는데 "직교성", "애플리케이션에 영향을 주지않는 데이터"의 의미가 정확하게 와닿지가 않아서요! jwt토큰을 단순히 변수에 값을 저장하고 파라미터로 넘기는것과 context에 담아서 넘기는 것에 어떤 차이가 있나요? 사실 context를 어떻게 활용해야될지 잘 모르겠어요....ㅜㅜ
-
해결됨Kevin의 알기 쉬운 Spring Reactive Web Applications: Reactor 1부
Sinks multicast의 subscribe에 질문있습니다.
안녕하세요.Sinks multicast 예제에서 질문이 있습니다. 질문1Many<String> sinks = Sinks.many().multicast().onBackpressureBuffer(); Flux<String> flux = sinks.asFlux(); sinks.emitNext("1", EmitFailureHandler.FAIL_FAST); sinks.emitNext("2", EmitFailureHandler.FAIL_FAST); flux.subscribe(data -> System.out.println("Subscribe1 : " + data)); flux.subscribe(data -> System.out.println("Subscribe2 : " + data)); sinks.emitNext("3", EmitFailureHandler.FAIL_FAST);위 코드를 실행하면 결과는 아래와 같이 출력됩니다.Subscribe1 : 1Subscribe1 : 2Subscribe1 : 3Subscribe2 : 3강사님이 말씀하신대로면 Subscribe1 : 1Subscribe1 : 2Subscribe2 : 1Subscribe2 : 2Subscribe1 : 3Subscribe2 : 3이렇게 동작될것같은데 다르게 출력되어 질문올립니다. 질문2sinks.emitNext("3", EmitFailureHandler.FAIL_FAST);마지막 emitNext는 2개의 subscribe()가 동작이되고 다음에 동작되는데 어떻게 subscribe를 할 수 있는걸까요?
-
미해결
sprign webflux와 main 쓰레드 수
제가spring webflux를 공부하다가 궁금한게 있어서 이렇게 질문 남깁니다.webflux는 비동기 프로그래밍을 지원하기 때문에 적은 쓰레드 수로도 대량의 트래픽을 처리할 수 있다고 알고 있는데요. [실제로 사용자 요청을 받는 main 쓰레드는 한 개만 생성되는지 궁금합니다.]webflux는 블로그를 보다가 default값으로 core 당 한개의 쓰레드가 생성한다고 본거 같은데.. 이게 main 쓰레드는 한개 인데 sub 쓰레드(block 상태 풀린 쓰레드 요청 처리 용, event loop 처리 용 등)들이 core 갯수까지 추가적으로 생성된다는건지(main + sub == core수), 아니면 main 쓰레드가 실제로 코어 수만큼 생성이 된다는 의미인지 잘 모르겠네요..마지막으로, 후자가 맞다면 webflux는 소수의 main 쓰레드로 멀티 쓰레딩 지원과 비동기 프로그래밍을 지원한다고 보면되는걸까요?
-
미해결Kevin의 알기 쉬운 Spring Reactive Web Applications: Reactor 1부
Context 체인 전파
안녕하세요. Context 체인은 아래에서부터 위로 전파된다고 하셨는데 그 이유가 궁금합니다. Stream()에서 순서대로 연산을 실행해서 조건에 맞는 것만 다음연산으로 넘어가는데 어떻게 context는 반대 방향으로 동작을 하나요?
-
미해결Kevin의 알기 쉬운 Spring Reactive Web Applications: Reactor 1부
버퍼가 비워지는 시점
안녕하세요. Backpressure의 Drop 전략에서 버퍼가 비워질 때까지 Emit된 데이터가 Drop이 된다는 것은 이해했습니다.그런데 1번 데이터가 subscriber에게 전달되어서 처리가 되면 버퍼에 자리가 한 자리 비게 되는데 왜 데이터가 계속 Drop이 되는건가요? (코드 실습에서 onNext()함수가 호출이 되어도 255,256,257 ~ 1024까지 모두 드랍됨)| 1, 2 | <-------- 3 듣랍| 2, |. <-------- 4 드랍 (여기서 왜 4번 데이터는 안들어가나요?)| 5, 6 | Buffer DROP-LATEST를 보면 | 1, 2 | <---- 3들어오는 중 버퍼 가득 차서 drop | 2, 4 | <------ 1번이 버퍼에서 나가고 한 자리가 비어서 4번이 들어와짐 이런식으로 동작을 하는데 Drop은 이렇게 동작하지 않는 것 같아 버퍼가 어떻게 동작하는지 궁금하여 질문드립니다.
-
해결됨Kevin의 알기 쉬운 Spring Reactive Web Applications: Reactor 1부
Flux의 에러
Flux에서 3개의 데이터 중 2개만 성공하는 경우 어떤식으로 처리가 되나요? 한 개만 실패해도 onError signal을 받게 되나요?만약 2개가 에러가 나면 두 개의 errorsignal을 받나요?
-
미해결Kevin의 알기 쉬운 Spring Reactive Web Applications: Reactor 1부
웹플럭스 처리 프로세스 문의
DB 조회조회된 내용으로 비즈니스 로직 처리(자바 코어 연산)연산된 결과 DB 등록 사용자 요청시에 위의 3가지 업무를 Webflux로 처리해야한다면 어떤 방식으로 처리해야하는지 감이 잘 안오는데, 설명 부탁드립니다. Webflux에 적합하지 않은 업무일 수도 있다는 생각이 들어 문의드리게 되었습니다. 참고로 위의 3가지 업무는 순차적으로 처리가 되어야 하는 업무입니다. publisher가 위의 3개 내용을 각각을 별도의 subscriber에게 발생한다면 데이터 정합성이 깨질거 같은데...어떻게 처리해야하는지 설명부탁드립니다.
-
미해결Kevin의 알기 쉬운 Spring Reactive Web Applications: Reactor 1부
webflux 쓰레드 개수 문의
웹플럭스의 쓰레드 관련 문의가 있습니다. 강의 자료에 보면 위와 같은 그림이 있는데요, 웹플럭스에서 사용하는 쓰레드 = (요청 핸들러 쓰레드 + 이벤트 루프 쓰레드) X CPU 코어 수로 계산하는게 맞을까요? I/O 작업 등은 커널 쓰레드를 호출하여 작업이 진행된다는 블로그 글이 있던데, 쓰레드 계산할 때 이 부분도 포함해서 계산해야하는지 문의드립니다.
-
미해결Kevin의 알기 쉬운 Spring Reactive Web Applications: Reactor 1부
Hot Sequence의 실무예제
실무에서는 Hot Sequence가 어떤 경우에 사용되나요?!
-
미해결Kevin의 알기 쉬운 Spring Reactive Web Applications: Reactor 1부
기본적인게 이해가 안되서 진행이 어렵네요..
doOnNext에서 로직을 실행하는것이랑 subscribe안에서 로직을 실행하는것이랑 어떤 차이가 있는건가요?순서는 doOnNext가 먼저 실행되는것으로 보이는데 재구독이 일어났을때 핫 퍼블리셔랑, 콜드 퍼블리셔의 차이로 데이터 소비 패턴이 달라진다 정도로 이해하면 되는걸까요?실무에서 사용되는 코드가 subscribe();로 별도에 람다식이 없고 전부 doOnNext안에서 처리하는 로직으로 이루어져 있어서 문의 드립니다.
-
미해결Kevin의 알기 쉬운 Spring Reactive Web Applications: Reactor 1부
backpressure example 코드 질문있습니다.
안녕하세요backpressure 전략에 대해 공부하던 중,latest전략이라면, 1,2가 차있고 3이 들어오면 2가 버퍼에서 나가고 3이 들어가는 것으로 이해를 했습니다.DropLatest전략에 대해 설명을 해주시는데,1,2가 버퍼에 차있고 3이 들어오면, 오버플로우가 발생해서3이 드랍이 된다고 하셨는데 이게 드랍이랑 무슨 차이가 있나요?