Skip to content

실습

1. 시나리오

  • 샘플용 테이블 생성 후 샘플 데이터 등록을 수행하는 람다 작성

2. 환경 구성

  1. 아래 쿼리를 로컬 DB에서 실행하여 테스트용 SchemaTable을 생성한다
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`)
);
  1. 테이블이 정상적으로 생성되었는지 확인하기 위해 아래 쿼리를 실행한다.

Alt text

3. 신규 프로젝트 생성

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

Alt text

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

    Alt text

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

Alt text

4. Config 설정

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

Alt text

5. 소스 작성
  1. 주의사항
    controller, service, dao 파일의 constructor 부분은 프레임워크 기본 세팅 부분이므로 특별한 이유 없이 수정하는 것은 권장하지 않습니다.

  2. 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;
}
  1. Model
    model/lambdaModel.js 파일에는 DB에 입력할 데이터 객체를 생성하는 코드를 작성합니다.
class SampleAddDataModel extends ApplicationLambdaBaseModel {
 constructor () {
   super()
   this.sampleName = ''
   this.sampleDesc = ''
 }
}
exports.SampleAddDataModel = SampleAddDataModel
  1. 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
 }
  1. 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 객체
요소 명요구 수준데이터 타입설명
sQueryIdRequiredStringxml에 작성한 쿼리들 중, insert 시 실행할 쿼리에 대한 ID
objParamRequiredObjectXml에 작성한 Mapper를 통해 치환할 값을 가지고 있는 객체
objReturnRequiredObjectFramework에서 제공하는 반환 객체 (Controller 객체에서 생성된 객체)
bIgnoreFlagOptionalBoolean유효 쿼리 무시 여부 (default value : true)
True: 쿼리에 의해서, 실제 DB에 영향을 안 끼쳤을 경우, 에러 처리
False: 쿼리에 의해서, 실제 DB에 영향을 끼치지 않아도 성공 처리
  • insert - Response 객체
요소 명2depth 요소 명3depth 요소 명데이터 타입설명
objReturnObject
successBooleanInsert 결과의 성공 여부
dataArrayInsert 결과로 받은 데이터
sysIdStringInsert 시, 신규로 생성한 데이터의 SYS_ID 필드 값
requestIDStringLambda 요청 별로 생성되는 Unique ID
errorObjecterror 객체
affectedRowsIntegerDB 테이블에 Insert 쿼리로 생성된 Row 수
  • update - Request 객체
요소 명요구 수준데이터 타입설명
sQueryIdRequiredStringxml에 작성한 쿼리들 중, Update 시 실행할 쿼리에 대한 ID
objParamRequiredObjectXml에 작성한 Mapper를 통해 치환할 값을 가지고 있는 객체
objReturnRequiredObjectFramework에서 제공하는 반환 객체 (Controller 객체에서 생성된 객체)
bIgnoreFlagOptionalBoolean유효 쿼리 무시 여부 (default value : true)
True: 쿼리에 의해서, 실제 DB에 영향을 안 끼쳤을 경우, 에러 처리
False: 쿼리에 의해서, 실제 DB에 영향을 끼치지 않아도 성공 처리
  • update - Response 객체
요소 명2depth 요소 명3depth 요소 명데이터 타입설명
objReturnObject
successBooleanUpdate 결과의 성공 여부
dataArrayUpdate 결과로 받은 데이터
requestIDStringLambda 요청 별로 생성되는 Unique ID
errorObjecterror 객체
affectedRowsIntegerDB 테이블에 Insert 쿼리로 생성된 Row
  • delete - Request 객체
요소 명요구 수준데이터 타입설명
sQueryIdRequiredStringxml에 작성한 쿼리들 중, Delete 시 실행할 쿼리에 대한 ID
objParamRequiredObjectXml에 작성한 Mapper를 통해 치환할 값을 가지고 있는 객체
objReturnRequiredObjectFramework에서 제공하는 반환 객체 (Controller 객체에서 생성된 객체)
bIgnoreFlagOptionalBoolean유효 쿼리 무시 여부 (default value : true)
True: 쿼리에 의해서, 실제 DB에 영향을 안 끼쳤을 경우, 에러 처리
False: 쿼리에 의해서, 실제 DB에 영향을 끼치지 않아도 성공 처리
  • delete - Response 객체
요소 명2depth 요소 명3depth 요소 명데이터 타입설명
objReturnObject
successBooleanDelete 결과의 성공 여부
dataArrayDelete 결과로 받은 데이터 (빈 값)
requestIDStringLambda 요청 별로 생성되는 Unique ID
errorObjecterror 객체
affectedRowsIntegerDB 테이블에 Insert 쿼리로 생성된 Row
  • select - Request 객체
요소 명요구 수준데이터 타입설명
sQueryIdRequiredStringxml에 작성한 쿼리들 중, Select 시 실행할 쿼리에 대한 ID
objParamRequiredObjectXml에 작성한 Mapper를 통해 치환할 값을 가지고 있는 객체
objReturnRequiredObjectFramework에서 제공하는 반환 객체 (Controller 객체에서 생성된 객체)
bIgnoreFlagOptionalBoolean유효 쿼리 무시 여부 (default value : true)
True: 쿼리에 의해서, 실제 DB에 영향을 안 끼쳤을 경우, 에러 처리
False: 쿼리에 의해서, 실제 DB에 영향을 끼치지 않아도 성공 처리
  • select - Response 객체
요소 명2depth 요소 명3depth 요소 명데이터 타입설명
objReturnObject
successBooleanSelect 결과의 성공 여부
dataArraySelect 결과로 받은 데이터 (빈 값)
requestIDStringLambda 요청 별로 생성되는 Unique ID
errorObjecterror 객체
affectedRowsInteger- (select일 경우 무조건 0으로 반환)
  1. 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_IDVARCHAR(32)테이블의 해당 Row 데이터를 구별할 수 있는 식별 값(PK)32자리 이내의 유일한 값
SYS_CREATE_BYVARCHAR(32)데이터를 생성한 사람의 식별 값32자리 이내의 값
SYS_MODIFY_BYVARCHAR(32)데이터를 수정한 사람의 식별 값32자리 이내의 값
SYS_CREATE_DATEDATETIME데이터 최초 생성 일시Ex. 2020-11-02 13:13:13
SYS_MODIFY_DATEDATETIME데이터 최종 수정 일시Ex. 2020-11-02 13:13:13
SYS_TYPEVARCHAR(32)데이터 타입32자리 값
SYS_FLAGCHAR(1)데이터 사용 여부1 or 0
TL_ACC_IDVARCHAR(32)데이터를 소유한 Account의 식별 값32자리 이내의 값
TL_APL_IDVARCHAR(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. 디버깅
  1. dao.jsaddData함수에 표시한 부분에 마우스로 클릭 또는 원하는 지점에 키보드 커서를 위치한 후 'F9'버튼을 클릭하여, 디버깅 시 체크할 중단점을 표시할 수 있습니다.

Alt text

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

Alt text

  1. 중단점에서 다음 코드로 넘어가기 위해, 상단의 표시된 버튼 클릭 또는 'F10' 을 입력합니다.

    Alt text

  2. 디버거가 다음 라인으로 넘어가는 것을 확인 후, 확인 하고 싶은 객체에 마우스 커서를 위치 또는 아래 DEBUG CONSOLE 창에 확인하고 싶은 값을 입력합니다.

Alt text

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

Alt text

8. Deploy

  1. 개발 및 테스트가 끝난 Lambda 프로젝트를 Application 환경에 반영하기 위해 Checkin 버튼을 클릭합니다.
    (Checkin 동작 프로세스는 링크를 참조해주세요)Alt text

  2. 체크인 버튼 클릭 후 상단 팝업에 배포 메시지를 입력한 후, Enter를 클릭합니다.

    Alt text

  3. Local Log 영역에 “Progress:Finish Deploy 완료” 라는 로그가 찍힌 것을 확인합니다.

Alt text

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

Alt text

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

Alt text