FreePascal Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
FreePacal 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
델마당
볼랜드포럼 광고 모집

FreePascal 강좌/문서
[3] 라자루스를 이용한 업무 프로그램 개발 - 2
어느좋은날 [freepascal] 722 읽음    2020-06-13 22:37
0-2. 통신 규약 및 DB 테이블

미들웨어와의 통신 규약은 간단하게 전송할 데이터의 길이를 먼저 보내고 그 길이만큼 데이터를 전송하는 방식으로 개발한다. 전송 데이터의 첫번째 byte는 어떤 정보인지 확인 할 수 있는 구분자로 사용한다.
 길이(Int64) = Length(구분자) + Length(데이터)  구분자(1 byte)  데이터 

길이와 구분을 제외한 데이터 부분은 간단하게 암호화를 해서 전송한다. 본강좌에 사용할 암호화는 예시를 들기위해 사용한, 복잡하거나 거창한게 아닌, 암호화라기보다는 중간에서 패킷을 가로챘을 때 바로 못 알아볼 정도의 난독화 수준이다. 실제 업무용으로 개발할 때는 각자가 알아서 좀더 정교한 암호화 방식을 사용하면 좋을 것이다.
  // 데이터 암호화
  procedure GP_SIMLazEnc(var AValue: TIdBytes);
  var
    i, l, x, k: Int32;
  begin
    l := Length(AValue);
    if l <= 0 then Exit;

    k := (l mod 100) + 21;
    for i := 0 to l - 1 do
    begin
      x := AValue[i] + k;
      if x > 255 then x := x - 256;
      AValue[i] := UInt8(x);
    end;
  end;

  // 데이터 해독
  procedure GP_SIMLazDec(var AValue: TIdBytes);
  var
    i, l, x, k: Int32;
  begin
    l := Length(AValue);
    if l <= 0 then Exit;

    k := (l mod 100) + 21;
    for i := 0 to l - 1 do
    begin
      x := AValue[i] - k;
      if x < 0 then x := x + 256;
      AValue[i] := UInt8(x);
    end;
  end;


미들웨어와 통신할 정보는 아래와 같이 로그인과 데이터 처리 및 버전을 확인하고 업그레이드 파일을 다운받는 정도의 최소한으로 정한다.(아래 표는 클라이언트 기준임.)
※ 전송 및 수신 데이터 항목에 사용된 "|" 기호는 프로그램 코드에서는 #9(tab) 값임.
구분자내 용전송 데이터수신 데이터
A버전 정보프로그램ID버전정보(ex: 1.0)
B접속자 목록NULL사용자ID | 접속ID | 접속일시
C로그인사용자ID | 암호(SHA256)관리자여부(1/0) | 사용자명
D데이터 가져오기(Open Query)요청 SQL반환 XML
E데이터 처리(Execute Query)요청 SQL처리한 건수
F파일 다운로드프로그램ID파일 데이터
XError(수신전용)-에러메세지
Y접속응답(수신전용)-NULL
ZDummyNULLNULL

클라이언트가 의도하지않게 죽을 경우 서버에 프로세스가 남아있을 수 있는데, 그것을 막기 위해 타이머를 이용해서 요청시간이 정해진 시간을 초과한 클라이언트를 제거한다. 클라이언트는 일정 시간마다 요청시간을 갱신해야하는데 아무런 처리 사항이 없을 경우 Dummy를 날려서 요청시간을 갱신한다.

본 강좌에서 테스트로 사용할 DB Table 정보는 아래와 같다.
/* 사용자 정보 */
CREATE TABLE slusrm
(
  usr_id               varchar(32) NOT NULL,         /* 사용자ID */
  usr_name             varchar(100) NOT NULL,        /* 사용자명 */
  passwd               varchar(128) NOT NULL,        /* 암호 */
  reg_date             date DEFAULT current_date,    /* 등록일 */
  admin_yn             char(1) DEFAULT '0' NOT NULL, /* 관리자여부 */
  use_yn               char(1) DEFAULT '1' NOT NULL, /* 사용여부 */
  remark               varchar(200),                 /* 비고 */
  CONSTRAINT pk_slusrm PRIMARY KEY ( usr_id )
);
INSERT INTO slusrm ( usr_id, usr_name, passwd, reg_date, admin_yn, use_yn )
VALUES ( 'ADMIN', '관리자', '8C6976E5B5410415BDE908BD4DEE15DFB167A9C873FC4BB8A81F6F2AB448A918', current_date, '1', '1' ) ;

/* 버전 관리 */
CREATE TABLE slverm
(
  ver_id               varchar(16) NOT NULL,         /* Version ID */
  ver_major            integer NOT NULL,             /* Major Version */
  ver_minor            integer NOT NULL,             /* Minor Version */
  CONSTRAINT pk_slverm PRIMARY KEY ( ver_id )
);

/* Program Menu */
CREATE TABLE slmenum
(
  menu_id              varchar(16) NOT NULL,         /* Menu ID */
  up_id                varchar(16),                  /* 상위 Menu ID */
  menu_name            varchar(50) NOT NULL,         /* Menu Name */
  menu_yn              char(1) DEFAULT '1' NOT NULL, /* Menu 여부 */
  prg_id               varchar(200),                 /* Program ID */
  ord                  integer DEFAULT 1 NOT NULL,   /* 정렬순서 */
  CONSTRAINT pk_slmenum PRIMARY KEY ( menu_id )
);

/* 사용자별 Program Menu */
CREATE TABLE slmenut
(
  usr_id               varchar(32) NOT NULL,         /* 사용자ID */
  menu_id              varchar(16) NOT NULL,         /* Menu ID */
  auth_v               char(1) DEFAULT '0' NOT NULL, /* 조회권한 */
  auth_n               char(1) DEFAULT '0' NOT NULL, /* 등록권한 */
  auth_m               char(1) DEFAULT '0' NOT NULL, /* 수정권한 */
  auth_d               char(1) DEFAULT '0' NOT NULL, /* 삭제권한 */
  auth_p               char(1) DEFAULT '0' NOT NULL, /* 인쇄권한 */
  auth_a               char(1) DEFAULT '0' NOT NULL, /* 전체권한 */
  CONSTRAINT pk_slmenut PRIMARY KEY ( usr_id, menu_id )
);
CREATE INDEX idx_slmenut01 ON slmenut ( usr_id, menu_id ) ;

/* 기본코드(Major) */
CREATE TABLE slmajorm
(
  major_code           varchar(16) NOT NULL,         /* Major Code */
  major_name           varchar(50) NOT NULL,         /* Major Name */
  use_yn               char(1) DEFAULT '1' NOT NULL, /* 사용여부(0/1) */
  remark               varchar(200),                 /* 비고 */
  CONSTRAINT pk_slmajorm PRIMARY KEY ( major_code )
);
CREATE INDEX idx_slmajorm01 ON slmajorm ( use_yn, major_code ) ;

/* 기본코드(Minor) */
CREATE TABLE slminorm
(
  major_code           varchar(16) NOT NULL,         /* Major Code */
  minor_code           varchar(16) NOT NULL,         /* Minor Code */
  minor_name           varchar(50) NOT NULL,         /* Minor Name */
  use_yn               char(1) DEFAULT '1' NOT NULL, /* 사용여부(0/1) */
  remark               varchar(200),                 /* 비고 */
  CONSTRAINT pk_slminorm PRIMARY KEY ( major_code, minor_code )
);
CREATE INDEX idx_slminorm01 ON slminorm ( use_yn, major_code ) ;


로그인용 암호는 역함수가 없어도 되기때문에 SHA256을 사용한다.(※ ADMIN용으로 등록한 기초자료의 암호는 "admin" 임.)

+ -

관련 글 리스트
3 라자루스를 이용한 업무 프로그램 개발 - 2 어느좋은날 722 2020/06/13
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.