실습
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
프로젝트가 생성 되었는지 확인합니다.