Jump to content
과거의 기술자료(읽기 전용): https://tech.devgear.co.kr ×
과거의 기술자료(읽기 전용): https://tech.devgear.co.kr

REST 서버로 채팅 시스템 구현해보기 [Part1-서버 ]


Recommended Posts

"3티어 구축을 위한 REST 서버를 쉽고 간단하게 구현 방법" 에 대한 글에 설명했던 내용을 바탕으로 이번에는 간단한 채팅 시스템을 만들어 봅니다.

이전에 게시한 서버 와 클라이언트 구현 방법은 아래 링크를 참고 하시기 바랍니다.

REST 서버 구축 Part1 보러가기

REST 서버 구축 Part2 보러가기

REST 서버 구축 Part3 보러가기

REST 서버 구축 Part4 보러가기

멀티플랫폼 3티어 REST Client Application 구현 방법 보러가기

 

서버쪽 EndPoint 액션은 채팅 메시지 받았을때 처리와 읽기 요청에 대한 두가지를 추가 합니다.

/chatsend 는 메시지를 전송 하는 요청을 처리하고 /chatread 는 요청자에게 온 메시지를 전달 합니다.

image.png

데이터베이스 테이블은 아래와 같이 간단하게 만들어 봅니다.

image.png

/chatsend 를 처리 하는 방식은 아래 소스에 구현 하였는데 이전 글에서 미리 설명한  테이블 내용을 조회하는 형식과 거의 같고 받아온 메시지를 테이블에 저장하는 insert 쿼리문만 다르다고 보면 됩니다. 메시지를 전송하는 클라이언트에게 서버에서는 잘 받았다는 응답을 클라이언트에서 전달 할 필요가 있을 경우 응답 결과를 Json 으로 표출 합니다.

// 채팅 메시지 전송
// http://127.0.0.1:8080/chatsend?suser=user1&tuser=user2&message=hi
procedure TWebModule1.WebModule1WebActionChatSendAction(Sender: TObject; Request: TWebRequest; Response: TWebResponse;  var Handled: Boolean);
var
  jOutStr, suser, tuser, msg, eMsg : string;
begin
  suser  := Request.ContentFields.Values['suser'];
  tuser  := Request.ContentFields.Values['tuser'];
  msg    := Request.ContentFields.Values['message'];

 if Request.ContentFields.Values['message'] = '' then
  begin
    jOutStr := Json_OutMessage(  'Error', 'Null Message' );

    Response.StatusCode := 200;
    Response.Content := jOutStr;
    Exit;
  end;

  FDConnection1.Open;
  try
    FDQuery1.Close;
    FDQuery1.SQL.Clear;
    FDQuery1.Sql.Add( 'insert into chatinfo ( senduser, targetuser, message ) '  );
    FDQuery1.Sql.Add( 'values( :p_senduser, :p_targetuser, :p_message );' );

    FDQuery1.ParamByName('p_senduser').AsString   := suser;
    FDQuery1.ParamByName('p_targetuser').AsString := tuser;
    FDQuery1.ParamByName('p_message').AsString    := msg;
    FDQuery1.ExecSQL();

  except
    on e: Exception do begin
       eMsg := e.Message;
    end;
  end;


  if FDQuery1.RowsAffected > 0 then
     jOutStr := Json_OutMessage( 'Success OK ', msg )
  else
     jOutStr := Json_OutMessage( 'DB Error', eMsg );

  Response.StatusCode := 200;
  Response.Content := jOutStr;

  FDConnection1.Close;
end;

 

웹에서 URL 로 요청해보면 서버에서 아래와 같이 응답을 표출 합니다.

image.png

 

Json 표출시 형식이 통일성이 있어야 클라이언트에서 파싱과정이 번거롭지 않으므로 Json 을 표출하는 메소드를 만들어 동일한 형태로 사용 하도록 하여습니다.  단순 메시지 표출시에는 Json 배열을 사용하지 않아도 무방하나 메시지 갯수가 추가 될때 마다 Json 항목을 추가 하는 것 보다 배열로 처리 하게 되면 클라이언트에서 동일한 파싱 방법을 사용하여 데이터를 읽어올 수 있게 됩니다.

// -----------------------------------------------------------------------------
// 요청 결과에 대한 응답을 Json 기본 형태로 표출
function TWebModule1.Json_OutMessage( outMsg1, outMsg2 : string ) : string;
var
  JTopObj, JsubObj : TJSONObject;        // Uses System.JSON,
  JArr  : TJSONArray;
  JPair : TJSONPair;
begin
  JTopObj := TJSONObject.Create;  // 메인 블럭 정의

  JArr :=  TJSONArray.Create;
  JsubObj := TJSONObject.Create;
  JsubObj.AddPair( 'notice',  outMsg1 );
  JsubObj.AddPair( 'detail',  outMsg2 );
  JArr.AddElement( JsubObj );

  JPair := TJSONPair.Create( 'Items', JArr );

  JTopObj.AddPair( 'PathInfo', '/chatsend' );
  JTopObj.AddPair( 'Count', TJSONNumber.Create( 2 ) );  // 단순 메시지는 배열 항목 2 개
  JTopObj.AddPair( JPair );

  result := JTopObj.ToString;

  JTopObj.Free;
end;

 

/chatread 는 클라이언트에서 다른 유저가 본인한테 전송한 메시지를 받아오도록 처리 합니다. 

메시지를 전달 하고 난후에 테이블 항목에 readyn 필드값에 읽었음을 표시 하도록 Update SQL 문이 추가 된것 이외에는 다른 EndPoint 메소드와 거의 동일 하다고 보면 됩니다.

// http://127.0.0.1:8080/chatread?tuser=user1
procedure TWebModule1.WebModule1WebActionChatReadAction(Sender: TObject; Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
var
  JTopObj, JsubObj : TJSONObject;        // Uses System.JSON,
  JArr  : TJSONArray;
  JPair : TJSONPair;
  tuser, jOutStr : string;
  i : integer;
begin
  tuser  := Request.ContentFields.Values['tuser'];

 if Request.ContentFields.Values['tuser'] = '' then
  begin
    jOutStr := Json_OutMessage(  'Error', 'Null user' );

    Response.StatusCode := 200;
    Response.Content := jOutStr;
    Exit;
  end;

  JTopObj := TJSONObject.Create;  // 메인 블럭 정의
  try
    FDConnection1.Open;

    try
      FDQuery1.Close;
      FDQuery1.SQL.Clear;
      FDQuery1.SQL.Add( 'select * from chatinfo '  );
      FDQuery1.SQL.Add( 'where targetuser = :p_u and readyn = 0 ');
      FDQuery1.ParamByName('p_u').AsString := tuser;
      FDQuery1.Open;
      FDQuery1.First;

      JArr :=  TJSONArray.Create;
      while Not FDQuery1.EOF do
      begin
        JsubObj := TJSONObject.Create;

        for i := 0 to FDQuery1.FieldCount - 1 do
           JsubObj.AddPair( FDQuery1.Fields[ i ].FullName,  FDQuery1.Fields[ i ].AsString );  // 조회 결과값의 필드명과 데이터를 같이 출력 하는 방법

        JArr.AddElement( JsubObj );
        FDQuery1.Next;
      end;

      JPair := TJSONPair.Create( 'Items', JArr );

      JTopObj.AddPair( 'PathInfo', '/chatread' );
      JTopObj.AddPair( 'TargetUser', tuser );
      JTopObj.AddPair( 'Count', TJSONNumber.Create( FDQuery1.RecordCount ) );
      JTopObj.AddPair( JPair );
    except
      on e: Exception do begin
            Form1.LogMemo.Lines.Add( e.Message );  // 에러 로그 출력
      end;
    end;

  finally
    Response.StatusCode := 200;
    Response.Content := JTopObj.ToString;
    JTopObj.Free;

    // 읽음 표시 -------------------------------------------
    FDQuery1.SQL.Clear;
    FDQuery1.SQL.Add( 'update chatinfo set readyn = 1 '  );
    FDQuery1.SQL.Add( 'where targetuser = :p_u and readyn = 0 ');
    FDQuery1.ParamByName('p_u').AsString := tuser;
    FDQuery1.ExecSQL();

    FDConnection1.Close;
  end;
end;

 

아래와 같은 형태로 메시지를 전달 받을수 있게 됩니다.

image.png

이 댓글 링크
다른 사이트에 공유하기

  • c2design changed the title to REST 서버로 채팅 시스템 구현해보기 [Part1-서버 ]

이 토의에 참여하세요

지금 바로 의견을 남길 수 있습니다. 그리고 나서 가입해도 됩니다. 이미 회원이라면, 지금 로그인하고 본인 계정으로 의견을 남기세요.

Guest
이 토픽(기고/질문)에 답하기

×   서식있는 텍스트로 붙여넣기.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   이전에 작성한 콘텐츠가 복원되었습니다..   편집창 비우기

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...

중요한 정보

이용약관 개인정보보호정책 이용규칙 이 사이트가 더 잘 작동하기 위해 방문자의 컴퓨터에 쿠키가 배치됩니다. 쿠키 설정 변경에서 원하는 설정을 할 수 있습니다. 변경하지 않으면 쿠키를 허용하는 것으로 이해합니다.