이 글에서는 델파이를 이용해 리눅스 서버에서 구동되는 아파치 모듈을 웹브로커 기술을 이용해 만드는 방법을 소개합니다.

(이 글에서는 리눅스 서버 설정과 MySQL 설정 등에 대해서는 자세히 다루지 않습니다.)

 

델파이로 리눅스 기반 웹서비스 제작하기(WebBroker 이용)

linux_webbroker.png

 

 

RAD 스튜디오 10.2 도쿄버전에서 리눅스 개발을 지원합니다. 이제 델파이로 리눅스 서버용 프로그램을 개발 및 배포, 디버깅 할 수 있습니다. 

이 글은 RAD 스튜디오 10.2 도쿄 버전 기준으로 작성되었습니다.

 

이 글에서 아래의 내용을 진행합니다.

 - 콘솔 기반 WebBroker 프로젝트 제작 및 리눅스에서 실행

 - 아파치 모듈 기반 WebBroker 프로젝트 제작 및 리눅스에 배포, 테스트

 - 리눅스의 MySQL(FireDAC 이용) 데이터 연동해 JSON 데이터 응답하기

 

다음 순서로 진행합니다.

 - 개발준비

 - 콘솔 기반 WebBroker 프로젝트 만들기

 - 콘솔 애플리케이션 리눅스에서 실행

 - 아파치 모듈 기반 WebBroker 프로젝트 만들기

 - 아파치 모듈 리눅스에 배포

 - MySQL 연결(FireDAC 이용)

개발 준비

리눅스가 설치된 별도의 컴퓨터 또는 가상머신을 준비합니다.

개발환경 설정은 다음 링크를 통해서 진행할 수 있습니다.

 - 델파이/C++빌더 리눅스 개발환경 설정하기

 

콘솔 기반 WebBroker 프로젝트 만들기

WebBroker 프로젝트 생성(Stand-alone console application)

델파이 실행 후 File > New > Other 메뉴를 선택합니다.

 

Delphi Projects > WebBroker 메뉴 선택 후 Web Server Application 항목 선택 후 [OK] 버튼을 클릭합니다.

 

create_webbroker.png

 

 

마법사 창에서 Linux 플랫폼을 추가로 선택 후 [Next >>] 버튼을 클릭합니다.

wb_select_platform.png

 

 

프로젝트 타입으로 Stand-alone console application 항목을 선택합니다.

 - Apache dynamic link module : 아파치 모듈을 만들어 아파치 웹서버를 이용해 구동합니다.

 - Stand-alone console application : 독립형 콘솔 어플리케이션을 제작합니다.

wb_select_protype.png

 

 

독립형 콘솔 애플리케이션이 사용할 HTTP 포트번호를 입력 후 [Finish] 버튼을 누릅니다.

포트번호는 소스코드 상에서 변경 가능합니다.

wb_port.png

 

 

생성한 프로젝트를 저장합니다.(Ctrl + Shift + S) 프로젝트 명은 LinuxSAConsole로 지정합니다.(이름을 다르게 지정해도 됩니다.)

wb_save_dir.png

 

 

윈도우에서 실행

테스트를 위해 윈도우에서 실행하면 아래와 같이 콘솔모드로 실행됩니다."start" 키워드 입력해 서버를 시작할 수 있습니다.

wb_run_win.png

 

 

웹브라우저에서 "http://localhost:8080" 주소를 열면 아래와 같이 WebModuleUnit1에 정의된 응답데이터가 표시됩니다.

wb_webbrowser.png

 

 

(콘솔 프로그램을 종료하고) 구동 시 서버가 자동으로 시작되도록 프로젝트 파일(LinuxSAConsole)의 RunServer 함수에 아래 그림을 참고해 "StartServer(LServer);"를 추가합니다.

wb_autorun.png

 

 

리눅스에서 실행(콘솔 기반 WebBroker 프로젝트)

PAServer 실행

리눅스 터미널에서 PAServer가 설치된 경로로 이동 후 PAServer를 실행합니다.

linux_run_paserver.png

 

 

연결에 사용할 비밀번호 입력 후 엔터, "i" 명령어로 PAServer의 IP주소를 확인합니다.

linux_run_paserver2.png

 

 

타겟 플랫폼을 리눅스로 지정

델파이 IDE의 프로젝트 매니저에서 Target Platforms을 "64-bit Linux" 항목을 선택합니다.

ide_targetplatform.png

 

만약, "64-bit Linux" 항목이 없다면, Target Platforms 항목의 팝업메뉴에서 "Add Platform..." 메뉴를 선택 후 "64-bit Linux"를 추가합니다. 

(64-bit Linux 플랫폼은 RAD 스튜디오 10.2 도쿄 이후 버전,  엔터프라이즈 에디션 이상에서 사용할 수 있습니다.)

 

PAServer 연결

PAServer 연결 설정하기 위해 "64-bit Linux" 항목의 팝업 메뉴에서 "Edit Connection..." 메뉴를 선택합니다.

 

ide_edit_connection.png

 

 

리눅스에서 실행한 PAServer 연결설정을 선택(또는 추가 후 선택) 후 [OK] 버튼을 누릅니다.

ide_select_conn.png

 

 

리눅스에서 실행

프로젝트를 실행(Run, F9)합니다.

 

웹브라우저에서 리눅스 서버 IP와 8080포트로 웹페이지를 열면 아래와 같이 표시됩니다.

ide_linux_web.png

 

 

프로젝트 파일 저장 경로 하위 "\Linux64\Debug\" 경로에 리눅스 실행파일이 생성됩니다.

ide_output_dir.png

 

 

PAServer를 통해 리눅스에도 실행파일이 배포됩니다.

홈디렉토리 하위 "/PAServer/scratch-dir/(PAServer 연결문자)/(프로젝트명)" 하위에 LinuxSAConsole 파일이 복사됩니다. 리눅스에서 콘솔 프로그램을 직접 실행할 수 있습니다.

ide_output_linux.png

 

 

아파치 모듈 기반 WebBroker 프로젝트 만들기

WebBroker 프로젝트 생성(Apache dynamic link module)

WebBroker 프로젝트를 생성(File > New > Other > Delphi > WebBroker > Web Server Application)하고, "Apache dynamic link module" 프로젝트 타입을 선택합니다.

wb_apache.png

 

 

Apache module을 수정하고 [Finish] 버튼을 누릅니다.

 - Apache module(아파치 모듈 이름)은 뒤에서 설명하는 "apache2 모듈 활성화에 등록" 시 사용합니다.

wb_apache_mod.png

 

 

생성한 프로젝트를 저장합니다.(Ctrl + Shift + S)

ap_dir.png

 

 

WebBroker 프로젝트 빌드

WebModule 유닛에 필요한 기능을 구현합니다.

ap_webmodule_modify.png

 

 

리눅스 타겟으로 빌드합니다.

 

ap_promgr.png

 

 

아래와 같이 프로젝트 저장 경로 하위 ".\Linux64\Debug\" 디렉토리에 so 확장자의 아파치 모듈이 생성됩니다.

ap_output.png

 

 

리눅스에 배포(아파치 모듈 기반 WebBroker 프로젝트)

아파치 모듈 리눅스로 복사

위에서 생성한 아파치 모듈(libmod_webbroker.so)을 리눅스로 복사합니다.(USB 메모리, FTP 클라이언트 프로그램 등을 이용합니다.) 

저는 제 작업디렉토리(/home/humphrey/WorkData/)에 복사했습니다.

 

ap_winscp.png

 

 

아파치 모듈 디렉토리로 복사

아파치 모듈 디렉토리(/usr/lib/apache2/modules)로 아파치 모듈을 복사합니다.

ap_modules.png

 

su : root 권한을 가져옵니다.(/usr/lib 하위 경로에 복사하기 위해 root 권한이 필요합니다.)

cp : 파일을 복사합니다.

cd : 디렉토리를 변경합니다.

ls : 현재 디렉토리의 파일목록을 표시합니다.

 

apache2 모듈 활성화에 등록

/etc/apache2/mods-enabled/ 디렉토리로 이동 합니다.

nano 에디터를 이용(vi 등 다른 에디터를 이용해도 됩니다.) libmod_webbroker.load 파일을 편집(생성) 합니다.(root 권한 필요)

nano libmod_webbroker.load

ap_mods_enable_nano.png

 

 

nano 에디터에서 아래와 같이 입력하고 저장(Ctrl + X > Y > 엔터)합니다.(root 권한 필요)

LoadModule (아파치 모듈 이름) (아파치 모듈 파일경로) 

LoadModule webbroker_module /usr/lib/apache2/modules/libmod_webbroker.so

ap_modes_enable_nono2.png

 

 

아파치를 다시 시작합니다.(root 권한 필요)

/etc/init.d/apache2 restart

ap_modes_enable_nano3.png

 

 

apache2 사이트 활성화에 등록

/etc/apache2/sites-enabled/ 디렉토리로 이동합니다.

nano 에디터를 이용해 000-default.conf 파일을 편집합니다.(root 권한 필요)

nano 000-default.conf

 

ap_sites_enable1.png

 

 

DocumentRoot 아래에 아래 코드를 입력합니다.

 

<Location /webbroker>

  SetHandler libmod_webbroker-handler

</Location>

 

현재서버의 /webbroker 경로로 웹서버 호출 시 libmod_webbroker.load 로드하도록 설정

저장하고 빠져나옵니다.(Ctrl + X > Y > 엔터)

ap_sites_enable2.png

 

 

배포가 완료되었습니다. 리눅스 서버의 아이피(또는 도메인)과 webbroker 경로를 웹브라우저에서 입력해 열면 아래와 같은 결과를 볼 수 있습니다.

ap_sites_enable_wb.png

 

MySQL 연결(FireDAC 이용)

리눅스에 설치된 MySQL의 데이터를 JSON 포맷으로 출력합니다. 위에서 만든 WebBroker 아파치 모듈에 기능을 추가합니다. 데이터 엑세스 컴포넌트는 FireDAC을 이용합니다.

 

MySQL 준비

리눅스 서버에 설치된 MySQL과 연결하기 위해 리눅스 서버에 MySQL이 설치되어 있어야 합니다.

 - 우분투 MySQL 설치하기 - http://moomini.tistory.com/66

 

델파이가 설치된 원격환경에서 MySQL과 연결하기 위해 MySQL 외부 접속을 허용합니다.

 - MySQL 외부접속 허용 - http://idchowto.com/?p=11068

 

스키마와 계정, 테이블을 생성합니다. 스키마 명과 계정명, 비밀번호는 모두 'test'로 합니다.

스키마 생성

create schema test;

 

계정 생성

create user 'test'@'%' identified by 'test';

 

테이블 생성

CREATE TABLE USER(

  USER_ID int, 

  NAME VARCHAR(255) character set utf8, 

  ADDRESS VARCHAR(255) character set utf8, 

  CITY VARCHAR(255) character set utf8);

 

테스트 데이터 입력

INSERT INTO USER VALUES(1, '김현수', '내가 사는 우리집', '인천');

INSERT INTO USER VALUES(2, '홍길동', '네가 사는 너희집', '강릉');

 

FireDAC 컴포넌트를 이용해 MySQL과 연결

FireDAC을 이용해 리눅스 서버의 MySQL과 연결합니다.

 

DB 연결 컴포넌트 추가

WebModuleUnit1을 열고, TFDConnection, TFDQuery 컴포넌트를 추가합니다.

ap_ide_webmodule.png

 

 

데이터베이스 연결 설정

TFDConnection 컴포넌트의 연결설정 화면을 열고(컴포넌트 더블클릭) 아래와 같이 입력합니다.

ap_ide_conn.png

 

 - Driver ID : MySQL

 - Database : test

 - User_Name : test

 - Password : test

 - Server : 리눅스 서버의 IP 주소(또는 도메인)

 - CharacterSet : UTF8(한글을 표현하기 위해)

 

[Test] 버튼을 눌러 연결을 확인합니다.(만약 연결되지 않는 경우 서버 IP주소 또는 MySQL 외부연결 설정을 확인합니다.)

LoginPrompt 속성을 False로 변경합니다.

 

쿼리 설정

쿼리 컴포넌트(TFDQuery)의 Query Editor를 열고(컴포넌트 더블클릭) 쿼리문을 작성합니다.

ap_ide_query.png

 

 

SELECT * FROM USER 

[Execute] 버튼을 눌러 결과를 확인합니다. 

[OK] 버튼을 눌러 적용합니다.

 

테이블 내용을 JSON 포맷으로 데이터 작성

JSON 데이터 작성은 TJsonObjectWriter 클래스를 활용합니다.(System.JSON.Writers 유닛 필요)

 

아래 코드를 참조해 private 영역에 QueryUser 메소드를 작성합니다.

QueryUser 메소드는 쿼리 결과를 JSON 포맷으로 작성 후 JSON 문자열로 반환하는 역할을 합니다.

uses

  System.JSON, System.JSON.Writers;

 

function TWebModule1.QueryUser: string;

var

  Writer: TJsonObjectWriter;

begin

  Writer := TJsonObjectWriter.Create;

  try

    Writer.WriteStartObject; // start resource

    Writer.WritePropertyName('users');

    Writer.WriteStartArray;

 

    FDQuery1.Open;

    FDQuery1.First;

    while not FDQuery1.Eof do

    begin

      Writer.WriteStartObject;

 

      Writer.WritePropertyName('USER_ID');

      Writer.WriteValue(FDQuery1.FieldByName('USER_ID').AsString);

 

      Writer.WritePropertyName('NAME');

      Writer.WriteValue(FDQuery1.FieldByName('NAME').AsString);

 

      Writer.WritePropertyName('ADDRESS');

      Writer.WriteValue(FDQuery1.FieldByName('ADDRESS').AsString);

 

      Writer.WritePropertyName('CITY');

      Writer.WriteValue(FDQuery1.FieldByName('CITY').AsString);

 

      Writer.WriteEndObject;

      FDQuery1.Next;

    end;

    Writer.WriteEndArray;

 

    Result := Writer.JSON.ToJSON;

  finally

    Writer.DisposeOf;

  end;

end;

 

WebModule1DefaultHandlerAction에서 응답 컨텐츠로 QueryUser를 연결합니다.

procedure TWebModule1.WebModule1DefaultHandlerAction(Sender: TObject;

  Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);

begin

  Response.Content := QueryUser;

end;

 

리눅스로 배포하기

프로젝트를 빌드하고, 생성된 아파치 모듈(libmod_webbroker.so)을 리눅스로 복사합니다.

저는 제 작업디렉토리(/home/humphrey/WorkData/)에 복사했습니다.

 

아파치 모듈 복사

아파치 모듈 복사하기 전 아파치 서비스를 중단합니다.(root 권한 필요)

아파치 모듈을 복사하고 다시 아파치 서비스를 시작합니다.

 

ap_redploy_module.png

 

 

결과확인

리눅스 서버의 주소 하위 /webbroker 페이지 호출 시 JSON 포맷 문자열로 출력됩니다.

(한글은 UTF8로 인코딩된것을 확인할 수 있습니다.)

ap_complete_wb.png

 

 

REST Debugger(Tools > REST Debugger)로 확인해 한글이 잘 표현되는 것을 확인할 수 있습니다.

ap_comp_restdebug.png

 

 

참고자료


번호 제목 글쓴이 날짜 조회 수
공지 [DelphiCon 요약] 코드사이트 로깅 실전 활용 기법 (Real-world CodeSite Logging Techniques) 관리자 2021.01.19 14387
공지 [UX Summit 요약] 오른쪽 클릭은 옳다 (Right Click is Right) 관리자 2020.11.16 13023
공지 [10.4 시드니] What's NEW! 신기능 자세히 보기 관리자 2020.05.27 15532
공지 RAD스튜디오(델파이,C++빌더) - 고객 사례 목록 관리자 2018.10.23 21064
공지 [데브기어 컨설팅] 모바일 앱 & 업그레이드 마이그레이션 [1] 관리자 2017.02.06 22297
공지 [전체 목록] 이 달의 기술자료 & 기술레터 관리자 2017.02.06 17933
공지 RAD스튜디오(델파이, C++빌더) - 시작하기 [1] 관리자 2015.06.30 38228
공지 RAD스튜디오(델파이,C++빌더) - 모바일 앱 개발 사례 (2020년 11월 업데이트 됨) 험프리 2014.01.16 173741
1183 [고객사례-사물인터넷, 앱, 델파이] 로봇청소기 제어 앱 '니토 툴리오' 관리자 2020.03.24 369
1182 RAD Studio 10.3.3 안드로이드 앱에서 센서 컴포넌트 사용시 링크 오류 해결방법 김원경 2020.03.18 343
1181 [델파이 안드로이드 64비트 오류 수정] TInAppPurchase 컴포넌트 수정 file 김원경 2020.03.18 335
1180 [기술백서] 다양한 팀 '협업' 방법론과 개발 방식 관리자 2020.03.18 643
1179 RAD Studio IDE에 툴 추가하기 file 김원경 2020.03.17 329
1178 RAD 서버 : 웹 속성을 폴더에 매핑하기 file 김원경 2020.03.17 1534
1177 델파이 개발자 관점에서 본 윈도우 개발 file 김원경 2020.03.13 700
1176 C++ 언어와 C++빌더의 23년! 관리자 2020.03.13 569
1175 MS 비주얼 스튜디오 C++을 C++빌더와 함께 활용하기 관리자 2020.03.12 527
1174 Swagger / YAML 및 RESTful API의 자체 문서화 김원경 2020.03.11 1588
1173 [고객사례-유틸리티, 델파이] Navuu 관리자 2020.03.09 330
1172 [고객사례-유틸리티, 델파이] SupRemo - 개인방송, 화상회의 솔루션 관리자 2020.03.09 817
1171 RAD 서버에 Swagger UI 임베이딩 김원경 2020.03.09 527
1170 검사(Audits)와 측정(Metrics) 기능을 이용 소스코드 표준과 규약 준수를 측정하고 개선할 수 있습니다. 험프리 2020.03.06 281
1169 TEMSDataSetResource 컴포넌트를 사용하여 RAD 서버의 마스터-디테일 데이터 구현하기 file 김원경 2020.03.06 403
1168 RESTful 마스터-디테일 데이터를 사용하는 클라이언트 애플리케이션을 TRESTResponseDataSetAdapter를 사용하여 개발하기 file 험프리 2020.03.03 507
1167 [10.4 프리뷰] 베타 서비스 시작 & 새 기능 미리 보기 관리자 2020.03.03 1605
1166 델파이 25주년 기념 무료 크로스 플랫폼 샘플 앱 25개 선정(델파이/C++ 샘플 150여종) 험프리 2020.03.02 659
1165 윈도우 10에서의 High DPI 김원경 2020.03.02 1248
1164 이 달의 기술자료 - 2020년 03월 file 험프리 2020.02.28 271