본문 바로가기
CS/기술 면접 대비

[백엔드 기술 면접] #2 Reactive Programming

by 경험의 가치 2024. 11. 6.

#2 Reactive Programming

Q. Flux와 Mono의 차이에 대해서 설명해보아라.

A. Mono는 오직 ‘0개 또는 하나의 데이터항목 생성하고 이 결과가 생성되고 나면 스트림이 종료되면 결과 생성을 종료합니다. Mono를 사용하여 비동기적으로 결과를 반환하면 해당 결과를 구독하는 클라이언트는 결과가 생성될 때까지 블로킹하지 않고 다른 작업을 수행할 수 있습니다. Mono의 연산자들은 버퍼 중복, 값비싼 동기화 작업 등이 생략되어 Flux보다 가볍습니다. 반면에 Flux는 여러 개의 데이터 항목를 생성하고 스트림이 종료되면 결과 생성을 종료합니다.

 

Q. 블로킹 vs 논블로킹과 동기 vs 비동기의 차이에 대해서 설명해보아라.비동기 프로그래밍에서 발생할 수 있는 문제점은 무엇이 있을까?

A. 블로킹 vs 논블로킹은 실행 흐름과 관련이 있으며, 블로킹은 호출된 함수가 작업을 완료할 때까지 제어권을 반환하지 않고 대기하는 방식이고, 논블로킹은 호출된 함수가 즉시 제어권을 반환하고 작업이 완료되지 않았더라도 다른 작업을 계속 수행할 수 있는 방식입니다. 동기 vs 비동기는 실행 순서와 관련이 있으며, 동기는 호출된 함수가 작업을 완료할 때까지 호출한 함수가 대기하는 방식이고, 비동기는 호출된 함수가 작업을 요청한 후 바로 제어권을 반환하고 작업 완료 시 콜백이나 이벤트로 결과를 처리하는 방식입니다. 비동기 프로그래밍에서 발생할 수 있는 문제점으로는 콜백 지옥, 복잡한 에러 처리, 디버깅의 어려움, 상태 관리의 복잡성 등이 있습니다.

 

Q. Reactor에서 제공하는 Backpressure가 무엇인가?

A. Publisher가 빠르게 데이터를 emit하는 경우 Subscriber의 처리속도가 느려서 처리가 끝나기도 전에 계속해서 emit하게된다. 이렇게되면 처리되지 않고 대기 중인 데이터가 지속적으로 쌓이게되어 오버플로가 발생하거나 최악의 경우에는 시스템이 다운되는 문제가 발생한다. 이 문제를 해결하기 위한 수단이 바로 Backpressure이다.

 

Q. Reactor에서 제공하는 sinks()에 대해서 설명해보아라.

A. Sinks는 Sinks.Many 또는 Sinks.One interface를 사용해서 Thread-Safe하게 signal을 발생시킵니다. 즉, 능동적으로 signal을 보내고 싶을 때 사용하는 것임. 앞서 본건 데이터 흐름이 우리가 소스를 수동적으로 설정해두고 수동적으로 흐르는데, sink를 통해 능동적으로 운영되게 할 수 있음. 즉, 이걸로 sse와 조합을 해서 클라이언트에게 알림을 보내는 기능을 구현할 수 있음.

 

Q. 리액티브 프로그래밍에서 발생할 수 있는 "콜드"와 "핫" Sequence의 차이를 설명해보아라.

A. Sequece는 Publisher가 emit하는 데이터의 연속적인 흐름을 정의해둔 것입니다. 즉, 이 흐름을 어떤 방식으로 전송할 것인가가 hot과 cold에 대한것 입니다. 우리가 월간 잡지를 구독하는데, 5월부터 구독한다고 해봅시다. cold는 5월부터 구독했어도 1~5월까지 모든 잡지를 다 받고, 계속 이후 잡지도 받는 것, 즉 내가 구독한 시점의 이전 데이터들까지 싹 다 받고 통신을 시작하는 것입니다. 반면에 hot은 5월 이후의 잡지만 받는 것, 즉 내가 구독한 시점 이후의 데이터만 받는 것입니다.

 

Q. Websocket과 SSE의 차이에 대해서 설명해보아라.

A. WebSocket은 양방향 통신을 지원하며 클라이언트와 서버 간에 실시간으로 메시지를 주고받을 수 있는 프로토콜로, 지속적인 연결을 유지하며 데이터 전송이 필요할 때 사용되고, 예로는 채팅 애플리케이션, 실시간 알림 시스템이 있습니다. SSE(Server-Sent Events)는 단방향 통신을 지원하며 서버에서 클라이언트로 지속적인 데이터 스트림을 보내는 프로토콜로, 클라이언트는 이벤트 소스를 통해 서버로부터 실시간 업데이트를 받을 수 있으며, 주로 실시간 대시보드, 주식 시세 업데이트 등에 사용됩니다.