글쓴이 보관물: Toughman

Google Cloud Functions 와 Firestore 를 이용한 사용자 확인

개요

간단한 자료를 저장해야 하는데 서버를 운영하기에는 부담이 됩니다. 배보다 배꼽이 더 큰 상황이 될 수 있습니다. 이럴 때 사용할 수 있는 것이 서버리스 서비스 입니다.

서버리스 컴퓨팅

서버리스(Serverless) 컴퓨팅은 서버가 없다는 뜻 보다는 실제 서비스를 이용하는 주체가 소유하지 않는다고 이해하는 것이 좋을 것 같습니다. 서버 없이 서비스를 할 수는 없습니다. 개인이나 회사가 서버를 소유하지 않고 사용한 만큼만 비용을 지불하는 서비스 입니다. 대표적인 것이 AWS Lamba, Azure Functions, Google Clound Functions 가 있습니다.

Google Clound Functions

Clound Functions 은 Google 에서 제공하는 서비스 입니다. 사용자가 함수를 만들고 배포해서 실행할 수 있습니다. 직접 호출할 수도 있고 특정 트리거와 연결할 수 있습니다. 이 글에서는 Node.js 를 사용해서 함수를 만들고 Firestore 에 저장되어 있는 자료와 비교해서 에뮬레이터를 통해 결과를 확인하는 방법을 알아보도록 하겠습니다.

Cloud Firestore

Cloud Firestore 는 NoSQL 문서 데이터베이스 입니다. 간단한 정보를 저장할 수 있습니다. 같은 프로젝트 내에서 Clound Function 내에서 연결해서 자료를 입력, 수정, 삭제할 수 있습니다. 비정형 자료를 자유롭게 입력할 수 있는 MongoDB 같은 형태라고 이해하시면 됩니다.

구현 기능

사용자 정보가 Firestore에 입력되어 있다고 가정합니다. 웹을 통해 JSON 형식의 자료를 함수로 POST 하면 그 정보로 사용자 존재여부를 판단합니다. 그런 후 JSON 형태의 응답을 반환하는 함수를 구현해 보도록 하겠습니다. 실제 배포하는 것은 다루지 않습니다. 배포 전 에뮬레이터를 이용한 테스트까지만 살펴봅니다. 배포는 그리 어렵지 않고 호출 주소만 달라지는 것이라서 실제 작업하시는 것에는 문제가 없을겁니다.

Clound Function 구현

문서를 확인해 보면 절차대로 설명이 잘 되어 있습니다. 문서를 한번 확인하신 후 이 글을 참고 하시면 도움이 됩니다. 함수를 설정하고 작성 후 테스트 하는 순서로 작업이 진행됩니다. 함수 실행에 문제가 없다고 판단되면 배포해서 사용하면 됩니다.

먼저 Firebase 프로젝트를 만듭니다. 이미 생성된 프로젝트를 사용해도 됩니다. Node.js 환경은 이미 구성되어 있다고 가정하겠습니다. 다음 명령어를 명령 프롬프트에서 실행해서 Firebase CLI 들 설치합니다.

npm install -g firebase-tools

그 다음 다음 명령어를 실행하면 브라우저가 열리면서 인증을 할지 확인을 합니다.

firebase login

인증 후 작업 폴더에서 다음 명령어를 실행하면 기본적인 틀이 생성됩니다.

firebase init functions

사용할 언어를 JavaScript 나 TypeScript 를 선택합니다. 이 글에서는 JavaScript를 선택하겠습니다.

JavaScript 선택

나머지 항목은 엔터를 입력해서 기본값으로 진행합니다. 작업이 완료되면 다음의 명령어를 입력합니다.

firebase init emulators

에뮬레이터를 선택하는 화면이 나타나는데 Functions, Firestore를 커서 및 스페이스바 키를 이용해서 선택합니다.

Functions, Firestore 선택

Firestore를 선택하지 않으면 “The Cloud Firestore emulator is not running, so calls to Firestore will affect production” 메시지가 나타나고 함수가 정상적으로 실행되지 않습니다.

/functions/index.js 파일에 다음과 같이 함수를 추가합니다.

const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);

exports.authentificateUser = functions.https.onRequest((request, response) => {
    functions.logger.info('call authentificateUser', {structuredData: true});

    var userId = request.body.userId;
    var userPassword = request.body.userPassword;

    functions.logger.info('userId : ' + userId, {structuredData: true});
    functions.logger.info('userPassword : ' + userPassword, {structuredData: true});

    let db = admin.firestore();

    db.collection('user').where('userId', '==', userId).where('userPassword', '==', userPassword).get()
        .then((snapshot) => {

            var documentId = 'NONE';
            var userName = 'NONE';
            var userEmail = 'NONE';

            if (snapshot.empty) {
                functions.logger.info('No matching documents.', {structuredData: true});
            } else {

                functions.logger.info('Matching documents.', {structuredData: true});

                let userData = snapshot.docs[0];

                documentId = userData.id;
                userName = userData.get('userName');
                userEmail = userData.get('userEmail');
            }

            var userObject = { id: documentId, email: userEmail, name: userName};

            response.json({
                response: userObject,
            })

        })
        .catch((err) => {
            console.log('Error getting documents', err);
    });
});

6행은 사용자가 로그를 기록하는 코드 입니다. 입력된 값을 확인하거나 진행되는 순서등 알고자 하는 정보를 기록합니다.

8, 9행은 함수 호출 시 JSON 형태로 전달된 자료를 가져와서 변수에 대입하는 코드입니다. 이 값을 가지고 Firestore 의 자료와 비교해서 사용자 존재여부를 판단합니다.

16행은 Firestore와 연결된 user collection 에서 입력된 값과 비교하는 코드입니다. 조건에 맞는 자료가 없으면 자료가 없다는 로그를 기록합니다. 사용자 있다면 정보를 가져와서 반환될 JSON 형식으로 출력할 변수에 할당해 줍니다. Firestore 관련 API 정보는 여기에서 확인하실 수 있습니다.

에뮬레이터 실행

명령 프롬프트에 다음 명령을 실행하면 에뮬레이터가 실행되고 테스트를 진행할 수 있습니다.

firebase emulators:start
에뮬레이터 실행

설명에 나타난 바와 같이 http://localhost:4000 주소로 브라우저로 접속해 보면 상태를 확인할 수 있습니다.

에뮬레이터 상태 화면

Firestore emulator 영역의 Go to emulator 링크를 클릭해서 나타나는 화면에 테스트 할 자료를 입력합니다.

Firestore 테스트 자료 입력

Postman 같은 프로그램으로 함수를 호출해서 결과가 나타나는지 확인합니다. 입력된 사용자 정보와 일치하면 각각의 값이 반환되고 찾을 수 없다면 모두 NONE 이 반환됩니다.

Postman 을 사용한 함수 테스트

Functions emulator 영역의 View logs 링크를 클릭해보면 호출된 내역을 확인할 수 있습니다. 사용자가 추가한 로그 정보도 같이 나타나는 것을 알 수 있습니다.

함수 호출 내역 확인

함수에 문제가 없다는 확신이 들 때까지 이와 같은 방법으로 테스트합니다. 문제가 있는 함수를 잘못 배포하면 예기치않게 많은 비용이 청구될 수 있습니다.

Google Cloud Functions, Firestore 를 이용해서 서버리스 서비스를 호출해서 사용자 인증하는 방법을 알아보았습니다. 이것을 응용하면 원하시는 함수를 제작하실 수 있을 것 입니다.

로지텍 G304 마우스

개요

관련 업체로 부터 지원을 받거나 한 사실이 없습니다. 제품 선택은 순전히 개인적인 판단에 따른 것 입니다.

사용하던 마우스의 버튼이 잘 눌러지지 않는 현상이 있어서 다른 것으로 구매해야 겠다는 생각이 들었습니다. 사용하던 마우스에 별다른 불만이 없어서 재구매 하려고 했습니다. 검색해 보니 참 다양한 종류가 있었습니다. 마우스를 보통 왼손으로 사용하고 게임시에는 오른손으로 사용합니다. 그래서 좌우대칭형 중심으로 다른 제품도 확인해 보았습니다. 그러던 중 로지텍 G304 마우스 가 눈에 들어왔습니다.

일단 좌우 대칭형이고 부가 버튼은 두개로 적었지만 가끔 게임 할때는 오른손으로 사용하니 나쁘지 않을 것 같았습니다. 크게 부담되는 가격도 아니어서 게이밍 마우스를 처음 구매하게 되었습니다.

구매

국내 정식 발매 제품과 해외직구 제품으로 크게 구매 가능한 경로가 있었습니다. 제품만 같으면 AS 받을 일은 없을 듯 해서 가격이 저렴한 중국 내수 제품을 직구대행 업체를 통해 구매했습니다.

구성

작은 상자에 마우스가 들어있습니다. AA건전지는 기본으로 들어있었습니다.

로지텍 G304 마우스 패키지

각종 설명서, 마우스 본체, 건전지, USB 확장 케이블이 동봉되어 있습니다. USB 허브가 없거나 PC와 거리가 있는 경우 리시버를 확장 케이블을 이용해서 연결하면 됩니다.

로지텍 G304 마우스 구성

크기 및 무게

마우스가 기존에 사용하던 M235보다 커서 무겁지 않을까 생각했는데 차이가 느껴지지 않았습니다. 어떤 분들은 AAA 건전지를 홀더에 끼워서 더 가볍게 사용하시는 경우도 있었습니다. 크기는 처음에는 크게 느껴졌는데 조금 사용하다 보니 금방 적응 되었습니다.

AA 건전지와 크기 비교
M235 와 크기 비교

사용

건전지와 리시버를 장착하면 별다른 과정 없이도 바로 사용가능합니다. 그래도 조금 더 활용하려고 Logitech G HUB 소프트웨어를 설치했습니다.

Logitech G HUB

마우스를 자동으로 인식하고 마우스 이미지를 클릭하면 설정상태를 보여줍니다.

마우스 버튼 매핑 상태

왼쪽에 있는 명령을 드래그 해서 버튼쪽에 가져가면 변경할 수 있습니다. 자신에 맞게 조정해서 사용하면 됩니다. 필자의 경우에는 오버워치와 디아블로3 게임을 자동으로 인식해서 프로필이 생성되었습니다. 프로필을 선택해서 게임별로 원하는 대로 변경 가능합니다.

민감도 메뉴를 선택하면 다음과 같은 화면이 나타납니다.

민감도 화면

필자의 경우 처음에는 400, 800, 1600, 3200 만 있었습니다. 개인적인 느낌으로는 1600으 조금 둔한것 같고 3200은 너무 예민했습니다. 이리저리 설정을 변경하던 중 오른쪽 직선 부분을 클릭하면 새로운 DPI 를 추가할 수 있다는 것을 알게 되었습니다. 삭제하려면 설명과 같이 슬라이더 밖으로 드래그 하면 됩니다. 2400을 추가하니 필자에게는 적당한 민감도 였습니다.

게임을 실제로 해 보니 기존 마우스 설정에는 맞지 않아서 조정이 필요했습니다. 그 후에는 비슷했는데 우측에 버튼 두개에 자주 사용하는 키를 매핑해 놓으니 편리했습니다. 게임에 미치는 영향은 감도 이외에는 둔감해서 그런지 느낄 수 없었습니다.

왼손으로 사용할 때 추가 버튼 두개를 사용할 수 없는 단점이 있습니다. 그러나 첫 게이밍 마우스로는 나쁘지 않은 선택이었던 것 같습니다. 입문자 용으로 적당한 것 같습니다.