상세 컨텐츠

본문 제목

SQL로 REST API 서비스 만들기

Db2 for i

by 아이구르미 2023. 1. 4. 20:00

본문

모바일 앱에서 Db2 for i 데이터를 활용해야 하는 경우, Java JTOpenLite 같은 가벼운 JDBC 클래스를 이용해서 DB 접속하는 방법도 있겠지만, 모바일의 특성상 보안과 안정성, 성능을 고려했을 직접 DB 연결하도록 하기보다 API 게이트웨이를 두고 REST API 서비스를 제공하는 방식이 좋습니다.

 

이런 경우 Db2 for i REST API 호출 방식으로 사용할 있도록비스화 하는 작업이 필요한데요. SQL 간단하게 서버에서 REST API 호출 가능한 웹서비스를 만드는 방법을 알아보겠습니다.

 

샘플 학생 정보 테이블을 사용하는 학생 정보 등록 서비스를 구현해보겠습니다. 구현할 서비스는 다음과 같습니다.

  • 신규 학생 등록하기
  • 기존 학생 등록 정보 변경하기
  • 모든 학생 등록 정보 조회하기
  • 특정 학생의 정보 조회하기
  • 학생 등록 정보 삭제하기

 

RESTful 서비스를 외부 공개할 어떤 방식으로 지에 대해서 몇가지 미리 확인해야 하는 사항이 있는데요.

  1. URI 스타일
  2. 제공할 HTTP 메소드의 종류
  3. API 요청을 받을 허용할 Content Type 종류
  4. API 데이터의 유형
  5. API 구현할 사용할 SQL

 

아래 표는 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" = ?

 

1단계. 앱에서 사용할 DB 준비합니다.

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);

 

 

2단계. 통합 웹 서비스 서버 (Integrated web service)를 만듭니다.

ILE 프로그램 오브젝트를 REST 서비스로 배포하려면, 통합 웹 서비스 서버를 먼저 만들어야 합니다. (버전은 2.6 이상이어야 함) 만약 이미 만들어둔 게 있다면 이 작업은 안해도 됩니다. 

 

통합 웹 서비스 서버 구성에 관한 상세 내용은 여기를 참조하세요.

 

 

3단계. SQL문을 RESTful 웹 서비스로 배포합니다.

3-1. SQL문을 웹 서비스로 배포합니다.

Navigation bar에서 Deploy New Service 마법사를 클릭합니다. 아래와 같은 화면이 나올 것입니다.

 

Specify Web service type : REST

Specify Web service implementation : SQL as a Web Service

  • Database system: localhost
  • Default schema: studentrsc
  • Naming convention: *SQL
  • Library list: *LIBL

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를 손쉽게 활용할 수 있을 것입니다. 

관련글 더보기

댓글 영역