You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 6 Next »


Reactive 모드의 웹소켓을 활용해 PubSub의 기능을 액터모델을 통해 구현하는것을 간략하게 알아보고

웹소켓과 실시간성 처리 대응이 가능한 액터모델을 함께 블락킹 없이 유닛테스트 하는 방법을 알아보겠습니다.



웹소켓은 브라우저와 양방향 통신이 가능한 특징이 있으며 , 웹소켓 핸들러를 이용해

액터모델에 연결할수 있으며, 액터모델이 가진 특징을 이용해 분산처리로 확장을 할수 있습니다.

Reactive Websocket with Actor 이벤트 흐름표

  • WebClient : 브라우저에서 웹소켓 이벤트를 발생시킵니다.
  • SocketHandler : 서버에서 웹소켓 이벤트를 수신받을수 있습니다. 수신받은 이벤트를 액터모델에 전달합니다.
  • UserSessionActor : 웹소켓 세션을 액터모델을 통해 관리합니다.



구현된 코드를 간략하게 살펴보고 유닛테스트를 수행해보겠습니다.

UserSessionManager Actor

전체 코드 : https://github.com/psmon/kopring-reactive-labs/blob/main/KotlinBootReactiveLabs/src/main/kotlin/org/example/kotlinbootreactivelabs/ws/actor/chat/CounselorManagerActor.kt


SocketHandler

전체코드 : https://github.com/psmon/kopring-reactive-labs/blob/main/KotlinBootReactiveLabs/src/main/kotlin/org/example/kotlinbootreactivelabs/ws/base/SocketHandler.kt



유닛테스트 코드

    @Test
    fun testSendMessageToSession() {
        val probe = testKit.createTestProbe<UserSessionResponse>()
        val session = Mockito.mock(WebSocketSession::class.java)
        val textMessage = Mockito.mock(WebSocketMessage::class.java)

        Mockito.`when`(session.id).thenReturn("session1")
        Mockito.`when`(session.textMessage(Mockito.anyString())).thenReturn(textMessage)
        Mockito.`when`(session.send(Mockito.any())).thenReturn(Mono.empty())

        val actor = testKit.spawn(UserSessionManagerActor.create())

        actor.tell(AddSession(session))
        actor.tell(SendMessageToSession("session1", "Hello"))

        // Test for DelayedMessage
        actor.tell(Ping(probe.ref()))
        probe.expectMessageClass(Pong::class.java)

        // Create an actual instance of EventTextMessage
        val expectedMessage = EventTextMessage(
            type = MessageType.SESSIONID,
            message = "Connected",
            from = MessageFrom.SYSTEM,
            id = "session1",
            jsondata = null
        )

        // Verify that textMessage was called with the correct JSON value
        val objectMapper = jacksonObjectMapper()
        val expectedJson = objectMapper.writeValueAsString(expectedMessage)
        Mockito.verify(session).textMessage(Mockito.eq(expectedJson))
    }

전체 코드 :https://github.com/psmon/kopring-reactive-labs/blob/main/KotlinBootReactiveLabs/src/test/kotlin/org/example/kotlinbootreactivelabs/ws/actor/chat/UserSessionManagerActorTest.kt






  • No labels