Node.js

Node.js를 사용하여 게임 API 서버 만들기: 재검토

몇 년 전, 브렛 로슨은 훌륭한 블로그 시리즈 에서 게임 서버 프레임워크 개발을 위해 Couchbase Server와 Node.js를 사용하는 방법에 대해 설명했습니다. 그 이후로 Couchbase용 Node.js SDK는 버전 1.x에서 2.x로 크게 성장했습니다.

이 글에서는 원래 세 개의 게시물을 다시 살펴보고 최신 Node.js 및 Express 프레임워크 표준과 최신 Node.js SDK 버전의 Couchbase에 맞게 변경해 보려고 합니다.

전제 조건

  • Node.js 0.12
  • 카우치베이스 서버 4.0

프로젝트 준비하기

Mac, Windows 또는 Linux를 사용하든 새 Express 프레임워크 애플리케이션을 만들면 이들 간에 일관성이 유지되어야 합니다. 라는 새 디렉터리를 만듭니다. gameapi-nodejs 데스크톱의 터미널(Mac/Linux) 또는 명령 프롬프트(Windows)에서 다음 명령을 실행합니다:

묻는 질문에 최선을 다해 답하세요. 물론 명령 프롬프트 또는 터미널에서 프로젝트 디렉터리가 현재 디렉터리여야 성공할 수 있습니다. 명령 대신 이 파일을 수동으로 만들어 채울 수도 있습니다. 프로젝트 디렉터리에 package.json이라는 새 파일을 만들고 다음을 채웁니다:

아직 끝나지 않았습니다. 이 애플리케이션을 계획하기 전에 프로젝트 종속성을 설치해야 합니다. 명령 프롬프트 또는 터미널에서 다음 명령을 실행합니다:

이렇게 하면 Express 프레임워크, Couchbase Node.js SDK, 비밀번호 해싱을 위한 Forge, 고유 값 생성을 위한 UUID, URL 인코딩 및 JSON POST 데이터를 처리하기 위한 본문 파서 미들웨어가 설치됩니다.

데이터베이스 준비하기

코딩을 시작하기 전에 다음과 같은 버킷이 있는 Couchbase Server를 설치해야 합니다. 게임 샘플 생성되었습니다.

이 프로젝트는 Couchbase 4.0의 주요 기능을 사용할 예정이므로 기본 인덱스가 생성되도록 버킷을 추가로 구성해야 합니다. Linux, Mac 또는 Windows 시스템을 사용하는 경우, 이 작업은 Couchbase 쿼리(CBQ) 클라이언트를 통해 쉽게 수행할 수 있습니다.

Mac

Mac에서 CBQ를 열려면 터미널에서 다음을 실행합니다:

Windows

Windows에서 CBQ를 열려면 명령 프롬프트에서 다음을 실행합니다:

기본 색인 만들기

CBQ를 연 상태에서 다음을 실행합니다:

이제 버킷을 나머지 프로젝트에 사용할 준비가 되었습니다!

프로젝트 구조

프로젝트는 다음과 같이 구성될 예정입니다:

항목 부모 설명
모델 모든 데이터베이스 클래스 파일은 여기로 이동합니다.
경로 모든 API 엔드포인트 정의는 여기로 이동합니다.
accountmodel.js 모델 계정 정보 생성 및 검색
세션모델.js 모델 사용자 인증 및 세션 정보 유지 관리하기
statemodel.js 모델 게임 상태 정보 생성, 업데이트 및 검색
routes.js 경로 GET, POST, PUT의 모든 엔드포인트가 여기에 있습니다.
app.js 서버 설정 정보
config.json 정적 변수
package.json 종속성 정보

기본 사항

Node.js 게임 서버 로직에 대해 자세히 알아보기 전에 기본 Express 프레임워크 애플리케이션을 구성하는 것이 가장 좋습니다.

프로젝트 루트에서 다음과 같은 파일을 만들고 엽니다. config.json 에 Couchbase 연결 정보와 같은 정적 정보를 보관할 수 있습니다. 열리면 다음을 포함하세요:

프로젝트 루트에서 다음과 같은 파일을 만들고 엽니다. app.js 파일에는 Node.js 서버 실행에 대한 모든 기본 정보가 들어 있습니다. 파일을 열면 다음을 포함하세요:

여기에 표시되는 내용을 분석해 보겠습니다. 처음 몇 줄은 애플리케이션에 종속성을 포함하는 것입니다. 특별한 것은 없습니다. 중요한 것은 다음과 같습니다:

즉, 요청 본문에서 JSON 데이터와 URL로 인코딩된 데이터를 파싱하게 됩니다. 특히 POST 및 PUT 요청이 그렇습니다. 다음으로 할 일은 애플리케이션에서 Couchbase 클러스터를 초기화하고 애플리케이션 내에서 사용할 단일 버킷을 여는 것입니다:

다음을 포함합니다. module.exports.bucket 애플리케이션을 통해 사용한다는 의미입니다. 이제 다른 자바스크립트 파일에서 버킷에 액세스하려면 그냥 하면 됩니다:

다음에는 곧 생성될 예정인 routes/routes.js 파일을 전달하고 앱 변수를 인수 중 하나로 사용할 수 있습니다. 이것이 무엇을 하는지는 곧 분명해질 것입니다.

마지막으로 app.listen 포트 3000에서 요청을 수신 대기하도록 Node.js에 지시하고 있습니다. 애플리케이션은 가장 기본적인 상태에서 거의 사용할 수 있습니다. 생성 및 열기 routes/routes.js 를 클릭하고 다음 줄을 추가합니다:

이제 다음을 실행하여 애플리케이션을 실행할 수 있습니다. 노드 app.js 명령 프롬프트 또는 터미널에서 입력합니다. 착륙 위치 http://localhost:3000 를 실행하면 "유효한 엔드포인트가 아닙니다"라는 메시지가 표시됩니다.

API 데이터 모델

중요한 코드를 살펴보기 전에 Couchbase에서 데이터가 어떻게 보이는지 아는 것이 가장 좋습니다. 한 사용자에게는 다음과 같이 보이는 4개의 문서가 있습니다:

사용자 문서

사용자 문서에는 사용자에 대한 모든 정보가 저장됩니다. 이 애플리케이션의 경우 해당 정보는 이름, 사용자 이름, 비밀번호입니다.
이 문서의 이름 앞에 다음과 같은 접두사가 붙습니다. user:: 에 고유한 UID 값을 추가합니다. 이 문서 이름 지정 전략은 복합 키라는 것을 사용합니다.

사용자 이름 문서

사용자명 문서에는 사용자 문서에 있는 uid 값만 저장됩니다. 사용자명 문서의 목적은 로그인 방법 문서처럼 생각할 수 있습니다. 예를 들어 사용자가 사용자 이름과 비밀번호를 입력하는 간단한 로그인을 나타낼 수 있습니다. 이 문서에는 연결 UID가 포함되어 있기 때문에 사용자 문서에 연결될 수 있습니다. 사용자 이름 문서 앞에는 사용자 이름:: 을 입력하면 실제 사용자 아이디가 추가됩니다. 페이스북이나 트위터를 로그인 수단으로 사용하고 아이디 필드를 통해 연결하는 경우에도 비슷한 전략을 사용할 수 있습니다.

세션 문서

세션 문서는 자동 만료되는 문서로, 사용자가 보다 안전한 정보로 이동하는 경로 역할을 합니다. 이론상으로는 사용자 프런트엔드에서 시드 값을 저장하여 보호된 엔드포인트 간에 전달합니다. 이를 통해 사용자에게 연결된 UID에 액세스할 수 있습니다.

상태 문서

상태 문서에는 게임의 특정 상태에 대한 정보가 저장됩니다. 예를 들어 게임 캐릭터의 생명력이 5개, 물약이 20개 남은 경우 해당 정보가 여기에 저장됩니다. 두 개의 활성 게임 세션이 같은 계정으로 저장되는 것을 방지하기 위한 버전 정보도 있습니다.

계정 모델 만들기

계정 모델은 세 가지 특별한 용도로 사용됩니다:

  • 사용자 계정 만들기
  • 사용자 계정 복구하기
  • 해시된 비밀번호와 해시되지 않은 비밀번호 비교하기

코딩을 시작하기 전에 인클루드를 순서대로 정리해야 합니다. 다음을 models/accountmodel.js file:

위에서 본 데이터 모델에 따라 사용자 계정을 만들려면 이름, 사용자 아이디, 비밀번호가 필요합니다. 이 정보가 준비되면 비밀번호는 해시되고 사용자 정보는 다음과 같이 참조 문서와 함께 저장됩니다:

위 코드에서 먼저 새 참조 문서를 삽입하려고 시도합니다. 실패하면(이미 존재하는 문서일 수도 있음) 두 문서 모두 저장되지 않고 대신 오류 메시지가 반환됩니다. 성공 또는 실패 여부에 관계없이 라우팅 파일의 콜백이 실행되어 요청자에게 어떤 종류의 답변이든 표시합니다.

사용자 데이터를 읽을 때 두 가지 중 하나가 발생할 수 있습니다. 일종의 간단한 로그인을 수행하기 때문에 사용자 이름을 전달하거나 사용자 ID를 전달할 수 있습니다. 목적에 따라 다릅니다. 사용자 이름으로만 로그인한다고 가정하면 다음과 같은 함수를 호출하고 싶을 것입니다:

Couchbase 4.0의 새로운 기능인 N1QL 쿼리를 어떻게 사용하고 있는지 주목하세요. 이 쿼리는 기존 SQL과 매우 유사하며 애플리케이션 계층에서 데이터를 크런치하거나 포맷할 필요가 없는 편리함을 제공합니다. 이 모든 작업은 Couchbase Server가 자동으로 수행합니다. 하지만 이전 버전의 Couchbase 및 기타 NoSQL 플랫폼에서와 같이 데이터를 요청할 수 있는 옵션도 있습니다.

위의 N1QL 문에서는 일반 텍스트 사용자 이름에 복합 키가 추가된 문서를 선택하고 있습니다. 사용자 이름 문서(외래 키)와 사용자 문서(기본 키)의 uid 속성을 사용하여 조인이 이루어지고 있습니다.

이제 비밀번호를 확인하는 단계로 넘어갑니다. 여기서는 데이터베이스를 호출하지 않습니다. 원시 비밀번호를 가져와서 해싱한 다음 해시를 저장된 비밀번호와 비교하기만 하면 됩니다.

만들려면 models/accountmodel.js 경로 파일에서 사용할 수 있도록 하려면 다음과 같이 내보내야 합니다.
models/accountmodel.js 코드:

세션 모델 만들기

세션 모델은 세 가지 특별한 용도로 사용됩니다:

  • 사용자 세션 만들기
  • 사용자 세션 다시 가져오기
  • 사용자 세션 유효성 검사

코딩을 시작하기 전에 인클루드를 순서대로 정리해야 합니다. 다음을 models/sessionmodel.js file:

세션 만들기

사용자가 세션을 생성하려면 아이디를 제공해야 합니다. 이를 통해 고유한 세션 ID가 생성되고 만료와 함께 데이터베이스에 삽입됩니다. 문서가 만료되면 사용자의 개입 없이 자동으로 Couchbase에서 제거되어 사용자가 로그아웃됩니다.

사용자 인증하기

사용자 세션이 생성되면 사용자가 보호된 엔드포인트에 도달할 때마다 세션 ID를 사용해야 합니다.

위 코드에서 함수는 세션 ID를 받아 세션이 이미 존재하는지 조회하는 데 사용합니다. 세션이 존재하면 세션 만료 시간을 재설정하고 세션과 연결된 UID를 반환합니다. 세션 정보를 가져오는 방법은 다음과 같습니다:

나쁘지 않죠? 마지막으로 세션 재설정도 비슷한 방식으로 이루어짐을 알 수 있습니다:

터치 방식은 시간을 추가하지 않고 대신 시간을 초기화합니다. 이 경우 타이머가 1시간으로 재설정됩니다.

만들려면 models/sessionmodel.js 경로 파일에서 사용할 수 있도록 하려면 다음과 같이 내보내야 합니다. models/sessionmodel.js 코드:

상태 모델 만들기

상태 모델은 두 가지 특별한 용도로 사용됩니다:

  • 저장 상태 생성 또는 업데이트하기
  • 이름으로 저장 상태 가져오기

코딩을 시작하기 전에 인클루드를 순서대로 정리해야 합니다. 다음을 models/statemodel.js file:

저장 상태 만들기

저장 상태를 만들거나 업데이트하는 목적은 먼저 저장 상태가 존재하는지 확인하는 것입니다. 존재하지 않으면 생성합니다. 존재한다면 존재하는 정보를 가져와서 변경한 다음 데이터베이스에 현재 존재하는 모든 정보를 대체합니다. 이 모든 작업은 게임 저장 버전 간의 충돌을 피하기 위해 상태 버전을 늘리면서 수행됩니다. 실제로 카우치베이스에 저장할 때 충돌을 방지하기 위한 것이 아니라, 두 개의 기기에서 게임을 선택해서 훨씬 오래된 저장으로 게임 데이터를 덮어쓰지 않도록 하기 위한 것입니다.

참조 업서트 를 입력하세요. 카우치베이스에서는 존재하지 않으면 생성하고, 존재하면 대체한다는 뜻입니다. 게임의 저장 상태와 같은 작업에 매우 편리합니다.

상태 가져오기

이렇게 하면 생성한 모든 저장 상태를 가져올 수 있습니다.

이 개념은 사용자 ID를 기반으로 문서 조회를 수행한다는 것입니다. 특정 아이디에 대한 상태 문서가 존재하면 연관 배열에서 조회를 수행하여 상태 이름이 존재하는지 확인합니다. 존재한다면 그 이름에 대해 존재하는 모든 상태 콘텐츠를 반환합니다.

만들려면 models/statemodel.js 경로 파일에서 사용할 수 있도록 하려면 다음과 같이 내보내야 합니다. models/statemodel.js 코드:

API 경로 만들기

위에서 필요한 모든 데이터 모델을 만들었으므로 이제 이를 사용자가 액세스할 수 있는 경로와 함께 연결할 차례입니다. 다시 routes/routes.js 파일에 계정 모델 경로를 추가하는 것부터 시작하겠습니다:

위의 엔드포인트는 이름, 사용자 이름, 비밀번호 본문 매개변수가 포함된 POST 요청을 기대합니다. HTTP 요청을 통해 데이터를 생성하거나 삽입할 때 POST를 사용하는 것이 가장 좋은 방법이기 때문에 POST를 수신 대기하고 있습니다. 이 세 가지가 모두 존재하면 AccountModel.create() 메서드가 호출되어 메서드의 성공 여부에 따라 오류 또는 결과를 반환합니다. 필수 매개변수 중 하나 이상이 존재하지 않으면 오류가 반환됩니다. 오류 코드 목록은 다음과 같습니다. 여기.

이 예제에서는 사용자 정보를 가져오기 위한 엔드포인트는 그다지 중요하지 않으므로 사용자 인증과 세션 생성으로 바로 넘어가겠습니다. 이 예제에서는 routes/routes.js 파일에 다음을 추가합니다:

인증 엔드포인트는 사용자 이름과 비밀번호를 요구합니다. 두 가지가 모두 발견되면 사용자를 조회합니다. 사용자를 찾으면 비밀번호 비교가 이루어지고 성공하면 세션이 생성됩니다.

마지막으로 유용한 두 가지 API 엔드포인트는 저장 상태를 가져오고 생성하는 데 사용됩니다. 저장 상태 엔드포인트를 만드는 것부터 시작해서, 여러분의 routes/routes.js를 클릭하고 다음을 추가합니다:

위의 엔드포인트는 상태 이름을 나타내는 URL 파라미터, 현재 상태 버전을 나타내는 쿼리 파라미터, 저장할 가치가 있는 게임 데이터를 나타내므로 상상할 수 있는 모든 JSON을 포함할 수 있는 요청 본문을 기대합니다.

마지막으로 저장된 상태를 가져오는 작업만 남았습니다.

위의 엔드포인트는 특정 저장 상태를 나타내는 URL 매개변수를 찾을 것으로 예상합니다. 물론 사용자가 먼저 인증되기를 기대합니다.

API 테스트

에서 만든 API 엔드포인트는 routes/routes.js 파일은 몇 가지 방법으로 테스트할 수 있습니다. 제가 가장 좋아하는 두 가지 테스트 방법은 Chrome용 Postman 확장 프로그램 또는 cURL을 사용하는 것입니다. cURL을 사용하여 직접 테스트해 보세요:

위에서 새 사용자 계정을 만들었습니다.

위에서 사용자 세션을 만들었습니다. 다른 엔드포인트에도 동일한 전략을 적용할 수 있습니다.

결론

Node.js와 카우치베이스 서버 SDK를 사용하면 게임용 API 백엔드를 쉽게 만들 수 있습니다. 이제 카우치베이스 4.0에서는 애플리케이션의 데이터 쿼리를 위한 옵션으로 N1QL을 자유롭게 사용할 수 있습니다.

이 문서에서 설명한 전체 Node.js 애플리케이션은 다음 링크에서 무료로 다운로드할 수 있습니다. 카우치베이스 랩 깃허브 리포지토리에 저장합니다.

이 문서 공유하기
받은 편지함에서 카우치베이스 블로그 업데이트 받기
이 필드는 필수 입력 사항입니다.

작성자

게시자 Nic Raboy, 개발자 옹호자, Couchbase

닉 라보이는 최신 웹 및 모바일 개발 기술을 옹호하는 사람입니다. 그는 Java, JavaScript, Golang 및 Angular, NativeScript, Apache Cordova와 같은 다양한 프레임워크에 대한 경험이 있습니다. Nic은 웹 및 모바일 개발을 보다 쉽게 이해할 수 있도록 자신의 개발 경험에 대해 글을 쓰고 있습니다.

댓글 하나

  1. 안녕하세요,

    'bucket.enableN1ql(\'localshot:8093\');\'을 실행하여 카우치베이스 4에서 여전히 N1QL을 활성화해야 하나요? Thanks

    1. 매트 인젠트론 7월 18, 2015에서 6:12 오후

      아니요, 최신 SDK에서만 작동합니다.

      1. 클라이언트의 오류를 문의하고 싶습니다:\"

        [com.couchbase.client.deps.io.netty.util.ResourceLeakDetector] LEAK: 가비지 수집되기 전에 ByteBuf.release()가 호출되지 않았습니다. 고급 유출 보고를 활성화하여 유출이 발생한 위치를 파악하세요. 고급 누출 보고를 활성화하려면 JVM 옵션 \'-Dcom.couchbase.client.deps.io.netty.leakDetectionLevel=advanced\'를 지정하거나 ResourceLeakDetector.setLevel()\"을 호출하세요."
        문제란 무엇인가요? 해결 방법

  2. 안녕하세요,

    N1QL은 쿼리에만 사용할 수 있나요, 아니면 UPSERT\'s 및 INSERT\'를 수행하는 데 사용할 수 있나요? 고마워요

    1. 현재 INSERT, UPDATE, DELETE, UPSERT는 베타 버전입니다. 사용할 수는 있지만 베타 버전에서 벗어날 때까지 프로덕션 환경에서는 사용하지 않는 것이 좋습니다.

      http://developer.couchbase.com

      최고,

댓글 남기기

카우치베이스 카펠라를 시작할 준비가 되셨나요?

구축 시작

개발자 포털에서 NoSQL을 살펴보고, 리소스를 찾아보고, 튜토리얼을 시작하세요.

카펠라 무료 사용

클릭 몇 번으로 Couchbase를 직접 체험해 보세요. Capella DBaaS는 가장 쉽고 빠르게 시작할 수 있는 방법입니다.

연락하기

카우치베이스 제품에 대해 자세히 알고 싶으신가요? 저희가 도와드리겠습니다.