RSocket & AsyncAPI
먼저 /rsocket 엔트리포인트를 직접 사용하는 기본 방법을 설명합니다. AsyncAPI에서 route/request/response 타입과 service 함수를 생성하는 흐름은 그 다음의 선택적 프로젝트 통합 방식입니다.
RSocket 어댑터 기본 사용법
RSocket을 사용하는 프로젝트에서만 peer 패키지를 설치합니다.
기본 사용에는 AsyncAPI generator나 WebFlux가 필요하지 않습니다. /rsocket에서 createRSocketApi를 import하고 WebSocket endpoint를 전달하며, 인증이 필요한 경우에만 두 번째 인자로 JWT를 전달합니다. mono 또는 stream은 RxJS Observable로 반환됩니다.
선택: AsyncAPI service 자동 생성 프로젝트 통합
REST와 거의 같은 흐름
REST는 swagger.json을 사용하고, RSocket은asyncapi-rsocket.json을 사용합니다. 문서에서 route, interaction type, request와 response schema를 읽어 TypeScript 타입과 service 함수를 생성합니다.
1. 먼저: rsocketCommonService가 무엇인지 전체 코드로 확인
rsocketCommonService.ts도 라이브러리가 자동 생성하는 파일이 아닙니다. createRSocketApi를 프로젝트에서 직접 감싸서 연결/JWT 재사용 정책을 한 곳에 두고, generated RSocket service가 callRSocketMono/callRSocketStream만 import하도록 만드는 프로젝트 소유 adapter입니다. 아래는 그 파일의 전체 코드입니다. REST 공용 service의 headerStore에서 Authorization을 읽고, 없으면 token API를 한 번 호출해 JWT를 준비하며 JWT가 바뀌면 기존 RSocket 연결을 닫고 새 연결을 생성합니다.
rsocketCommonService.ts
ts복사 후 headerStore import 경로, AsyncApiTypes 위치, token API 경로, NEXT_PUBLIC_RSOCKET_URL과 실제 RSocket endpoint를 프로젝트에 맞게 수정합니다.
2. rsocketCommonService 코드 구성별 역할
getRSocketUrl
서버에서는 환경 변수를 사용하고 브라우저에서는 현재 protocol과 host를 기준으로 ws 또는 wss URL을 만듭니다.
fetchAuthorization
headerStore에 JWT가 없을 때 세션 cookie를 포함해 token API를 호출하고 token, accessToken 또는 jwt 필드에서 값을 읽습니다.
getRsoketApi
동시에 여러 요청이 들어와도 token 조회 Promise를 공유하고, 같은 JWT에는 기존 연결을 재사용하며 JWT가 바뀌면 연결을 다시 만듭니다.
resetRsoketApi
로그아웃이나 인증 정보 제거 시 현재 RSocket 연결을 닫고 저장된 JWT와 client를 초기화합니다.
callRSocketMono / callRSocketStream
생성된 route 타입으로 request와 response를 검사하고, 연결 준비 Promise를 RxJS Observable 흐름에 합쳐 mono 또는 stream을 실행합니다.
3. AsyncAPI service 생성
generateAsyncApiRSocket.cjs
js4. 생성된 함수 호출
다음은 여러 작업의 처리 진행 상황을 받는 일반적인 requestStream 예제입니다. route 문자열과 event type은 생성 service 안에 들어 있습니다.
BatchJobPage.tsx
tsxmono와 stream 선택
AsyncAPI interaction이 requestResponse이면 생성 함수는callRSocketMono를, requestStream이면 callRSocketStream을 사용합니다. 화면에서는 둘 다 Observable이지만 stream은 여러 번 next가 호출될 수 있습니다.