더북(TheBook)

전체 코드는 다음과 같습니다.

코드 11-4 Redis와 연동한 구매 관리 비즈니스 로직 전체 코드

예제 파일 : purchases.js

const mysql = require('mysql');
const conn = {
    host: 'localhost',
    user: 'micro',
    password: 'service',
    database: 'monolithic'
};

const redis = require("redis").createClient();  // redis 모듈 로드

redis.on("error", function(err) {
    console.log("Redis Error " + err);
});

/*
 * 구매 관리의 각 기능별로 분기
 */
exports.onRequest = function(res, method, pathname, params, cb) {

    switch (method) {
        case "POST":
            return register(method, pathname, params, (response) => { process.
                            nextTick(cb, res, response); });
        case "GET":
            return inquiry(method, pathname, params, (response) => { process.
                           nextTick(cb, res, response); });
        default:
            return process.nextTick(cb, res, null);
    }
}

/**
 * 구매 기능
 * @param method    메서드
 * @param pathname  URI
 * @param params    입력 파라미터
 * @param cb        콜백
 */
function register(method, pathname, params, cb) {
    var response = {
        key: params.key,
        errorcode: 0,
        errormessage: "success"
    };

    if (params.userid == null || params.goodsid == null) {
        response.errorcode = 1;
        response.errormessage = "Invalid Parameters";
        cb(response);
    } else {
        redis.get(params.goodsid, (err, result) => {  // Redis에 상품 정보 조회
            if (err || result == null) {
                response.errorcode = 1;
                response.errormessage = "Redis failure";
                cb(response);
                return;
            }

            var connection = mysql.createConnection(conn);
            connection.connect();
            connection.query("insert into purchases(userid, goodsid) values(? ,? )"
                , [params.userid, params.goodsid]
                , (error, results, fields) => {
                    if (error) {
                        response.errorcode = 1;
                        response.errormessage = error;
                    }
                    cb(response);
                });
            connection.end();
        });
    }
}

/**
 * 구매 내역 조회 기능
 * @param method    메서드
 * @param pathname  URI
 * @param params    입력 파라미터
 * @param cb        콜백
 */
function inquiry(method, pathname, params, cb) {
    var response = {
        key: params.key,
        errorcode: 0,
        errormessage: "success"
    };

    if (params.userid == null) {
        response.errorcode = 1;
        response.errormessage = "Invalid Parameters";
        cb(response);
    } else {
        var connection = mysql.createConnection(conn);
        connection.connect();
        connection.query("select id, goodsid, date from purchases where userid = ?"
            , [params.userid]
            , (error, results, fields) => {
                if (error) {
                    response.errorcode = 1;
                    response.errormessage = error;
                } else {
                    response.results = results;
                }
                cb(response);
            });
        connection.end();
    }
}

이 장에서는 마이크로서비스의 공유 자원 이슈와 Redis를 활용해 공유 자원을 처리하는 방법을 알아보았습니다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.