실습
1. 시나리오
- 샘플용 테이블 생성 후 샘플 데이터 등록을 수행하는 람다 작성
2. 환경 구성
- 아래 쿼리를 로컬
DB에서 실행하여 테스트용Schema와Table을 생성한다
CREATE SCHEMA guide DEFAULT CHARACTER SET utf8 ; // 1
CREATE TABLE guide.TEST_TABLE // 2
(
`SYS_ID` varchar(32) NOT NULL,
`SYS_CREATE_BY` varchar(32) DEFAULT NULL,
`SYS_MODIFY_BY` varchar(32) DEFAULT NULL,
`SYS_CREATE_DATE` datetime DEFAULT NULL,
`SYS_MODIFY_DATE` datetime DEFAULT NULL,
`SYS_FLAG` char(1) DEFAULT NULL,
`SYS_TYPE` varchar(32) DEFAULT NULL,
`TL_APL_ID` varchar(32) NOT NULL,
`TL_ACC_ID` varchar(32) NOT NULL,
`TEST_NAME` varchar(100) DEFAULT NULL,
`TEST_DESC` varchar(250) DEFAULT NULL,
`MEM_ID` varchar(100) DEFAULT NULL,
`MEM_NAME` varchar(100) DEFAULT NULL,
`MEM_DESC` varchar(250) DEFAULT NULL,
`MEM_NO` varchar(250) DEFAULT NULL,
`ACTIVE_FLAG` char(1) DEFAULT NULL,
PRIMARY KEY (`SYS_ID`)
);- 테이블이 정상적으로 생성되었는지 확인하기 위해 아래 쿼리를 실행한다.

3. 신규 프로젝트 생성
New버튼을 클릭하여 신규 프로젝트 생성 프로세스를 시작합니다.

상단 팝업에 원하는 람다명 입력 후 엔터를 눌러 진행합니다.

이후
Local Project영역에 입력한 이름으로 신규 프로젝트가 생성되게 됩니다.

4. Config 설정
config/projectBaseConfigDev.js파일 내DB host,user,password,schema를 본인의 설정에 맞게 수정한다.

5. 소스 작성
주의사항
controller,service,dao파일의constructor부분은 프레임워크 기본 세팅 부분이므로 특별한 이유 없이 수정하는 것은 권장하지 않습니다.Controller
src/controller.js - process함수에는 요청 전문 값에 대한 유효성 검사 및 기본값 설정 등의 코드를 작성합니다.
async process() {
// 파라미터 로그 작성
calsLogger.param(this.event, this.context);
// 파라미터 기본값 세팅
this.objRequestParams.sampleName = "test1";
this.objRequestParams.sampleDesc = "test1";
// 파라미터 유효성 체크
if (CompareUtility.isEmpty(this.objRequestParams.sampleName)) {
throw new ParameterNonExistException("sampleName");
}
if (CompareUtility.isEmpty(this.objRequestParams.sampleDesc)) {
throw new ParameterNonExistException("sampleDesc");
}
// 파라미터 검사 실제 서비스에 값을 넘기며 호출
this.objReturn = await this.clsService.runMethod({
objRequestParams: this.objRequestParams,
objReturn: this.objReturn,
});
// 결과값 로그 작성
calsLogger.result(this.objReturn);
// 결과값 반환 후 람다 종료
return this.objReturn;
}- Model
model/lambdaModel.js파일에는DB에 입력할 데이터 객체를 생성하는 코드를 작성합니다.
class SampleAddDataModel extends ApplicationLambdaBaseModel {
constructor () {
super()
this.sampleName = ''
this.sampleDesc = ''
}
}
exports.SampleAddDataModel = SampleAddDataModel- Service
src/service.js파일에는 수행해야 할 로직을 작성합니다.
async runMethod ({ objRequestParams, objReturn }) {
calsLogger.param(objRequestParams)
// 1. 데이터 등록 모델 생성
const SampleAddDataModel = require('../model/lambdaModel').SampleAddDataModel
const objSampleAddDataModel = new SampleAddDataModel()
// 2. 데이터 등록 모델에 데이터 등록
objSampleAddDataModel.sampleName = objRequestParams.sampleName
objSampleAddDataModel.sampleDesc = objRequestParams.sampleDesc
// 3. 데이터 입력
const objAddReturn = await this.clsDAO.addData(
{
objDAOParams: objSampleAddDataModel,
objReturn
})
if (objAddReturn.affectedRows === 0) {
throw new NoAffectedDataException(
ProjectBaseConstant.ERROR_MESSAGE.NO_AFFECTED_QUERY
)
}
calsLogger.result(objReturn)
return objReturn
}- DAO
src/dao.js파일에는DB데이터 접근, 수정 로직을 수행하는 코드를 작성합니다.
async addData ({ objDAOParams, objReturn }) {
// 파라미터 로그 작성
calsLogger.param(objDAOParams)
// 데이터 삽입 수행
const objDAOReturn = await this.insert({
sQueryId: 'insertData', // 수행할 쿼리 id
objParam: objDAOParams, // 쿼리에 사용될 파라미터
objReturn
})
// 결과값 로그 작성
calsLogger.result(objDAOReturn)
// 결과값 반환
return objDAOReturn
}dao에서 쿼리를 실행시킬 때 사용할 수 있는 함수는 아래와 같습니다.
※ 각 함수와 쿼리의 타입을 반드시 일치시켜주시기 바랍니다.
- insert :
./query/mysql하위xml에 작성한insert쿼리를 실행시킬 수 있습니다. - update :
./query/mysql하위xml에 작성한update쿼리를 실행시킬 수 있습니다. - delete :
./query/mysql하위xml에 작성한delete쿼리를 실행시킬 수 있습니다. - select :
./query/mysql하위xml에 작성한select쿼리를 실행시킬 수 있습니다.
각 함수의 Request 객체와 Response 객체는 아래와 같습니다.
- insert -
Request객체
| 요소 명 | 요구 수준 | 데이터 타입 | 설명 |
|---|---|---|---|
| sQueryId | Required | String | xml에 작성한 쿼리들 중, insert 시 실행할 쿼리에 대한 ID |
| objParam | Required | Object | Xml에 작성한 Mapper를 통해 치환할 값을 가지고 있는 객체 |
| objReturn | Required | Object | Framework에서 제공하는 반환 객체 (Controller 객체에서 생성된 객체) |
| bIgnoreFlag | Optional | Boolean | 유효 쿼리 무시 여부 (default value : true) |
True: 쿼리에 의해서, 실제 DB에 영향을 안 끼쳤을 경우, 에러 처리 | |||
False: 쿼리에 의해서, 실제 DB에 영향을 끼치지 않아도 성공 처리 |
- insert -
Response객체
| 요소 명 | 2depth 요소 명 | 3depth 요소 명 | 데이터 타입 | 설명 |
|---|---|---|---|---|
| objReturn | Object | |||
| success | Boolean | Insert 결과의 성공 여부 | ||
| data | Array | Insert 결과로 받은 데이터 | ||
| sysId | String | Insert 시, 신규로 생성한 데이터의 SYS_ID 필드 값 | ||
| requestID | String | Lambda 요청 별로 생성되는 Unique ID | ||
| error | Object | error 객체 | ||
| affectedRows | Integer | DB 테이블에 Insert 쿼리로 생성된 Row 수 |
- update -
Request객체
| 요소 명 | 요구 수준 | 데이터 타입 | 설명 |
|---|---|---|---|
| sQueryId | Required | String | xml에 작성한 쿼리들 중, Update 시 실행할 쿼리에 대한 ID |
| objParam | Required | Object | Xml에 작성한 Mapper를 통해 치환할 값을 가지고 있는 객체 |
| objReturn | Required | Object | Framework에서 제공하는 반환 객체 (Controller 객체에서 생성된 객체) |
| bIgnoreFlag | Optional | Boolean | 유효 쿼리 무시 여부 (default value : true) |
True: 쿼리에 의해서, 실제 DB에 영향을 안 끼쳤을 경우, 에러 처리 | |||
False: 쿼리에 의해서, 실제 DB에 영향을 끼치지 않아도 성공 처리 |
- update -
Response객체
| 요소 명 | 2depth 요소 명 | 3depth 요소 명 | 데이터 타입 | 설명 |
|---|---|---|---|---|
| objReturn | Object | |||
| success | Boolean | Update 결과의 성공 여부 | ||
| data | Array | Update 결과로 받은 데이터 | ||
| requestID | String | Lambda 요청 별로 생성되는 Unique ID | ||
| error | Object | error 객체 | ||
| affectedRows | Integer | DB 테이블에 Insert 쿼리로 생성된 Row 수 |
- delete -
Request객체
| 요소 명 | 요구 수준 | 데이터 타입 | 설명 |
|---|---|---|---|
| sQueryId | Required | String | xml에 작성한 쿼리들 중, Delete 시 실행할 쿼리에 대한 ID |
| objParam | Required | Object | Xml에 작성한 Mapper를 통해 치환할 값을 가지고 있는 객체 |
| objReturn | Required | Object | Framework에서 제공하는 반환 객체 (Controller 객체에서 생성된 객체) |
| bIgnoreFlag | Optional | Boolean | 유효 쿼리 무시 여부 (default value : true) |
True: 쿼리에 의해서, 실제 DB에 영향을 안 끼쳤을 경우, 에러 처리 | |||
False: 쿼리에 의해서, 실제 DB에 영향을 끼치지 않아도 성공 처리 |
- delete -
Response객체
| 요소 명 | 2depth 요소 명 | 3depth 요소 명 | 데이터 타입 | 설명 |
|---|---|---|---|---|
| objReturn | Object | |||
| success | Boolean | Delete 결과의 성공 여부 | ||
| data | Array | Delete 결과로 받은 데이터 (빈 값) | ||
| requestID | String | Lambda 요청 별로 생성되는 Unique ID | ||
| error | Object | error 객체 | ||
| affectedRows | Integer | DB 테이블에 Insert 쿼리로 생성된 Row 수 |
- select -
Request객체
| 요소 명 | 요구 수준 | 데이터 타입 | 설명 |
|---|---|---|---|
| sQueryId | Required | String | xml에 작성한 쿼리들 중, Select 시 실행할 쿼리에 대한 ID |
| objParam | Required | Object | Xml에 작성한 Mapper를 통해 치환할 값을 가지고 있는 객체 |
| objReturn | Required | Object | Framework에서 제공하는 반환 객체 (Controller 객체에서 생성된 객체) |
| bIgnoreFlag | Optional | Boolean | 유효 쿼리 무시 여부 (default value : true) |
True: 쿼리에 의해서, 실제 DB에 영향을 안 끼쳤을 경우, 에러 처리 | |||
False: 쿼리에 의해서, 실제 DB에 영향을 끼치지 않아도 성공 처리 |
- select -
Response객체
| 요소 명 | 2depth 요소 명 | 3depth 요소 명 | 데이터 타입 | 설명 |
|---|---|---|---|---|
| objReturn | Object | |||
| success | Boolean | Select 결과의 성공 여부 | ||
| data | Array | Select 결과로 받은 데이터 (빈 값) | ||
| requestID | String | Lambda 요청 별로 생성되는 Unique ID | ||
| error | Object | error 객체 | ||
| affectedRows | Integer | - (select일 경우 무조건 0으로 반환) |
- XML
query/DB Engine/xml파일에는DAO에서 호출 시, 작업할 쿼리를 작성합니다.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="mysql">
<insert id="insertData">
INSERT INTO TEST_TABLE
(
${systemField}
, TEST_NAME
, TEST_DESC
)
VALUES
(
${systemValue}
, #{sampleName}
, #{sampleDesc}
)
</insert>
</mapper>${systemField} / ${systemValue}를 이용하여, CALS 플랫폼에서 제공하는 시스템 필드들에 대한 처리를 자동화 할 수 있습니다.
아래는 자동으로 처리 가능한 시스템 필드 목록과 쿼리 타입별 예시입니다.
| 필드 | 데이터 타입 | 설명 | 사용 가능한 값 |
|---|---|---|---|
| SYS_ID | VARCHAR(32) | 테이블의 해당 Row 데이터를 구별할 수 있는 식별 값(PK) | 32자리 이내의 유일한 값 |
| SYS_CREATE_BY | VARCHAR(32) | 데이터를 생성한 사람의 식별 값 | 32자리 이내의 값 |
| SYS_MODIFY_BY | VARCHAR(32) | 데이터를 수정한 사람의 식별 값 | 32자리 이내의 값 |
| SYS_CREATE_DATE | DATETIME | 데이터 최초 생성 일시 | Ex. 2020-11-02 13:13:13 |
| SYS_MODIFY_DATE | DATETIME | 데이터 최종 수정 일시 | Ex. 2020-11-02 13:13:13 |
| SYS_TYPE | VARCHAR(32) | 데이터 타입 | 32자리 값 |
| SYS_FLAG | CHAR(1) | 데이터 사용 여부 | 1 or 0 |
| TL_ACC_ID | VARCHAR(32) | 데이터를 소유한 Account의 식별 값 | 32자리 이내의 값 |
| TL_APL_ID | VARCHAR(32) | 데이터를 소유한 Application의 식별 값 | 32자리 이내의 값 |
insert query 예시입니다.
<insert id="exampleInsert">
INSERT INTO TEST_TABLE
(
${systemField}
)
VALUES
(
${systemValue}
)
</insert>update query 예시입니다.
<update id="exampleUpdate">
UPDATE TEST_TABLE
SET ${systemValue}
WHERE [조회 조건] = ${조회 조건}
</update>select query 예시입니다.
<select id="exampleSelect">
SELECT
${systemField}
FROM TEST_TABLE
WHERE 1 = 1
AND ${systemValue}
</select>delete query 예시입니다.
( delete에선 systemField, systemValue를 사용할 수 없습니다. )
<delete id="exampleDelete">
DELETE FROM TEST_TABLE
WHERE SYS_ID = ${삭제 조건}
</delete>6. 디버깅
dao.js의addData함수에 표시한 부분에 마우스로 클릭 또는 원하는 지점에 키보드 커서를 위치한 후 'F9'버튼을 클릭하여, 디버깅 시 체크할 중단점을 표시할 수 있습니다.

- 단축키
“Ctrl + Shift + F5”나 좌측 하단의Debug아이콘을 클릭하여Invoke Function창을 출력합니다. 생성한 프로젝트 명과 동일한지 확인하고Run을 클릭합니다.

중단점에서 다음 코드로 넘어가기 위해, 상단의 표시된 버튼 클릭 또는 '
F10' 을 입력합니다.
디버거가 다음 라인으로 넘어가는 것을 확인 후, 확인 하고 싶은 객체에 마우스 커서를 위치 또는 아래
DEBUG CONSOLE창에 확인하고 싶은 값을 입력합니다.

7. 결과 확인
- 로컬
DB에 접속하여, 작성한 코드대로 작동하였는지 확인하기 위해 테이블을 조회하여 데이터가 등록되었는지 확인합니다.

8. Deploy
개발 및 테스트가 끝난
Lambda프로젝트를Application환경에 반영하기 위해Checkin버튼을 클릭합니다.
(Checkin동작 프로세스는 링크를 참조해주세요)
체크인 버튼 클릭 후 상단 팝업에 배포 메시지를 입력한 후,
Enter를 클릭합니다.
Local Log영역에“Progress:Finish Deploy 완료”라는 로그가 찍힌 것을 확인합니다.

Remote Project영역에 배포한 람다가 나타난 것을 확인합니다.

Studio로 접속하여,Action - Lambda Node에서 체크인 한Lambda프로젝트가 생성 되었는지 확인합니다.
