Skip to content

변경 가이드

Node.js 18 버전 업데이트

1.현재 설치되어 있는 Node.js 버전 확인

  • Windows: 실행 (Win + R) 창을 활성화한 뒤, cmd 입력하여 명령 프롬프트에서 node -v 입력

    Alt text

  • macOS: 터미널 앱을 실행한 뒤, node -v 입력

    Alt text

2. 버전 확인 결과 v18.xx.x로 시작하지 않는 경우 3번으로 이동

3. Node.js 18 버전으로 업데이트 (OS별, 기 설치방식별 업데이트 방법 상이)

→ `nvm`으로 설치 완료되었을 경우 `nvm use 18` 커맨드로 Node.js 18 버전 적용 (Windows)

  • macOS + 설치 파일로 설치한 경우: node-v18.18.2.pkg
  • macOS + nvm으로 설치한 경우: nvm install 18

Alt text

VSCode CALS Extension 버전 업데이트 (작성일 기준 최신버전 v1.0.10)

  1. 기존에 설치되어 있는 Visual Studio Code를 실행합니다. (설치되어 있지 않을 경우 “설치 가이드”

Alt text

  1. 확장 메뉴로 이동합니다. ( Windows: Ctrl + Shift + X / macOS: Cmd+Shift+X)

Alt text

  1. cals-vscode-extension 확장 프로그램의 설치 여부에 따라 신규 설치 및 버전 업데이트 진행
    a. 설치가 되어있는 경우: 확장 프로그램의 업데이트 버튼을 클릭하여 버전 업데이트 진행

Alt text

b. 설치가 되어있지 않은 경우: 마켓플레이스에서 확장 검색에 cals-vscode-extension 검색 후 설치

Alt text4.

  1. cals-vscode-extension 확장 프로그램을 실행하여 최신 버전으로 실행 및 Node.js 버전 체크 확인 a. 최신버전 및 Node.js 18 이상 버전을 사용한 경우: 정상 실행

    Alt text

    b. 최신버전 및 Node.js 18 미만 버전을 사용한 경우: 에러 발생

    Alt text

3. 신규 Application Lambda 생성

  1. Remote Explorer에서 New버튼을 클릭하여 Lambda Project를 생성합니다.

Alt text

  1. 생성할 Lambda 프로젝트명을 작성한 뒤 Enter 키를 누릅니다.

Alt text

  1. 기본 Lambda Template 소스 복제가 완료되면 Local Explorer에 작성한 프로젝트명 폴더가 생성됩니다.

Alt text

  1. Local 테스트 시 사용하는 DB 정보는 /config/projectBaseConfigDev.js 파일에서 설정합니다.

Alt text

  1. 이 외 소스코드 작성 구조는 기존과 동일합니다.
    ※ Util, Exception 모듈 로드 방식 변경은 Framework Context 부분을 참고하시기 바랍니다.

4. 신규 Long-Term Service 생성

5. 기존 Application Lambda 수정

  1. development.json 파일을 대체하는 /config/projectBaseConfigDev.js 파일의 DB 정보 수정

※ /config/projectBaseConfigDev.js 파일은 Mirgration 작업 이후에 생성됩니다.

“3.7 Application Lambda & Long-Term Service 배포 문단” 참고

// As-is (development.json)
{
 "NODE_ENV" : "development",
 "Logger" : {
   "LEVEL" : "all",
   "ParamEnabled" : true,
   "ResultEnabled" : true
 },
 "DB" : {
   "ENGINE": "mysql",
   "CONNECTION_TYPE": "config",
   "HOST": "{{dbHost}}",
   "USER": "{{dbUser}}",
   "PASSWORD": "{{dbPassword}}",
   "SCHEMA": "{{dbSchema}}",
   "PORT": "{{dbPort}}"
 }
}



// To-be (projectBaseConfigDev.js)
'use strict'

const { LambdaBaseConfig, DB_CONNECTION_TYPE, LogLevel, NODE_ENV_TYPE } = require('@cals-framework/lambda')
const { resolve } = require('path')

/**
* ProjectBaseConstant class
*
* @class
*/
class ProjectBaseConfigDev extends LambdaBaseConfig {
 /**
  * 생성자로 상수 변수 생성
  *
  * @constructor
  */

 // 여기서부터 수정 가능 구역
 constructor() {
   super()

   this.NODE_ENV = NODE_ENV_TYPE.DEVELOPMENT

   this.OBJ_MAPPER.path.push(resolve(__dirname, '../query/mysql/mysql.xml'))
   this.OBJ_MAPPER.namespace.mysql = 'mysql'

   this.Logger.LEVEL = LogLevel.DEBUG
   this.Logger.ParamEnabled = false
   this.Logger.ResultEnabled = false
   this.Logger.RdkLogEnabled = false
   this.Logger.DBLogEnabled = true

   this._DB.ENGINE = 'mysql'
   this._DB.CONNECTION_TYPE = DB_CONNECTION_TYPE.CONFIG
   this._DB.HOST = '{{dbHost}}'
   this._DB.USER = '{{dbUser}}'
   this._DB.PASSWORD = '{{dbPassword}}'
   this._DB.SCHEMA = '{{dbSchema}}'
 }
}
module.exports.ProjectBaseConfigDev = ProjectBaseConfigDev
  1. /constant/projectBaseConstant.js 파일의 모듈 가져오기 이름 변경, 멤버 변수정적 변수로 변경
// As-is
const AppLambdaBaseConstant = require('@rdk/lambda').AppLambdaBaseConstant

module.exports = class ProjectBaseConstant extends AppLambdaBaseConstant {
 /**
  * 생성자로 상수 변수 생성
  * @constructor
  */

 // 여기서부터 수정 가능 구역
 constructor () {
   super()

   this.ERROR_MESSAGE = {
     NO_AFFECTED_QEURY: 'NO AFFECTED QUERY'
   }
 }
}

// To-be (구조 분해 할당 방식 또는 변수 할당 방식 사용)
const { AppLambdaBaseConstant } = require('@cals-framework/lambda')
// const AppLambdaBaseConstant = require('@cals-framework/lambda').AppLambdaBaseConstant

module.exports = class ProjectBaseConstant extends AppLambdaBaseConstant {
 /**
  * 생성자로 상수 변수 생성
  * @constructor
  */

 // 여기서부터 수정 가능 구역
 constructor () {
   super()
 }

 static ERROR_MESSAGE = {
   NO_AFFECTED_QUERY: 'NO AFFECTED QUERY'
 }
}
  1. /exception/lambdaException.js 파일의 모듈 가져오기 이름 변경 필요
// As-is
const LambdaBaseException = require('@rdk/lambda').LambdaBaseException
class NoAffectedDataException extends LambdaBaseException {  ….  }

// To-be (구조 분해 할당 방식 또는 변수 할당 방식 사용)
const { ApplicationLambdaException} = require('@cals-framework/lambda')
class NoAffectedDataException extends ApplicationLambdaException {  ….  }
  1. /lib/lambdaLib.js 파일의 모듈 가져오기 이름 변경 필요
// As-is
const LambdaBaseLib = require('@rdk/core').RdkCoreBase

// To-be (구조 분해 할당 방식 또는 변수 할당 방식 사용)
const { LambdaBaseLib } = require('@cals-framework/lambda')
// const LambdaBaseLib = require('@cals-framework/lambda').LambdaBaseLib
  1. /model/lambdaModel.js 파일의 모듈 가져오기 이름 변경 필요
// As-is
const AppLambdaBaseModel = require('@rdk/lambda/model/applicationLambdaBaseModel')

// To-be (구조 분해 할당 방식 또는 변수 할당 방식 사용)
const { ApplicationLambdaBaseModel } = require('@cals-framework/lambda')
// const AppLambdaBaseModel = require('@cals-framework/lambda').ApplicationLambdaBaseModel
  1. /src/controller.js 파일의 모듈 가져오기 이름, Framework Context (Util, Exception), 메서드명 변경 필요
// As-is
'use strict'
const Service = require('./service')
const clsService = new Service()

module.exports = class Controller extends require('@rdk/lambda').BaseController {
 constructor (event, context) {
   super({ event, context, clsService })
   this.event = event
   this.context = context
 }

 async execute () {
   global.rdkLogger.param(this.event, this.context)

   // Todo : 파라미터 유효성 체크,세션 체크
   this.objRequestParams.sampleName = 'test1'
   this.objRequestParams.sampleDesc = 'test1'
   if (global.clsBaseUtil.CompareUtility.isEmpty(this.objRequestParams.sampleName)) {
     throw new global.ParameterNonExistException('sampleName')
   }
   if (global.clsBaseUtil.CompareUtility.isEmpty(this.objRequestParams.sampleDesc)) {
     throw new global.ParameterNonExistException('sampleDesc')
   }
   this.objReturn = await clsService.runMethod({ objRequestParams: this.objRequestParams, objReturn: this.objReturn })
   global.rdkLogger.result(this.objReturn)
   return this.objReturn
 }
}


// To-be
'use strict'

const { BaseController, CompareUtility, ParameterNonExistException, calsLogger } = 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 : 파라미터 유효성 체크,세션 체크
   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. /src/service.js 파일의 모듈 가져오기 이름, Framework Context (Util, Exception) 변경 필요
// As-is
'use strict'

const NoAffectedDataException = require('../exception/lambdaException').NoAffectedDataException
const DAO = require('./dao')
const clsDAO = new DAO()

module.exports = class Service extends require('@rdk/lambda').BaseService {
 constructor () {
   super(clsDAO)
 }

 async runMethod ({ objRequestParams, objReturn }) {
   global.rdkLogger.param(objRequestParams)
   // 1. 데이터 등록 모델 생성
   const SampleAddDataModel = require('../model/lambdaModel').SampleAddDataModel
   var objSampleAddDataModel = new SampleAddDataModel()
   // 2. 데이터 등록 모델에 데이터 등록
   objSampleAddDataModel.sampleName = objRequestParams.sampleName
   objSampleAddDataModel.sampleDesc = objRequestParams.sampleDesc
   // 3. 데이터 입력
   const objAddReturn = await clsDAO.addData({ objDAOParams: objSampleAddDataModel, objReturn })
   if (objAddReturn.affectedRows === 0) {
     throw new NoAffectedDataException(global.clsBaseConstant.ERROR_MESSAGE.NO_AFFECTED_QEURY)
   }
   global.rdkLogger.result(objReturn)
   return objReturn
 }
 // 여기까지 수정 가능 구역
}



// To-be
'use strict'

const { BaseService, calsLogger } = require('@cals-framework/lambda')
const { NoAffectedDataException } = require('../exception/lambdaException')
const ProjectBaseConstant = require('../constant/projectBaseConstant')
const DAO = require('./dao')

module.exports = class Service extends BaseService {
 constructor () {
   super()

   this.calsContext.daoContext === undefined
      ? this.clsDAO = new DAO()
      : typeof this.calsContext.daoContext !== 'undefined'
      ? this.calsContext.daoContext = new DAO()
      : this.clsDAO = this.calsContext.daoContext
 }

 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. /src/dao.js 파일의 모듈 가져오기 이름, Framework Context 변경 필요
// As-is
'use strict'

module.exports = class DAO extends require('@rdk/lambda').AppDAO {
 // 여기서부터 수정 가능 구역
 async addData ({ objDAOParams, objReturn }) {
   global.rdkLogger.param(objDAOParams)
   // Todo : 쿼리 정보 객체 생성
   const objQueryInfo = {
     sQueryId: 'insertData',
     objParam: objDAOParams,
     objReturn: objReturn
   }
   const objDAOReturn = await this.insert(objQueryInfo)
   global.rdkLogger.result(objDAOReturn)
   return objDAOReturn
 }
 // 여기까지 수정 구역
}


// To-be
'use strict'

const { ApplicationDAO, calsLogger } = require('@cals-framework/lambda')
const ProjectBaseConstant = require('../constant/projectBaseConstant')

module.exports = class DAO extends ApplicationDAO {
 // 여기서부터 수정 가능 구역
 async addData ({ objDAOParams, objReturn }) {
   calsLogger.param(objDAOParams)
  
   const objDAOReturn = await this.insert({
     sQueryId: 'insertData',
     objParam: objDAOParams,
     objReturn
   })
  
   calsLogger.result(objDAOReturn)
   return objDAOReturn
 }
 // 여기까지 수정 구역
}

6. 기존 Long-Term Service 수정

  • 3.5 기존 Application Lambda 수정"과 구조 및 방법이 동일합니다.

7. Application Lambda & Long-Term Service 배포

※ 기존에 생성하였던 Application Lambda 및 Long-Term Service를 배포하기 위한 방법을 설명합니다.

  1. 5. 기존 Application Lambda 수정 또한 “6 기존 Long-Term Service 수정"을 진행합니다.

  2. 배포할 프로젝트 Conext 메뉴에 “Migration” 버튼을 클릭합니다. (아이콘 추후 변경 예정)

Alt text

※ Migration 버튼과 관련한 규칙은 “ Migration 버튼 Display 규칙" 문단를 참고해주세요.

Migration 작업이 완료되었다면, 배포할 프로젝트에 아래 두 개의 파일이 생성되었는지 확인합니다.

  • development.json 파일을 대체하는 projectBaseConfigDev.js 파일

  • index.js 파일을 대체하는 app.js 파일

    Alt text

  1. 배포하기 전, 정상 동작 여부를 테스트하기 위해 Local Debug를 실행합니다. 아래의 사진처럼 작성한 소스가 정상 동작 (“Handle Finish”) 한다면 다음 배포 단계를 준비합니다.

Alt text

  1. 기존과 동일하게 배포 (“CheckIn”)를 진행합니다.

Alt text