롤 mbti#4: 백부터 개발 시작

Seunghyo Ku·2021년 6월 8일
0
post-thumbnail

지난 번 글에서 적었다시피, 어떻게 개발을 해야하나 고민이 많았는데 질문은 대강 마무리 되었고, 추천 챔피언의 경우 LCK에서 프로 선수들의 MBTI를 조사한 바 있는데, 그것을 기반하고, 개인적인 경험과 주변의 경험을 바탕으로 결정하였다.

또한 추가적으로 유저의 반응을 수집하기 위해서..
결국 서버를 만드는 것이 최종적으로 결정되게 되었다.

산 너머 산이다.

MySQL을 사용해볼까 잠시 고민하긴 했지만, 쿼리가 복잡하지 않을 예정이고 그냥 빠르게 값만 읽어오는 것이 주 기능이기 때문에 MongoDB를 이용한 NoSQL을 접해보기로 했다. 서버는 전에 이용했던 Express를 쓸까 잠시 고민하다가 Koa를 이용해보기로 했다.

Express의 개발자 분들이 Koa를 최근에 만들었다기에.. 안 써볼 수 없었다. 사실 오랜만의 백 작업이라 조금 쫄깃하다.

본격적으로 코딩 시작이다!

MongoDB

작업 시작하기

마침, MongoDB Atlas를 무료로 이용할 수 있다고 하여 사용해보기로 했다.
Atlas 자체의 가이드가 매우 이해하기 쉽게 되어있어 처음 해보아도 잘 따라할 수 있었다.

  1. cluster 생성
  2. uset 생성
  3. 접근을 위한 IP 추가
  4. cluster에 연결하기

Schema 만들기

명세를 위한 스키마를 만들기로 했다.
가이드는 이 블로그 글을 보고 참고했고, 따라하려고 했다.

이 프로젝트는 총 두 개의 스키마를 가질 예정이다.

  • 스키마 1: MBTI 결과의 정보를 담고 있는 스키마
  • 스키마 2: 유저의 반응을 저장할 스키마

데이터베이스를 관리하는 데 다양한 방법이 있으나, 결과 페이지는 항상 16개로 고정되어 있고, 수정 작업을 하지 않을 계획이기 때문에 그냥 하나에 다 때려박을 생각이다. (그리고 나중에 알아보니 NoSQL은 조인 대신 이렇게 하나에 모아서 사용 한다고 한다.)

models/mbti.js

const mongoose = require("mongoose");
const Schema = mongoose.Schema;

const MbtiSchema = new Schema({
  mbti: {
    type: String,
  },
  comment: {
    type: String,
  },
  description: {
    type: String,
  },
  recommendation: {
    type: [String],
  },
  lck: {
    type: [String],
  },
  friend: {
    type: [String],
  },
});

module.exports = mongoose.model("Mbti", MbtiSchema);

필요한 정보는 mbti 종류, 각 mbti에 대한 코멘트, 자세한 설명, 추천 챔피언, lck 선수명, 같이 하면 좋을 친구, 결과 이미지 링크로 정했다. (이미지가 지금은 없으므로, 스키마에 포함하지는 않았다.)
그림 그리는 분을 수배해보거나 최악의 상황에는 직접 그려야 될지도 모른다는 생각이 든다..

구조

백엔드 구조는 다음과 같았다. 크게 controller/model/route로 나누어 관리할 예정이다.
mbti의 경우 16개로 틀이 고정되어 있기도 하고, MongoDB Atlas를 이미 사용하고 있기 때문에 GUI 환경에서 추가해주려고 한다. 추가하는 코드를 작성했다가 .. 굳이 필요하지 않을 것 같아 지운 것은 안 비밀이다.

  • model: Schema 정의
  • api: api안에 라우터와 라우터에서 사용될 controller를 함께 넣었다.

api/mbti/index.js

const Router = require("koa-router");
const mbti = new Router();
const controller = require("./mbti.controller");

mbti.get("/:mbti", controller.readMbti);

module.exports = mbti;

api/mbti/mbti.controller.js

const Mbti = require("../../models/mbti");

exports.readMbti = async (ctx, next) => {
  const { mbti } = ctx.params;
  let result;
  try {
    result = await Mbti.find({ mbti }).exec();
    ctx.status = 200;
    ctx.body = result[0];
  } catch (error) {
    ctx.status = 500;
    ctx.body = { message: error };
  }
};
profile
꼬꼬마 개발자 구승효입니다!

0개의 댓글