Skip to content

심화 실습

1. 시나리오

  • payload를 통해 넘겨받은 Parameter를 통해 CRUD 중 하나를 수행 할 수 있는 람다 작성

2. 디버깅

  1. src/controller.js 파일에서 원하는 부분을 중단점으로 설정 후 하단 디버깅 버튼을 누릅니다.

    Alt text

  2. Run 버튼 하단을 보면 Payload 영역을 확인 할 수 있습니다. 해당 영역에 작성한 JSON은 디버깅 시 objRequestParam으로 사용할 수 있습니다.

    Alt text

  3. Run 버튼을 눌러 디버깅을 시작합니다.

    Alt text

  4. 중단점에서 디버거가 멈춘 것을 확인한 후 디버그 콘솔 영역에 this.objRequestParams 를 입력하여 출력되는 객체에 payload에 입력한 값이 존재하는지 확인합니다.

    Alt text

3. 소스 작성

  1. modelmodel/lambdaModel.js 파일에 아래 소스를 붙여넣기 합니다.
class MemberDataModel extends ApplicationLambdaBaseModel {
 constructor({ memberId, memberName, memberNo, memberDesc, activeFlag }) {
   super();
   this.memberId = memberId ? memberId : "";
   this.memberName = memberName ? memberName : "";
   this.memberNo = memberNo ? memberNo : "";
   this.memberDesc = memberDesc ? memberDesc : "";
   this.activeFlag = activeFlag ? activeFlag : "";
 }
}
exports.MemberDataModel = MemberDataModel;
  1. src
    controller.js
    src/controller.js 파일에 아래 소스를 붙여넣기 합니다.
    소스에 대한 설명은 주석으로 작성되어 있습니다.
"use strict";
// 소스 내에서 필요한 모듈 import
const {
 BaseController,
 CompareUtility,
 calsLogger,
 ParameterNonExistException,
} = require("@cals-framework/lambda");
const Service = require("./service");

module.exports = class Controller extends BaseController {
 constructor({ event, context }) {
   super({ event, context });
   this.event = event;
   this.context = context;

   this.calsContext.serviceContext === undefined
     ? (this.clsService = new Service())
     : typeof this.calsContext.serviceContext !== "undefined"
     ? (this.calsContext.serviceContext = new Service())
     : (this.clsService = this.calsContext.serviceContext);
 }

 async process() {
   calsLogger.param(this.event, this.context);

   // Todo : 파라미터 유효성 체크,세션 체크
   // operation 값 체크
   if (CompareUtility.isEmpty(this.objRequestParams.operation)) {
     throw new ParameterNonExistException("operation");
   }
   // payload에서 넘어온 operation 값에 따른 함수 실행
   switch (this.objRequestParams.operation) {
     case "i":
       // operation 값이 i 일 경우, service의 memberInsert 함수 실행
       // insert의 경우 memberId, memberName 값은 필수 체크
       if (CompareUtility.isEmpty(this.objRequestParams.memberId) 
           && CompareUtility.isEmpty(this.objRequestParams.memberName)) {
         throw new ParameterNonExistException("memberId or memberName");
       }
       this.objReturn = await clsService.memberInsert({
         objRequestParams: this.objRequestParams,
         objReturn: this.objReturn,
       });
       break;
     case "u":
       // operation 값이 u 일 경우, service의 memberUpdate 함수 실행
       this.objReturn = await clsService.memberUpdate({
         objRequestParams: this.objRequestParams,
         objReturn: this.objReturn,
       });
       break;
     case "s":
       // operation 값이 s 일 경우, service의 memberSelect 함수 실행
       this.objReturn = await clsService.memberSelect({
         objRequestParams: this.objRequestParams,
         objReturn: this.objReturn,
       });
       break;
     case "d":
       // operation 값이 d 일 경우, service의 memberDelete 함수 실행
       // delete의 경우 memberId 값은 필수 체크
       if (CompareUtility.isEmpty(this.objRequestParams.memberId)) {
         throw new ParameterNonExistException("memberId");
       }
       this.objReturn = await clsService.memberDelete({
         objRequestParams: this.objRequestParams,
         objReturn: this.objReturn,
       });
       break;
   }

   calsLogger.result(this.objReturn);
   return this.objReturn;
 }
};

Service
src/service.js 파일의 emberInsert 함수입니다.
수행해야 할 로직을 코드로 작성합니다.

 async memberInsert({ objRequestParams, objReturn }) {
   calsLogger.param(objRequestParams);

   // 1. Member 모델 생성
   const MemberDataModel = require("../model/lambdaModel").MemberDataModel;
   const objMemberDataModel = new MemberDataModel(objRequestParams);

   // 2. memberNo 값은 현재 등록된 member Count + 1
   let objDAOReturn = await this.clsDAO.memberSelect({
     objDAOParams: objMemberDataModel,
     objReturn,
   });

   objMemberDataModel.memberNo = objDAOReturn.objReturn.data[0].count + 1;

   // 3. Member 입력
   objDAOReturn = await this.clsDAO.memberInsert({
     objDAOParams: objMemberDataModel,
     objReturn,
   });

   // memberInsert 쿼리가 입력한 row가 0이라면 실패로 간주하고 에러를 발생시킵니다.
   // src/dao.js 파일 내 memberInsert 함수의 bIgnoreFlag가 false로 설정되어 있다면 아래 에러 처리를 프레임워크에서       
   수행하게 됩니다.
   if (objDAOReturn.affectedRows === 0) {
     throw new NoAffectedDataException("No Affected Query");
   }

   calsLogger.result(objDAOReturn);

   return objDAOReturn.objReturn;
 }

src/service.js 파일의 memberUpdate 함수입니다.
수행해야 할 로직을 코드로 작성합니다.

 async memberUpdate({ objRequestParams, objReturn }) {
   calsLogger.param(objRequestParams);

   // 1. Member 모델 생성
   const MemberDataModel = require("../model/lambdaModel").MemberDataModel;
   const objMemberDataModel = new MemberDataModel(objRequestParams);

   // 2. Member 수정
   const objDAOReturn = await this.clsDAO.memberUpdate({
     objDAOParams: objMemberDataModel,
     objReturn,
   });

   // memberUpdate 쿼리가 수정한 row가 0이라면 실패로 간주하고 에러를 발생시킵니다.
   if (objDAOReturn.affectedRows === 0) {
     throw new NoAffectedDataException("No Affected Query");
   }

   calsLogger.result(objDAOReturn);

   return objDAOReturn.objReturn;
 }

src/service.js 파일의 memberSelect 함수입니다.
수행해야 할 로직을 코드로 작성합니다.

 async memberSelect({ objRequestParams, objReturn }) {
   calsLogger.param(objRequestParams);

   // 1. Member 모델 생성
   const MemberDataModel = require("../model/lambdaModel").MemberDataModel;
   const objMemberDataModel = new MemberDataModel(objRequestParams);

   // 2. Member 조회
   const objDAOReturn = await this.clsDAO.memberSelect({
     objDAOParams: objMemberDataModel,
     objReturn,
   });

   calsLogger.result(objDAOReturn);

   return objDAOReturn.objReturn;
 }

src/service.js 파일의 memberDelete 함수입니다.
수행해야 할 로직을 코드로 작성합니다.

 async memberDelete({ objRequestParams, objReturn }) {
   calsLogger.param(objRequestParams);

   // 1. Member 모델 생성
   const MemberDataModel = require("../model/lambdaModel").MemberDataModel;
   const objMemberDataModel = new MemberDataModel(objRequestParams);

   // 2. Member 삭제
   const objDAOReturn = await this.clsDAO.memberDelete({
     objDAOParams: objMemberDataModel,
     objReturn,
   });

  // memberDelete 쿼리가 삭제한 row가 0이라면 실패로 간주하고 에러를 발생시킵니다.
   if (objDAOReturn.affectedRows === 0) {
     throw new NoAffectedDataException("No Affected Query");
   }

   calsLogger.result(objDAOReturn);

   return objDAOReturn.objReturn;
 }

DAO
src/dao.js 파일의 memberInsert 함수입니다.
수행해야 할 로직을 코드로 작성합니다.

 async memberInsert({ objDAOParams, objReturn }) {
   calsLogger.param(objDAOParams);

   const objQueryInfo = {
     sQueryId: "insertMember",
     objParam: objDAOParams,
     objReturn: objReturn,
     // bIgnoreFlag는 optional로, 기본값은 true입니다.
     // bIgnoreFlag: true | false,
   };

   const objDAOReturn = await this.insert(objQueryInfo);

   calsLogger.result(objDAOReturn);

   return objDAOReturn;
 }

src/dao.js 파일의 memberUpdate 함수입니다.
수행해야 할 로직을 코드로 작성합니다.

 async memberUpdate({ objDAOParams, objReturn }) {
   calsLogger.param(objDAOParams);

   const objQueryInfo = {
     sQueryId: "updateMember",
     objParam: objDAOParams,
     objReturn: objReturn,
   };

   const objDAOReturn = await this.update(objQueryInfo);

   calsLogger.result(objDAOReturn);

   return objDAOReturn;
 }

src/dao.js 파일의 memberSelect 함수입니다.
수행해야 할 로직을 코드로 작성합니다.

 async memberSelect({ objDAOParams, objReturn }) {
   calsLogger.param(objDAOParams);

   const objQueryInfo = {
     sQueryId: "selectMember",
     objParam: objDAOParams,
     objReturn: objReturn,
   };

   const objDAOReturn = await this.select(objQueryInfo);

   calsLogger.result(objDAOReturn);

   return objDAOReturn;
 }

src/dao.js 파일의 memberDelete 함수입니다.
수행해야 할 로직을 코드로 작성합니다.

async memberDelete({ objDAOParams, objReturn }) {
  calsLogger.param(objDAOParams);

  const objQueryInfo = {
    sQueryId: "deleteMember",
    objParam: objDAOParams,
    objReturn: objReturn,
  };

  const objDAOReturn = await this.delete(objQueryInfo);

  calsLogger.result(objDAOReturn);

  return objDAOReturn;
}
  1. query
    mysql.xml
    mysql/mysql.xml 파일의 insertMember 쿼리입니다.
    수행해야 할 로직을 쿼리로 작성합니다.

    ( ${systemField} / ${systemValue}를 이용하여, CALS 플랫폼에서 제공하는 시스템 필드들에 대한 처리를 자동화합니다. )

<insert id="insertMember">
   INSERT INTO member
     (
           ${systemField}
         , MEM_ID
         , MEM_NAME
         , MEM_DESC
         , MEM_NO
         , ACTIVE_FLAG
     )
   VALUES
     (
           ${systemValue}
         , #{memberId} 
         , #{memberName}
         , #{memberDesc}
         , #{memberNo}
         , #{activeFlag}
     )
 </insert>

mysql/mysql.xml 파일의 updateMember 쿼리입니다.
수행해야 할 로직을 쿼리로 작성합니다.

( ${systemField} / ${systemValue}를 이용하여, CALS 플랫폼에서 제공하는 시스템 필드들에 대한 처리를 자동화 합니다. )

<update id="updateMember">
   UPDATE member
   SET     ${systemValue}
           , MEM_NAME = #{memberName}
           , MEM_NO = #{memberNo}
           , MEM_DESC = #{memberDesc}
           , ACTIVE_FLAG = #{activeFlag}
   WHERE   MEM_ID          = #{memberId}
   AND     SYS_FLAG        = 1
 </update>

mysql/mysql.xml 파일의 selectMember 쿼리입니다.
수행해야 할 로직을 쿼리로 작성합니다.

( ${systemValue}를 이용하여, CALS 플랫폼에서 제공하는 시스템 필드들에 대한 처리를 자동화 합니다. )

<select id="selectMember">
   SELECT
           count(0) as count
   FROM    member
   WHERE   1 = 1
   AND     ${systemValue}
   AND     SYS_FLAG = 1
 </select>

mysql/mysql.xml 파일의 deleteMember 쿼리입니다.
수행해야 할 로직을 쿼리로 작성합니다.

( 해당 예제에선 실제로 delete 쿼리를 수행하지만, CALS 공용 람다에선 SYS_FLAG를 활용한 논리 삭제를 표준으로 수행하고 있습니다. 특정 요건이 아니라면 논리 삭제를 권장합니다. 삭제 조건 수준은 PK를 권장합니다. )

<delete id="deleteMember">
    DELETE FROM member WHERE 1 = 1
    AND     MEM_ID = #{memberId}
 </delete>