IT,프로그래밍/AWS

[ AWS + Serverless.js ] 3.소스 코딩 1

이전글들

[ AWS + Serverless.js ] AWS람다 + 서버리스 로 배포하기!

 

1. serverless 설치 및 AWS연결

https://burning-camp.tistory.com/38

2. 환경설정

https://burning-camp.tistory.com/39


테스트 코드 작성

test/utils/db 디렉토리에 dbmanager.test.js 파일을 만든다.

const dbClient = require('serverless-mysql')({
    config: {
        host: 'localhost',
        user: 'mj',
        password: 'asdf12',
        port: 3306,
        database: 'testdb',
    },
})
test('DB Connection', () => {
    expect(typeof dbClient === 'object').toBe(true)
})
test('Query', async () => {
    await dbClient.connect()
    const result = await dbClient.query(` SELECT 2*4 AS number `)
    expect(result[0].number).toBe(8)
    await dbClient.end()
})

DB에 connection이 정상적으로 된다는 걸 위의 테스트 코드로 파악 했음으로 실제 소스를 작성 해보자.

먼저 환경에 따라 config 내용을 변경할 수 있도록 /config/env.local.json 을 작성해 주자.

{
    "database": {
        "rds_hostname": "localhost",
        "rds_username": "mj",
        "rds_password": "asdf12",
        "rds_port": 3306,
        "rds_database": "testdb"
    }
}

여기에 들어가는 내용은 환경 마다 다르므로 주의하도록 하자.

아까 작성한 dbmanager.test.js 의

const dbClient = require('serverless-mysql')({
    config: {
        host: 'localhost',
        user: 'mj',
        password: 'asdf12',
        port: 3306,
        database: 'testdb',
    },
})

부분에 입력한 내용을 적으면 된다.

이제 src/utils/db 경로에 DBManager.js 파일을 만들어 주자.

import env from './../../../config/env.local.json';
// Jest 테스트시 process.env 설정에 env.local.json 파일을 읽게 하기 위해 설정한 부분임 
if (process.env.MODE !== 'Serverless') {
    process.env = Object.assign(process.env, {
        RDS_HOSTNAME: env.database.rds_hostname,
        RDS_USERNAME: env.database.rds_username,
        RDS_PASSWORD: env.database.rds_password,
        RDS_PORT: env.database.rds_port,
        RDS_DATABASE: env.database.rds_database
    })
}
// DBClient 개체
export const dbClient = require('serverless-mysql')({
    config: {
        host: process.env.RDS_HOSTNAME,
        user: process.env.RDS_USERNAME,
        password: process.env.RDS_PASSWORD,
        port: process.env.RDS_PORT,
        database: process.env.RDS_DATABASE
    }
})
// DB Connect 이후 Query를 실행 하는 함수
export const executeQuery = async (_query, params) => {
    try {
        await dbClient.connect()
        return await dbClient.query(_query, params)
    } catch (err) {
        throw err
    } finally {
        await dbClient.end()
    }
}
// Jest 테스트시 process.env 설정에 env.local.json 파일을 읽게 하기 위해 설정한 부분임 
if (process.env.MODE !== 'Serverless') {
    process.env = Object.assign(process.env, {
        RDS_HOSTNAME: env.database.rds_hostname,
        RDS_USERNAME: env.database.rds_username,
        RDS_PASSWORD: env.database.rds_password,
        RDS_PORT: env.database.rds_port,
        RDS_DATABASE: env.database.rds_database
    })
}
// DBClient 개체
export const dbClient = require('serverless-mysql')({
    config: {
        host: process.env.RDS_HOSTNAME,
        user: process.env.RDS_USERNAME,
        password: process.env.RDS_PASSWORD,
        port: process.env.RDS_PORT,
        database: process.env.RDS_DATABASE
    }
})
// DB Connect 이후 Query를 실행 하는 함수
export const executeQuery = async (_query, params) => {
    try {
        await dbClient.connect()
        return await dbClient.query(_query, params)
    } catch (err) {
        throw err
    } finally {
        await dbClient.end()
    }
}

이제 만들어준 DBManager.js를 이용한 새로운 DB테스트 코드를 작성해 보자

/test/utils/db/dbmanager_2nd.test.js 를 작성해 주자.

import { dbClient, executeQuery } from "./../../../src/utils/db/DBManager"

test('DB Connection 테스트', () => {
    expect(typeof dbClient === 'object').toBe(true)
})
test('Query 테스트', async () => {
    const result = await executeQuery(`SELECT 2*5 AS number`)
    expect(result[0].number).toBe(10)
})

정상적으로 작동한다.