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

(이 글에서는 리눅스 서버 설정과 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 14479
공지 [UX Summit 요약] 오른쪽 클릭은 옳다 (Right Click is Right) 관리자 2020.11.16 13119
공지 [10.4 시드니] What's NEW! 신기능 자세히 보기 관리자 2020.05.27 15626
공지 RAD스튜디오(델파이,C++빌더) - 고객 사례 목록 관리자 2018.10.23 21139
공지 [데브기어 컨설팅] 모바일 앱 & 업그레이드 마이그레이션 [1] 관리자 2017.02.06 22405
공지 [전체 목록] 이 달의 기술자료 & 기술레터 관리자 2017.02.06 18028
공지 RAD스튜디오(델파이, C++빌더) - 시작하기 [1] 관리자 2015.06.30 38314
공지 RAD스튜디오(델파이,C++빌더) - 모바일 앱 개발 사례 (2020년 11월 업데이트 됨) 험프리 2014.01.16 173824
654 XML MAPPER 업데이트 관리자 2020.10.21 274
653 [개발팁] 오래된 레거시 델파이, C++ 애플리케이션을 최신 스타일의 초고속 앱으로 마이그레이션하기 관리자 2020.10.15 333
652 [10.4 시드니][업데이트 1] 새로운 IDE 기능들 관리자 2020.10.08 329
651 [엠바카데로 UX SUMMIT] 눈여겨 봐야할 컨텐츠들! 관리자 2020.10.06 285
650 이 달의 기술자료 - 2020년 10월 file 험프리 2020.09.24 356
649 [발표자료] 델파이 개발자가 REST 서비스를 활용할 때 가장 많이 하는 질문 TOP 5 file 관리자 2020.09.18 1164
648 [10.4 시드니][업데이트 1] 새로운 TLightweightMREW 레코드 관리자 2020.09.10 403
647 [10.4 시드니][업데이트 1] What's NEW! 신기능 자세히 보기 [2] 관리자 2020.09.03 967
646 [REST API] REST 기반 파일 업로드와 다운로드 구현하기 험프리 2020.08.31 82868
645 [개발환경] 델파이, RAD스튜디오 에서 Git과 Github를 사용해야하는 이유와 꼭 필요한 만큼 사용법 관리자 2020.08.27 1253
644 이 달의 기술자료 - 2020년 09월 file 험프리 2020.08.27 258
643 델파이/C++빌더에 TTcpClient, TTcpServer, TUdpSocket 등록하기 [1] file 험프리 2020.08.26 614
642 [고객 사례- 델파이, 예술, 창작] 아트젠, 컴퓨터로 완성하는 미술 작품 관리자 2020.08.25 386
641 2020 년 8 월 GM 업데이트 관리자 2020.08.24 479
640 이 달의 기술자료 - 2020년 08월 험프리 2020.07.30 359
639 [10.4 시드니][패치] RAD스튜디오 10.4 '세 번째 패치(Patch 3)': VCL그리드, C++Win64 디버깅, C++ 안드로이드 예외처리 핸들링 및 리소스 등 관리자 2020.07.29 681
638 [생산성] RAD 스튜디오, 델파이, C++빌더 단축키 표 관리자 2020.07.28 406
637 [발표자료] VCL 애플리케이션 확장하기 with RAD 서버 관리자 2020.07.22 377
636 [발표자료] 20170623 최신OS와 멀티플랫폼 개발 전략 with RAD Studio 관리자 2020.07.22 257
635 델파이 개발자 관점에서 본 C++ 빌더 file 김원경 2020.07.20 1158