[질문]C++ 엔진과 JSP 웹페이지의 통신 어떻게 구현하나요?

hudoni의 이미지

안녕하세요. 항상 KLDP의 방대한 자료에 많은 덕을 보고 있습니다.
저도 도움이 되고 싶지만 아직 갈길이 머네요;;

질문이 있습니다.
리눅스 환경에서 C++ 또는 C로 작성한 엔진과 JSP로 작성된 웹페이지를
연동시키려면 어떻게 해야 하나요? 짧은 지식으로 전혀 감을 못잡겠습니다.

제가 생각한 것은 사용자가 웹을 통해서 정보를 입력하고 결과를 받아 봅니다.
이때 웹은 JSP로 구성되어야 합니다.
그리고 웹페이지는 C/C++로 작성된 엔진에게 입력값을 주고, 엔진은 해당되는 연산을 하고
다시 웹으로 결과를 넘겨 줍니다.

이때 C/C++로 작성된 엔진은 속도 등의 이유로 JSP로 작성되어서는 안되고,
서로 간의 통신은 빈번하며, 데이터 크기는 약 50kbyte 이상입니다.

이러한 경우를 가정했을때 두 프로그램간의 통신을 어떻게 구성해야 하나요?
제 생각에는 소켓 통신밖에 없는데,, (사실 jsp에 대해서는 잘 모릅니다.)

고수님들의 짧은 힌트라도 듣고 싶습니다.
읽어주셔서 감사합니다. 오늘도 좋은하루 보내세요 ^ㅡ^

lacovnk의 이미지

C++ 프로그램과 통신하는 자바 클래스를 만들고, JSP 페이지에서는 그 자바 클래스를 이용하면 됩니다. singleton 패턴 사용해도 될 것 같고요.

hudoni의 이미지

답변 감사드립니다. ^ㅡ^

Quote:
C++ 프로그램과 통신하는 자바 클래스를 만들고

그런데 제가 더 궁금해 했던 것은 C++ 프로그램과 자바 클래스의 통신 수단입니다.

파일 입출력 이외에 다른 방법이 있을까요? 어떤 것이 효율적일지..

cleol의 이미지

자바는 기본적으로 IPC를 지원하지 않기 때문에 말씀하신대로 소켓을 사용해 통신하거나 자바측에서 C++ 프로그램의 프로세스를 생성한 다음 표준 입출력을 통해서 통신하는 방법을 흔히 사용합니다.

1. 가장 구현하기 쉬운 것은 요청이 있을 때마다 JSP 페이지가 C++ 프로그램의 프로세스를 생성하고 표준입출력을 통해서 통신하는 것입니다. 하지만 매 요청마다 프로세스를 생성해야 하니까 C++ 프로그램의 초기화 과정이 많은 자원을 소모하거나 시간이 오래걸리는 경우에는 오버헤드가 큽니다. 그리고 요청과 요청 사이에 C++ 프로그램이 어떤 상태를 유지해야 하는 경우에는 이렇게 구현하는 것이 어렵겠지요.

2. 두번째는 말씀하신대로 C++ 프로그램이 별도의 서버 역할을 하도록 작성하고, 소켓 통신을 하는 방법입니다. 뭐 그냥 일반적인 클라이언트-서버 구조이지요.

3. 다른 방법은 자바측에서 한 번만 C++ 프로그램의 프로세스를 생성하고 이 프로세스의 표준 입출력을 여러 요청이 공유하는 방법입니다. 아마 2번 보다 구현이 간단할 겁니다. 이 경우 여러 쓰레드가 표준 입출력에 접근하기 때문에 자바측에서 동기화를 잘 해주어야 합니다. 대신 C++ 프로그램 구현이 간단해집니다. 비지니스로직만 처리하면 되고, 동기화나 입출력에 신경 안써도 되니까요. 하지만 C++ 프로그램이 요청을 처리하는 데에 시간이 많이 걸려서 C++프로그램에서도 동시에 여러 요청을 처리하기 위해 쓰레드를 사용거나 할 경우에는 이 구현이 별로 이점이 없겠지요.

4. 사실 더 좋은 방법이 있습니다. 말씀하신 엔진의 비지니스 로직을 그냥 자바로 짜는 겁니다^^ 어느 정도의 속도를 필요로 하는지 모르겠지만, 입출력과 동기화에서 생기는 오버헤드, 구현이 복잡해지는 점 등을 감안하면 그냥 자바로 짜는 쪽이 좋을 수도 있습니다. 요새는 server VM 의 런타임 최적화가 꽤 훌륭하므로 어쩌면 기대 이상의 퍼포먼스를 얻을지도 모릅니다.

hudoni의 이미지

먼저 답변 감사드립니다. ^ㅡ^

저는 표준입출력을 통한 통신을 전혀 생각하지 못했습니다. 와우~
2번과 3번 중 어떤 방식이 적합할 지는 고려를 해봐야겠습니다. 그런데 C++ 프로그램이 쓰레드를 사용한다면 아무래도 소켓을 이용한 클라이언트-서버 방식이 적합하겠지요? 그리고 단순한 제 생각으로는 데이터를 주고 받는 부분만 봤을 때, 소켓 보다는 표준입출력이 효율적일 것 같은데, 제 생각이 맞나요?

언제 쯤에나 개념이 잡힐지.. ^^;;
그리고 혹시나 또다른 방법은 없는지도 궁금하네요.

익명 사용자의 이미지

요청하는 jsp의 갯수가 몇인지가 우선은 중요한 조건일 듯 하고, 데이타가 같은 요청에 대해서는 재계산을 하지 않는다는 조건이 있으면 sync로 jsp가 기다릴 필요없이 중간에 db를 두고 엔진이 계산의 결과 여부를 업데이트 한 것을 jsp가 루프에서 체크해서 보여주는 방법도 있겠습니다.

hudoni의 이미지

아하 디비를 사용하는 방법도 있겠군요~.

같은 데이터에 대한 계산 결과가 같다면 정말 유용하겠네요. 디비는 고려하지 않았었는데,, 답변 감사드립니다. ^^

blueiur의 이미지

이럴때 쓰라고 있는거죠~
저희는 DB와 웹서비스로 다 연동하더라고요.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.