공통 [10.2 도쿄] 델파이로 리눅스 기반 웹서비스 제작하기(WebBroker 이용)
2017.03.30 10:43
이 글에서는 델파이를 이용해 리눅스 서버에서 구동되는 아파치 모듈을 웹브로커 기술을 이용해 만드는 방법을 소개합니다.
(이 글에서는 리눅스 서버 설정과 MySQL 설정 등에 대해서는 자세히 다루지 않습니다.)
델파이로 리눅스 기반 웹서비스 제작하기(WebBroker 이용)
RAD 스튜디오 10.2 도쿄버전에서 리눅스 개발을 지원합니다. 이제 델파이로 리눅스 서버용 프로그램을 개발 및 배포, 디버깅 할 수 있습니다.
이 글은 RAD 스튜디오 10.2 도쿄 버전 기준으로 작성되었습니다.
이 글에서 아래의 내용을 진행합니다.
- 콘솔 기반 WebBroker 프로젝트 제작 및 리눅스에서 실행
- 아파치 모듈 기반 WebBroker 프로젝트 제작 및 리눅스에 배포, 테스트
- 리눅스의 MySQL(FireDAC 이용) 데이터 연동해 JSON 데이터 응답하기
다음 순서로 진행합니다.
- 개발준비
- 콘솔 기반 WebBroker 프로젝트 만들기
- 콘솔 애플리케이션 리눅스에서 실행
- 아파치 모듈 기반 WebBroker 프로젝트 만들기
- 아파치 모듈 리눅스에 배포
- MySQL 연결(FireDAC 이용)
개발 준비
리눅스가 설치된 별도의 컴퓨터 또는 가상머신을 준비합니다.
개발환경 설정은 다음 링크를 통해서 진행할 수 있습니다.
콘솔 기반 WebBroker 프로젝트 만들기
WebBroker 프로젝트 생성(Stand-alone console application)
델파이 실행 후 File > New > Other 메뉴를 선택합니다.
Delphi Projects > WebBroker 메뉴 선택 후 Web Server Application 항목 선택 후 [OK] 버튼을 클릭합니다.
마법사 창에서 Linux 플랫폼을 추가로 선택 후 [Next >>] 버튼을 클릭합니다.
프로젝트 타입으로 Stand-alone console application 항목을 선택합니다.
- Apache dynamic link module : 아파치 모듈을 만들어 아파치 웹서버를 이용해 구동합니다.
- Stand-alone console application : 독립형 콘솔 어플리케이션을 제작합니다.
독립형 콘솔 애플리케이션이 사용할 HTTP 포트번호를 입력 후 [Finish] 버튼을 누릅니다.
포트번호는 소스코드 상에서 변경 가능합니다.
생성한 프로젝트를 저장합니다.(Ctrl + Shift + S) 프로젝트 명은 LinuxSAConsole로 지정합니다.(이름을 다르게 지정해도 됩니다.)
윈도우에서 실행
테스트를 위해 윈도우에서 실행하면 아래와 같이 콘솔모드로 실행됩니다."start" 키워드 입력해 서버를 시작할 수 있습니다.
웹브라우저에서 "http://localhost:8080" 주소를 열면 아래와 같이 WebModuleUnit1에 정의된 응답데이터가 표시됩니다.
(콘솔 프로그램을 종료하고) 구동 시 서버가 자동으로 시작되도록 프로젝트 파일(LinuxSAConsole)의 RunServer 함수에 아래 그림을 참고해 "StartServer(LServer);"를 추가합니다.
리눅스에서 실행(콘솔 기반 WebBroker 프로젝트)
PAServer 실행
리눅스 터미널에서 PAServer가 설치된 경로로 이동 후 PAServer를 실행합니다.
연결에 사용할 비밀번호 입력 후 엔터, "i" 명령어로 PAServer의 IP주소를 확인합니다.
타겟 플랫폼을 리눅스로 지정
델파이 IDE의 프로젝트 매니저에서 Target Platforms을 "64-bit Linux" 항목을 선택합니다.
만약, "64-bit Linux" 항목이 없다면, Target Platforms 항목의 팝업메뉴에서 "Add Platform..." 메뉴를 선택 후 "64-bit Linux"를 추가합니다.
(64-bit Linux 플랫폼은 RAD 스튜디오 10.2 도쿄 이후 버전, 엔터프라이즈 에디션 이상에서 사용할 수 있습니다.)
PAServer 연결
PAServer 연결 설정하기 위해 "64-bit Linux" 항목의 팝업 메뉴에서 "Edit Connection..." 메뉴를 선택합니다.
리눅스에서 실행한 PAServer 연결설정을 선택(또는 추가 후 선택) 후 [OK] 버튼을 누릅니다.
리눅스에서 실행
프로젝트를 실행(Run, F9)합니다.
웹브라우저에서 리눅스 서버 IP와 8080포트로 웹페이지를 열면 아래와 같이 표시됩니다.
프로젝트 파일 저장 경로 하위 "\Linux64\Debug\" 경로에 리눅스 실행파일이 생성됩니다.
PAServer를 통해 리눅스에도 실행파일이 배포됩니다.
홈디렉토리 하위 "/PAServer/scratch-dir/(PAServer 연결문자)/(프로젝트명)" 하위에 LinuxSAConsole 파일이 복사됩니다. 리눅스에서 콘솔 프로그램을 직접 실행할 수 있습니다.
아파치 모듈 기반 WebBroker 프로젝트 만들기
WebBroker 프로젝트 생성(Apache dynamic link module)
WebBroker 프로젝트를 생성(File > New > Other > Delphi > WebBroker > Web Server Application)하고, "Apache dynamic link module" 프로젝트 타입을 선택합니다.
Apache module을 수정하고 [Finish] 버튼을 누릅니다.
- Apache module(아파치 모듈 이름)은 뒤에서 설명하는 "apache2 모듈 활성화에 등록" 시 사용합니다.
생성한 프로젝트를 저장합니다.(Ctrl + Shift + S)
WebBroker 프로젝트 빌드
WebModule 유닛에 필요한 기능을 구현합니다.
리눅스 타겟으로 빌드합니다.
아래와 같이 프로젝트 저장 경로 하위 ".\Linux64\Debug\" 디렉토리에 so 확장자의 아파치 모듈이 생성됩니다.
리눅스에 배포(아파치 모듈 기반 WebBroker 프로젝트)
아파치 모듈 리눅스로 복사
위에서 생성한 아파치 모듈(libmod_webbroker.so)을 리눅스로 복사합니다.(USB 메모리, FTP 클라이언트 프로그램 등을 이용합니다.)
저는 제 작업디렉토리(/home/humphrey/WorkData/)에 복사했습니다.
아파치 모듈 디렉토리로 복사
아파치 모듈 디렉토리(/usr/lib/apache2/modules)로 아파치 모듈을 복사합니다.
su : root 권한을 가져옵니다.(/usr/lib 하위 경로에 복사하기 위해 root 권한이 필요합니다.)
cp : 파일을 복사합니다.
cd : 디렉토리를 변경합니다.
ls : 현재 디렉토리의 파일목록을 표시합니다.
apache2 모듈 활성화에 등록
/etc/apache2/mods-enabled/ 디렉토리로 이동 합니다.
nano 에디터를 이용(vi 등 다른 에디터를 이용해도 됩니다.) libmod_webbroker.load 파일을 편집(생성) 합니다.(root 권한 필요)
nano libmod_webbroker.load
nano 에디터에서 아래와 같이 입력하고 저장(Ctrl + X > Y > 엔터)합니다.(root 권한 필요)
LoadModule (아파치 모듈 이름) (아파치 모듈 파일경로)
LoadModule webbroker_module /usr/lib/apache2/modules/libmod_webbroker.so
아파치를 다시 시작합니다.(root 권한 필요)
/etc/init.d/apache2 restart
apache2 사이트 활성화에 등록
/etc/apache2/sites-enabled/ 디렉토리로 이동합니다.
nano 에디터를 이용해 000-default.conf 파일을 편집합니다.(root 권한 필요)
nano 000-default.conf
DocumentRoot 아래에 아래 코드를 입력합니다.
<Location /webbroker>
SetHandler libmod_webbroker-handler
</Location>
현재서버의 /webbroker 경로로 웹서버 호출 시 libmod_webbroker.load 로드하도록 설정
저장하고 빠져나옵니다.(Ctrl + X > Y > 엔터)
배포가 완료되었습니다. 리눅스 서버의 아이피(또는 도메인)과 webbroker 경로를 웹브라우저에서 입력해 열면 아래와 같은 결과를 볼 수 있습니다.
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 컴포넌트를 추가합니다.
데이터베이스 연결 설정
TFDConnection 컴포넌트의 연결설정 화면을 열고(컴포넌트 더블클릭) 아래와 같이 입력합니다.
- Driver ID : MySQL
- Database : test
- User_Name : test
- Password : test
- Server : 리눅스 서버의 IP 주소(또는 도메인)
- CharacterSet : UTF8(한글을 표현하기 위해)
[Test] 버튼을 눌러 연결을 확인합니다.(만약 연결되지 않는 경우 서버 IP주소 또는 MySQL 외부연결 설정을 확인합니다.)
LoginPrompt 속성을 False로 변경합니다.
쿼리 설정
쿼리 컴포넌트(TFDQuery)의 Query Editor를 열고(컴포넌트 더블클릭) 쿼리문을 작성합니다.
SELECT * FROM USER |
[Execute] 버튼을 눌러 결과를 확인합니다.
[OK] 버튼을 눌러 적용합니다.
테이블 내용을 JSON 포맷으로 데이터 작성
JSON 데이터 작성은 TJsonObjectWriter 클래스를 활용합니다.(System.JSON.Writers 유닛 필요)
아래 코드를 참조해 private 영역에 QueryUser 메소드를 작성합니다.
QueryUser 메소드는 쿼리 결과를 JSON 포맷으로 작성 후 JSON 문자열로 반환하는 역할을 합니다.
|
WebModule1DefaultHandlerAction에서 응답 컨텐츠로 QueryUser를 연결합니다.
|
리눅스로 배포하기
프로젝트를 빌드하고, 생성된 아파치 모듈(libmod_webbroker.so)을 리눅스로 복사합니다.
저는 제 작업디렉토리(/home/humphrey/WorkData/)에 복사했습니다.
아파치 모듈 복사
아파치 모듈 복사하기 전 아파치 서비스를 중단합니다.(root 권한 필요)
아파치 모듈을 복사하고 다시 아파치 서비스를 시작합니다.
결과확인
리눅스 서버의 주소 하위 /webbroker 페이지 호출 시 JSON 포맷 문자열로 출력됩니다.
(한글은 UTF8로 인코딩된것을 확인할 수 있습니다.)
REST Debugger(Tools > REST Debugger)로 확인해 한글이 잘 표현되는 것을 확인할 수 있습니다.
[MySQL 접속 시 아래 오류가 발생하는 경우]
Internal Server Error 500
Exception: EFDException
Message: [FireDAC][Phys][MySQL]-314. Cannot load vendor library [libmysqlclient.so or libmysqld.so]. Hint: check it is in the PATH or application EXE directories, and has x64 bitness.
아래 링크를 참조해서 클라이언트 라이브러리를 설치하시기 바랍니다.
http://docwiki.embarcadero.com/RADStudio/Tokyo/en/Connect_to_MySQL_Server_(FireDAC)#Linux_Client_Software
libmysqlclient.so.18 등의 숫자는 설치된 환경에 따라 다를 수 있으니 주의하시기 바랍니다.