변경 가이드
Node.js 18 버전 업데이트
1.현재 설치되어 있는 Node.js 버전 확인
Windows: 실행
(Win + R)
창을 활성화한 뒤,cmd
입력하여 명령 프롬프트에서node -v
입력macOS: 터미널 앱을 실행한 뒤,
node -v
입력
2. 버전 확인 결과 v18.xx.x
로 시작하지 않는 경우 3
번으로 이동
v18.xx.xx
로 시작하는 경우는 “3.2 VSCode CALS Extension 버전 업데이트”로 이동합니다.
3. Node.js 18
버전으로 업데이트 (OS
별, 기 설치방식별 업데이트 방법 상이)
Windows +
설치 파일로 설치한 경우: node-v18.18.2-x64.msior node-v18.18.2-x86.msiWindows + nvm
으로 설치한 경우: nvm install 18
→ `nvm`으로 설치 완료되었을 경우 `nvm use 18` 커맨드로 Node.js 18 버전 적용 (Windows)
- macOS + 설치 파일로 설치한 경우: node-v18.18.2.pkg
- macOS + nvm으로 설치한 경우: nvm install 18
VSCode CALS Extension 버전 업데이트 (작성일 기준 최신버전 v1.0.10)
- 기존에 설치되어 있는
Visual Studio Code
를 실행합니다. (설치되어 있지 않을 경우 “설치 가이드”
- 확장 메뉴로 이동합니다. ( Windows: Ctrl + Shift + X / macOS: Cmd+Shift+X)
cals-vscode-extension
확장 프로그램의 설치 여부에 따라 신규 설치 및 버전 업데이트 진행
a. 설치가 되어있는 경우: 확장 프로그램의 업데이트 버튼을 클릭하여 버전 업데이트 진행
b. 설치가 되어있지 않은 경우: 마켓플레이스에서 확장 검색에 cals-vscode-extension
검색 후 설치
4.
cals-vscode-extension
확장 프로그램을 실행하여 최신 버전으로 실행 및 Node.js 버전 체크 확인 a. 최신버전 및 Node.js 18 이상 버전을 사용한 경우: 정상 실행b. 최신버전 및
Node.js 18
미만 버전을 사용한 경우: 에러 발생
3. 신규 Application Lambda 생성
Remote Explorer
에서New
버튼을 클릭하여Lambda Project
를 생성합니다.
- 생성할
Lambda
프로젝트명을 작성한 뒤Enter
키를 누릅니다.
- 기본
Lambda Template
소스 복제가 완료되면Local Explorer
에 작성한 프로젝트명 폴더가 생성됩니다.
Local
테스트 시 사용하는DB
정보는/config/projectBaseConfigDev.js
파일에서 설정합니다.
- 이 외 소스코드 작성 구조는 기존과 동일합니다.
※ Util, Exception 모듈 로드 방식 변경은 Framework Context 부분을 참고하시기 바랍니다.
4. 신규 Long-Term Service
생성
- “3.3 신규 Application Lambda" 생성"과 구조 및 방법이 동일합니다.
5. 기존 Application Lambda
수정
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
/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'
}
}
/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 { …. }
/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
/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
/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
}
}
/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
}
// 여기까지 수정 가능 구역
}
/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를 배포하기 위한 방법을 설명합니다.
5. 기존 Application Lambda 수정 또한 “6 기존 Long-Term Service 수정"을 진행합니다.
배포할 프로젝트
Conext
메뉴에“Migration”
버튼을 클릭합니다. (아이콘 추후 변경 예정)
※ Migration 버튼과 관련한 규칙은 “ Migration 버튼 Display 규칙" 문단를 참고해주세요.
Migration
작업이 완료되었다면, 배포할 프로젝트에 아래 두 개의 파일이 생성되었는지 확인합니다.
development.json
파일을 대체하는 projectBaseConfigDev.js 파일index.js
파일을 대체하는 app.js 파일
- 배포하기 전, 정상 동작 여부를 테스트하기 위해
Local Debug
를 실행합니다. 아래의 사진처럼 작성한 소스가 정상 동작 (“Handle Finish”) 한다면 다음 배포 단계를 준비합니다.
- 기존과 동일하게 배포 (“CheckIn”)를 진행합니다.