Kevin의 알기 쉬운 Spring Reactive Web Applications: Reactor 1부
안녕하세요, advancedTimeBy와 thenAwait 사용 예시를 모르겠어서 문의드립니다. 강의 중 advancedTimeBy는 '특정 시간을 당겨서 앞서 나가는 것'이라 설명해주셨고, thenAwait은 해당 시간이 빠르게 다가오는 걸로 이해하면 된다고 설명해주셨습니다. 궁금한 점은 1) 각각의 테스트가 필요한 예시를 조금만 더 자세히 들어주실 수 있으실까요? 특정 프로젝트에서 어떤 상황일 때 해당 방법이 필요한지 감이 잡히지 않습니다. 1-2) 어떤 상황에 필요한 것인지 모르다보니, advancedTimeBy와 thenAwait의 쓰임이 분명히 구분돼 있을텐데도 유사한 방식이 아닌가? 라는 생각이 듭니다. 이 부분도 예시로 설명해주실 수 있다면 함께 설명해주시면 감사하겠습니다.
Kevin의 알기 쉬운 Spring Reactive Web Applications: Reactor 1부
안녕하세요, context의 read와 write 부분을 듣다 궁금한 점이 생겨 질문을 남깁니다. Context는 체인이 맨 아래에서부터 위로 전파된다는 내용은 이해했습니다. 궁금한 점은 'Context read 읽는 동작이 Context write 동작 밑에 있을 경우에는 write된 값을 read할 수 없'는 동작을 컴퓨터는 어떻게 이해하고 실행하는지를 모르겠습니다. 위에서부터 아래로 코드를 읽어나가면 contextWrite()는 마지막에 읽히게 되니까요. 컴파일하면서 write의 위치가 바뀌어 write가 먼저 진행되는지 혹은 subscribe()를 만나기 전까지는 실제 stream이 동작하지 않아 write된 값이 저장돼 있는지..코드 작동 순서/원리가 궁금합니다. 감사합니다.
Kevin의 알기 쉬운 Spring Reactive Web Applications: Reactor 1부
안녕하세요. 수업 잘 듣고 있습니다~ 백프레셔 전략 중 DROP과 LATEST 전략은 결국 버퍼가 비워질 때까지 Publsiher에서 emit되는 데이터를 제거(drop or discard)하는 것으로 이해했습니다. 버퍼가 비어지는 시점 이후로 emit되는 데이터를 다시 버퍼에 채운다는 점에서 두 전략은 같은 것으로 보입니다. 차이점을 알려주시면 감사하겠습니다~
Kevin의 알기 쉬운 Spring Reactive Web Applications: Reactor 1부
기존 예제 (sleep 시간이 5L인 경우)에선 Exception이 발생하는 것을 확인했습니다. 하지만 sleep 시간을 더 늘리니까 Erorr가 발생하지않았습니다. 제 예상대로라면 버퍼가 더 빨리 차기 때문에 에러가 발생해야하는데, 동작이 이해가 되지 않습니다. public class BackpressureStrategyErrorExample { public static void main(String[] args) { Flux .interval(Duration.ofMillis(1L)) .onBackpressureError() .doOnNext(Logger::doOnNext) .publishOn(Schedulers.parallel()) .subscribe(data -> { // 왜 50L, 500L로 하면 에러가 발생하지 않을까? TimeUtils.sleep(500L); Logger.onNext(data); }, error -> Logger.onError(error)); TimeUtils.sleep(5000L); } }
Kevin의 알기 쉬운 Spring Reactive Web Applications: Reactor 1부
안녕하세요~ 유익한 강의 정말 감사드립니다. Backpressure 기법에 대해 강의를 듣던 중 궁금한 게 생겼습니다. Error, latest, drop, ignore 등의 backpressure 기법은 buffer에 데이터가 다 찼을 때 데이터를 drop 하는 것 같은데 drop되는 data들은 유실 된다고 볼 수 있을까요? 그게 아니라면 re-try하는 과정이 backpressure 이후에 진행되는 건지 궁금합니다.
Kevin의 알기 쉬운 Spring Reactive Web Applications: Reactor 1부
안녕하세요 문의 사항이 있어 글을 올립니다. @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부
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부
안녕하세요. 마지막 Context 예제에서 "직교성을 가지는 정보를 표현할 때 주로 사용된다."라고 하셨는데 "직교성", "애플리케이션에 영향을 주지않는 데이터"의 의미가 정확하게 와닿지가 않아서요! jwt토큰을 단순히 변수에 값을 저장하고 파라미터로 넘기는것과 context에 담아서 넘기는 것에 어떤 차이가 있나요? 사실 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은 이렇게 동작하지 않는 것 같아 버퍼가 어떻게 동작하는지 궁금하여 질문드립니다.