모바일 앱에서 Db2 for i의 데이터를 활용해야 하는 경우, Java JTOpenLite 와 같은 가벼운 JDBC 클래스를 이용해서 DB에 접속하는 방법도 있겠지만, 모바일의 특성상 보안과 안정성, 성능을 고려했을 때 직접 DB에 연결하도록 하기보다 API 게이트웨이를 두고 REST API 서비스를 제공하는 방식이 좋습니다.
이런 경우 Db2 for i 를 REST API 호출 방식으로 사용할 수 있도록 서비스화 하는 작업이 필요한데요. SQL로 간단하게 서버에서 REST API 호출 가능한 웹서비스를 만드는 방법을 알아보겠습니다.
샘플 학생 정보 테이블을 사용하는 학생 정보 등록 서비스를 구현해보겠습니다. 구현할 서비스는 다음과 같습니다.
RESTful 웹 서비스를 외부 공개할 때 어떤 방식으로 할 지에 대해서 몇가지 미리 확인해야 하는 사항이 있는데요.
아래 표는 HTTP 메소드와 URI (Uniform Resource Identifiers) 간에 맵핑 정보 예시입니다.
HTTP 메소드 | URI | 설명 |
GET | /context-root/students | 모든 학생 등록 정보 조회하기 |
GET | /context-root/students/{id} | 특정 학생의 정보 조회하기 |
POST | /context-root/students | 신규 학생 등록하기 |
PUT | /context-root/students | 기존 학생 등록 정보 변경하기 |
DELETE | /context-root/students/{id} | 학생 등록 정보 삭제하기 |
주: 디폴트로 설정되는 context-root는 /web/services 이지만, 서버에서 웹서비스 구성시 변경할 수 있습니다.
이제 각 URI 맵핑별로 어떤 SQL 문을 사용할지를 정하고 프로시져 ID와 연결을 시킬 것입니다.
URI | 프로시져 ID | SQL문 |
/context-root/studetns | GETALL | SELECT * from STUDENTDB |
/context-root/students/{id} | GETBYID | SELECT * from STUDENTDB WHERE "studentID" = ? |
/context-root/students | ADD | INSERT INTO STUDENTDB ("studentID", "Name", "gender") VALUES(?,?,?) |
/context-root/students | UPDATE | UPDATE STUDENTDB SET "Name" = ?, "gender" = ? WHERE "studentID" = ? |
/context-root/students/{id} | REMOVE | DELETE FROM STUDENTDB WHERE "studentID" = ? |
STUDENTRSC 스키마에 STUDENTDB 이름의 테이블을 만듭니다.
CREATE SCHEMA STUDENTRSC;
CREATE TABLE STUDENTRSC.STUDENTDB
("studentID" CHAR (9) NOT NULL,
"Name" CHAR (50) NOT NULL,
"gender" CHAR (10) NOT NULL,
PRIMARY KEY ("studentID"));
샘플 데이터를 추가합니다.
INSERT INTO STUDENTRSC.STUDENTDB
("studentID", "Name", "gender")
VALUES( 'A00000001', '김지호', 'M' ),
( 'A00000002', '박시은', 'F' ),
( 'A00000003', '이하연', 'F' );
서버에서 서비스를 실행할 사용자 프로파일(계정)이 이 테이블을 사용할 수 있도록 권한을 설정합니다. 서버에서 웹서비스를 실행하는 사용자 프로파일은 QWSERVICE 입니다.
CL: CHGAUT OBJ('/qsys.lib/studentrsc.lib/studentdb.file') USER(QWSERVICE) DTAAUT(*RWX);
ILE 프로그램 오브젝트를 REST 서비스로 배포하려면, 통합 웹 서비스 서버를 먼저 만들어야 합니다. (버전은 2.6 이상이어야 함) 만약 이미 만들어둔 게 있다면 이 작업은 안해도 됩니다.
통합 웹 서비스 서버 구성에 관한 상세 내용은 여기를 참조하세요.
3-1. SQL문을 웹 서비스로 배포합니다.
Navigation bar에서 Deploy New Service 마법사를 클릭합니다. 아래와 같은 화면이 나올 것입니다.
Specify Web service type : REST
Specify Web service implementation : SQL as a Web Service
SQL문을 처리하는 데이터베이스 시스템의 디폴트값은 localhost (통합 웹 서비스 서버를 호스팅하고 있는 동일한 시스템) 입니다.
사용하고자 하는 데이터베이스가 현재 서버가 아닌 다른 서버에 있다면 그 시스템의 이름을 명시하면 됩니다.
이 예제에서는 디폴트 스키마로 studentrsc 를 설정하였습니다. 시스템은 SQL문을 실행할 때 별도의 스키마 명시가 안되어 있을 때 디폴트 SQL 스키마를 사용합니다.
Naming convention 은 schema.table 로 표기하는 방식인 SQL로 설정합니다. 만약 schema/table 표기 방식을 선호한다면 *SYS 로 설정합니다.
Next를 클릭합니다.
3-2. 웹 서비스의 이름을 설정합니다.
이제 웹 서비스를 식별할 의미 있는 서비스 이름과 설명을 추가합니다.
Resource name: students
Service description: SQL문 기반의 학생 등록 정보 웹 서비스
URI path template: /
Next를 클릭합니다.
3-3. Security Constraint 를 설정합니다.
Secure transport required: YES
Protect using authentication method: *NONE
3-4. SQL 문을 설정합니다.
각 서비스에 사용할 SQL 문을 추가하기 위해 Add 를 클릭하여 아래와 같이 5가지 SQL 문을 추가하고, Next 를 클릭합니다.
Procedure name |
SQL statement / Parameter name | Usage | Data type |
REMOVE | DELETE FROM STUDENTDB WHERE "studentID" = ? | ||
studentID | input | CHAR | |
UPDATE | UPDATE STUDENTDB SET "Name" = ?, "gender" = ? WHERE "studentID" = ? | ||
Name | input | CHAR | |
gender | input | CHAR | |
ADD | INSERT INTO STUDENTDB ("studentID", "Name", "gender") VALUES(?,?,?) | ||
studentID | input | CHAR | |
Name | input | CHAR | |
gender | input | CHAR | |
GETBYID | SELECT * FROM STUDENTDB WHERE "studentID" = ? | ||
studentID | input | CHAR | |
GETALL | SELECT * FROM STUDENTDB |
3-5. SQL 문을 정보를 설정합니다.
각 프로시져에 SQL문의 출력값을 어떻게 처리할 지를 설정합니다.
REMOVE 프로시져
Procedure name: REMOVE
SQL Statement: DELETE FROM STUDENTDB WHERE "studentID" = ?
SQL result type: Multi-row result set
Trim mode for output fields: Trailing
SQL state information in response: On errors
Treat warnings as SQL Errors: Yes
User-defined error message:
HTTP status code on SQL success: 204
HTTP status code on SQL failure: 500
UPDATE 프로시저
Procedure name: UPDATE
SQL Statement: UPDATE STUDENTDB SET "Name" = ?, "gender" = ? WHERE "studentID" = ?
SQL result type: Multi-row result set
Trim mode for output fields: Trailing
SQL state information in response: On errors
Treat warnings as SQL Errors: Yes
User-defined error message:
HTTP status code on SQL success: 204
HTTP status code on SQL failure: 500
ADD 프로시저
Procedure name: ADD
SQL Statement: INSERT INTO STUDENTDB ("studentID", "Name", "gender") VALUES(?,?,?)
SQL result type: Multi-row result set
Trim mode for output fields: Trailing
SQL state information in response: On errors
Treat warnings as SQL Errors: Yes
User-defined error message:
HTTP status code on SQL success: 201
HTTP status code on SQL failure: 500
GETBYID 프로시저
Procedure name: GETBYID
SQL Statement: SELECT * FROM STUDENTDB WHERE "studentID" = ?
SQL result type: Single-row result set
Trim mode for output fields: Trailing
SQL state information in response: On errors
Treat warnings as SQL Errors: Yes
User-defined error message:
HTTP status code on SQL success: 200
HTTP status code on SQL failure: 500
GETALL 프로시저
Procedure name: GETALL
SQL Statement: SELECT * FROM STUDENTDB
SQL result type: Multi-row result set
Trim mode for output fields: Trailing
SQL state information in response: On errors
Treat warnings as SQL Errors: Yes
User-defined error message:
HTTP status code on SQL success: 200
HTTP status code on SQL failure: 500
3-6. 각 자원/프로시져의 메소드 정보를 설정합니다.
각 프로시져의 REST 정보를 설정합니다.
ADD 프로시져는 HTTP request method를 POST 로 설정
각 프로시져의 REST 정보 요약
REMOVE | URL | /context-root/students/{id} |
Method | DELETE | |
Request body | None | |
Returns | 204 No content | |
500 Server error | ||
UPDATE | URL | /context-root/students |
Method | PUT | |
Request body | JSON | |
Returns | 204 No content | |
500 Server error | ||
ADD | URL | /context-root/students |
Method | POST | |
Request body | JSON | |
Returns | 201 Created | |
500 Server error | ||
GETBYID | URL | /context-root/students/{id} |
Method | GET | |
Request body | None | |
Returns | 200 OK and JSON | |
500 Server error | ||
GETALL | URL | /context-root/students |
Method | GET | |
Request body | None | |
Returns | 200 OK and JSON | |
500 server error |
3-7. 이 서비스를 실행할 서버 user ID를 설정합니다.
아래 3가지 옵션이 있습니다. 여기서는 Use server's user ID 로 사용하겠습니다.
Use server's user ID (웹 서비스 서버를 구동하는 계정인 QWSERVICE 계정으로 실행됩니다)
Specify an existing user ID (별도의 사용자 계정을 지정합니다)
Use authenticated user ID (HTTP 서버의 basic authentication 설정이 사전에 구성되어야 합니다)
3-8. 마지막으로 요약 정보를 확인하고 웹 서비스를 배포합니다
설정된 구성을 최종 확인하고 Finish 를 클릭합니다.
웹 서비스 배포가 완료되면 Status 가 녹색으로 변경됩니다.
자! 이제 웹 서비스 배포가 끝났습니다!
크롬 웹브라우저에서 REST API Client extension 으로 간단히 테스트를 해보겠습니다.
모든 학생 등록 정보 조회하기
http://hostname/web/services/students
신규 학생 등록하기
이제 개발자들이 다양한 어플리케이션에 이 REST API를 손쉽게 활용할 수 있을 것입니다.
쿼리 성능 최적화를 위한 팁 (ft. 통계정보 사용이 어려울 때) (0) | 2023.02.13 |
---|---|
SQL OLAP 함수로 데이터 분석하기 (0) | 2023.01.20 |
해시 함수 (HASH)로 데이터 무결성 검증하기 (0) | 2022.12.27 |
DB 서버에서 파이썬으로 DB2 데이터 활용하기 (0) | 2022.11.28 |
동일한 쿼리인데 왜 실행시간이 달라질까? (0) | 2022.11.21 |
댓글 영역