Programming Summary

[2023-04-02] ipynb파일과 spring java파일 소통하기 본문

2022-23 Final Project

[2023-04-02] ipynb파일과 spring java파일 소통하기

쿠키롱킹덤 2023. 4. 2. 23:28

다음 그림은 우리 프로젝트의 시스템 아키텍쳐이다.  그림이 약간 잘못 되어 있는데 AI-Model과 Back-End는 직접 소통해야한다.

시스템 아키텍쳐

Front-End와 Back-End는 Spring에서 기본적으로 열어주는 8080 포트를 사용하여 데이터를 소통하는데 AI-Model과는 어떤 방식으로 소통하게 해줄지가 고민이었다. 특히 8080포트로 Front-End로 부터 데이터가 들어올 시 음성 분석을 진행한 후 바로 AI-Model이 실행되어야 한다. 이를 어떻게 구현할 수 있을까?

 

첫번째 방법으로 시도한 것은 Jython이나 File을 이용하여 데이터가 들어오면 ipynb 파일을 실행시켜주는 식으로 구현을 해보았다. 하지만 이 방식으로 하니, Jupyter Notebook에만 있는 여러 추가 라이브러리들이 설치하기 힘들어 오류가 발생되었다.

 

두번째 방법으로 시도한 것은 WebSocket을 통해 Port를 새로 여는 방법이었다. 

다음과 같은 방식으로 ipynb 파일에서 8765번 포트를 열고 async 방식으로 기다리게 하였고,

import asyncio
import websockets



async def echo(websocket, path):
    async for message in websocket:
        print(message)
        # message를 분석하여 주피터 노트북으로 값을 전달하는 코드 작성
        #분석
        #await websocket.send_text(f"Message text was: {data}")

async def main():
    async with websockets.serve(echo, "localhost", 8765):
        await asyncio.Future()  # 서버가 계속 실행되도록 대기

# 현재 실행 중인 이벤트 루프 가져오기
loop = asyncio.get_event_loop()

# 이벤트 루프에서 비동기 코드 실행
loop.create_task(main())

 

다음과 같은 방식으로 java 파일에서 WebSocketClient 파일을 만들어주었다.

@ClientEndpoint
public class WebSocketClient {
    @OnMessage
    public String onMessage(String message, Session session) {
        // 서버로부터 메시지를 수신할 때마다 실행되는 코드
        // 받은 message를 분석하여 사용자 입력 값을 체크하는 코드 작성
        return message;
    }

    public void analysisSTT (String result) throws DeploymentException, IOException {
        WebSocketContainer container = ContainerProvider.getWebSocketContainer();
        try {
                Session session = container.connectToServer(WebSocketClient.class, URI.create("ws://localhost:8765"));
                session.getBasicRemote().sendText(result);  // 서버에 메시지 전송
        } catch(Exception e) {//e.printStackTrace(); //throw e;
            }

    }
}

해당 방식을 통해 데이터가 제대로 전달되는 모습을 확인할 수 있었다.