심화 실습
1. 시나리오
payload
를 통해 넘겨받은Parameter
를 통해CRUD
중 하나를 수행 할 수 있는 람다 작성
2. 디버깅
src/controller.js
파일에서 원하는 부분을 중단점으로 설정 후 하단 디버깅 버튼을 누릅니다.Run
버튼 하단을 보면Payload
영역을 확인 할 수 있습니다. 해당 영역에 작성한JSON
은 디버깅 시objRequestParam
으로 사용할 수 있습니다.Run
버튼을 눌러 디버깅을 시작합니다.중단점에서 디버거가 멈춘 것을 확인한 후 디버그 콘솔 영역에
this.objRequestParams
를 입력하여 출력되는 객체에payload
에 입력한 값이 존재하는지 확인합니다.
3. 소스 작성
- model
model/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;
- src
controller.jssrc/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;
}
};
Servicesrc/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;
}
- query
mysql.xmlmysql/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>