개발자

파이썬 서버 ↔ 기업 legacy 시스템 間 데이터 통신을 하려고 합니다

2023년 02월 21일조회 201

안녕하십니까 고수님들 초보가 질문드립니다. 두괄식으로 말씀드리자면, ① A Legacy 시스템 --- [String 긴~~데이터] ----> 파이썬 서버 로 전송 ② 파이썬 서버 : 받은 데이터로 자체 로직 구동 ③ 파이썬 서버 ------ [처리된 데이터 값 ] ----> A Legacy 시스템 로 전송 ④ A Lagacy 시스템 : 받은 데이터로 자체 로직 구동 인데요... 조금만 더 구체적을 말씀드리면 파이썬으로 자연어 처리 머신러닝 모델을 구현했습니다. 긴 텍스트를 넣으면, 몇 가지로 분류해주는 학습 모델이요. 이걸 기존 A Legacy 시스템과 연동하여 실시간으로 A Legacy 시스템에서 사용자가 텍스트를 기입하고 '저장' 누르면, 해당 텍스트를 파이썬 서버측에서 받고, 자체 모델에서 구동하여 A Legacy 시스템 사용자에게 'OO 입니다.' 라는 식으로 값을 리턴하려고 합니다. 데이터 통신을 어떻게 하면 좋을까요? 지금 파이썬 Flask 웹 서비스 프레임워크 사용하는걸 알아보고 있는데... 이게 점점 웹페이지에 초점이 맞춰지는거 같더라구요. A Legacy 시스템은 JAVA로 구현되어 있어서 파이썬 소켓통신 이런걸로는 힘들고 분명, 당연히 방법은 있을거 같은데 어떻게 공부하고 적용해야 할지 방향만 말씀해주시면 또 알아보고 학습하도록 하겠습니다. 부디 도움 부탁드립니다 (_ _)

이 질문이 도움이 되었나요?
'추천해요' 버튼을 누르면 좋은 질문이 더 많은 사람에게 노출될 수 있어요. '보충이 필요해요' 버튼을 누르면 질문자에게 질문 내용 보충을 요청하는 알림이 가요.
profile picture
익명님의 질문

답변 1

인기 답변

김대현님의 프로필 사진

기존 자바 레거시 프로세스에서 신규 파이썬 프로세스의 기능을 활용하고 싶으신 건데요, 이렇게 다른 프로세스간 통신을 IPC(프로세스간 통신)라고도 하고, RPC(원격 프로시져 콜)라고도 부릅니다. 파이썬으로 구동하실 서비스를 작은 서비스라고 본다면, 이걸 하나의 마이크로서비스라고 봐도 되고요. 이름은 다양한데, 하고자 하는 일은 같습니다. 다른 프로세스의 기능을 써서, 현재 프로세스의 어떤 일을 하고 싶은 겁니다. IPC나, RPC를 위해 다양한 프로토콜이 쓰이고 시대에 따라 유행이 변하고, 아쉽게도 대동단결한 솔루션은 없는 것 같습니다. 앞으로도 구체적 구현의 유행은 계속 변할 것 같아요. 지금 하시는 일로 볼 때, 가장 간단하게는 자바 레거시 프로세스가 실행중인 동일 머신에서 파이썬 프로세스를 내부 프로세스로 실행(fork)하고, STDIN/STDOUT으로 파이프 처리해서 긴 문자열을 주고받는 게 제일 간단할 걸로 보입니다. 이 경우, 매번 파이썬 프로세스가 실행되고 종료되는 과정이 발생하는데, 여러 이유로 그게 불편하다면, 지금 고민하시는 것처럼, 파이썬 프로세스도 로컬이든 리모트든 서버로 띄워두고, 두 프로세스 간 통신을 해야겠지요. 여기에 현대에 가장 흔한 방식은 HTTP 통신일 것 같습니다. 이 경우는 REST라고 할 것도 없이, POST /question 같은 주소를 파이썬 프로세스에서 웹 서비스로 처리해주고, 자바 서버입장에서는 HTTP클라이언트의 입장으로 POST요청 본문에 text/plain이나 application/octet-stream으로 담아 보내면 될 것 같습니다. 해당 요청에 대한 처리가 잘 끝나고 나면, 응답을 결과 텍스트 그대로 돌려주거나, 여타 메타 데이터를 포함한 JSON 값으로 돌려주면 됩니다. 그 외에도, 프토토콜 버퍼를 쓰는 gRPC같은 것도 있고, 찾아보시면 여러가지 나올 것 같습니다. 질문자 님의 자세한 상황에 따라 적절한 안은 다를 수 있지만, 아마도 Flask로, API엔드포인트 하나 빼서, HTTP요청 본문 받아서, 처리하고 나서, HTTP응답을 text로 내보내는 걸로 해결되지 않을까 싶네요. 보시는 Flask 예제가 HTML응답을 보여서 이게 아닌가보다 오해하고 계신게 아닐까 합니다. HTTP응답으로 꼭 HTML을 내보내야만 하는 것은 아닙니다. 참고로, 흔히 말하는 소켓 통신은 흔히 TCP통신을 말하는데, 이는 현대의 모든 장비나 언어가 다루고 있기 때문에, 레거시 자바에서도 당연히 구현할 수 있습니다. 하지만 앞 뒤로 여간 귀찮은 일이 따라오는 게 아니니, 꼭 필요한 상황이 아니라면 피하는 것이 낫겠습니다. 어떤 이유로든 HTTP같은 L7 레이어에서의 통신이 어려울 경우에만 로우레벨로 내려가는 게 맞겠죠. 찾고자 하는 키워드를 제시해드렸다면 좋겠네요.

profile picture

익명

작성자

2023년 02월 21일

안녕하세요. 긴 답변 정말 감사드립니다. 부족한게 많아 말씀해주신 내용의 일부 밖에 이해를 하지 못하였으나, 지금 하고 있는 Flask 이용하여 HTTP 통신을 시도하는게 아주 틀린 방식은 아닌거 같다고 이해하였습니다. 클라이언트(Java Legacy 시스템)가 http://127.0.0.1:5000/dataSend/<아주 아주 긴 문장> ---> 이렇게 URL 호출을 하면, 서버 파이썬 측이 dataSend 라우팅한 주소로 def <아주 아주 긴 문장> 처리를 하고, return 을 뱉고 클라이언트가 값을 받는 받아서 처리하는, 이 구상이 틀린게 아닌거 같습니다. 다만... 다음과 같은 두 가지 문제에 봉착했습니다. 1) <아주 아주 긴 문장> 이게.. Parameter 값을 저런식으로 밖에 보낼 수 없는가? 너무 무식한 방법이지 않나? 다른 방법이 있을까요? 2) 이건 파이썬 기초적인 문제일수도 있고 Flask 기초적인 문제인거 같습니다만 @app.route('/dataSend/') def *<아주 아주 긴문장 처리 함수>*(): --- 매우 길고 복잡한 처리 로직 --- ... return '처리된 값' 이렇게 def 하위 제가 구성한 모델을 몽땅 집어 넣는 ㅠㅠ 아주 멍청한 코딩을 하게 되는데요. 독립된 <아주 아주 긴문장> 처리를 위한 OOO.py 파일을 불러오고, (from ~~ import 라고 할까요) 싶습니다. 혹시... 이 부분은 파이썬의 어느 '키워드' 를 스터디하면 될까요? 다시 한 번 감사드리며 저도 다음에는 도움을 드릴 수 있는 입장이 되었으면 싶네요

김대현님의 프로필 사진

김대현

디노티시아 백엔드 개발자2023년 02월 21일

1번의 경우에는, 현재 주로 쓰이는 HTTP/1.1 프로토콜에 요청값에는 요청 헤더, 요청 파라미터, 요청 본문이 담기게 되는데요, 지금은 "쿼리 파라미터"로 보고 계신 것 같습니다. 이는 브라우저로 치자면 URL뒤에 해당 값이 다 보이는 형태입니다. 얼마나 긴 값을 다루시는지 모르겠지만, 보통은 긴 문자열을 넘기기에는 요청 본문에 담아 보내는 형태를 취합니다. 그럼 플라스크 핸들러 쪽에서는 요청 파라미터가 아닌 요청 본문 값을 꺼내서 쓰는 식이지요. 흥미롭게도 URL스펙에 길이 제한이 없다고 하더라구요. 그래서 스펙기준으로는 사실 아주 긴 문자열도 요청 파라미터로 주고받아도 괜찮겠습니다만, 실용적으로는 어딘가에서 문제가 터지겠죠. 요청본문의 경우에는, 더 길이에 관대하겠습니디만, 중간에 어떤 웹서버 레이어를 두느냐에 따라 또 본문 크기 제한 설정을 하는 경우도 있습니다. 아니, 사실 제한해야 하는 게 맞긴 하죠. 2번은 패키지/모듈 분리를 찾아보시면 될 것 같습니다. 요청 핸들러에서는, 요청값 검증, 본문 추출/변환 등의 일을 하고, 실제 일은 별도의 모듈(함수)에서 처리하는 게 일반적으로 좋은 방식이라 볼 수 있으니, 잘 접근하고 계신 것 같습니다.

profile picture

익명

작성자

2023년 02월 21일

도움 주셔서 감사합니다 향후 어떻게 흘러가고 적용했는지 결과도 공유드릴 수 있도록 하겠습니다

지금 가입하면 모든 질문의 답변을 볼 수 있어요!

현직자들의 명쾌한 답변을 얻을 수 있어요.

또는

이미 회원이신가요?

목록으로
키워드로 질문 모아보기

실무, 커리어 고민이 있다면

새로운 질문 올리기

지금 가입하면 모든 질문의 답변을 볼 수 있어요!