모델 분리


3. User 모델 생성


User.js 파일을 다음과 같이 만들고 코드를 수정한다.

Untitled

User.js


"use strict";

const UserStorage = require("./UserStorage");

class User {
  constructor(body) {
    this.body = body;
  }
  login() {
    const body = this.body;
    const { id, pw } = UserStorage.getUserInfo(body.id);
    if (id) {
      if (id === body.id && pw === body.pw) {
        return { success: true };
      }
      return { success: false, msg: "올바르지 않은 비밀번호입니다." };
    }
    return { success: false, msg: "아이디를 확인하세요." };
  }
}

module.exports = User;

UserStorage.js


"use Strict";

class UserStorage {
  static #users = {
    id: ["kim", "park", "choi"],
    pw: ["1234", "1q2w3e4r", "iloveyou"],
    name: ["김과장", "박차장", "최부장"],
  };

  static getUsers(...fields) {
    const users = this.#users;
    const newUsers = fields.reduce((newUsers, field) => {
      if (users.hasOwnProperty(field)) {
        newUsers[field] = users[field];
      }
      return newUsers;
    }, {});
    return newUsers;
  }
  static getUserInfo(id) {
    const users = this.#users;
    const idx = users.id.indexOf(id);
    const usersKeys = Object.keys(users);
    const userInfo = usersKeys.reduce((newUser, info) => {
      newUser[info] = users[info][idx];
      return newUser;
    }, {});
    return userInfo;
  }
}

module.exports = UserStorage;

Users 클래스의 login() 메서드의 수행을 위한 정보 전달용 함수 getUserInfo()를 새로 만든다. 해당 함수는 입력받은 id에 관련된 사람의 모든 정보를 객체 형태로 반환하는 함수이며, getUsers와 유사한 방식이다.

login()에서 getUserInfo()로부터 반환받은 id, pw와 입력받은 id, pw를 비교하여 로그인 성공 및 실패 여부를 다르게 반환하였다.

home.ctrl.js


"use strict";

const User = require("../../models/User");

const output = {
  home: (req, res) => {
    res.render("home/index");
  },

  login: (req, res) => {
    res.render("home/login");
  },
};

const process = {
  login: (req, res) => {
    const user = new User(req.body);
    const response = user.login();
    return res.json(response);
  },
};

module.exports = {
  output,
  process,
};

컨트롤러에 있던 로그인 확인 기능들이 모두 모델로 옮겨갔다.

단지 컨트롤러에서 수행하는 것은 user 객체 생성, login() 메서드 수행 및 반환이 전부다.

확인 및 git 업로드