프로그래머스 데브코스TIL

[week4] 백엔드 기초 : Node.js + Express 기본 (9)

이규현2026-01-28
[week4] 백엔드 기초 : Node.js + Express 기본 (9)

로그인 API 구현

API 설계

  • requset : body (id,pwd)
  • response : ${name}님 반갑습니다.
  • http status
    • success (아이디, 비밀번호 일치) -> (200)
    • fail (아이디 혹은 비밀번호 불일치) -> (400)

코드 구현

app.post("/login", (req, res) => {
  const { user_id, pwd } = req.body;
  let loginUser = null;

  db.forEach((user) => {
    if (user.user_id === user_id) {
      loginUser = user;
    }
  });
  if (loginUser) {
    if (loginUser.pwd == pwd) {
      res.status(200).json({
        message: `${loginUser.name}님 반갑습니다.`,
      });
    } else {
      res.status(400).json({
        message: "비밀번호를 다시 확인해보세요.",
      });
    }
  } else {
    res.status(400).json({
      message: "아이디를 다시 확인해보세요.",
    });
  }
});

빈 객체 확인 방법

  • 객체를 비교할 때 가장 먼저 이해해야 할 개념 -> 메모리 주소
    • 값 비교 숫자나 문자열은 값 자체가 같으면 true
    • 참조 비교 객체는 생성될 때마다 메모리의 새로운 공간(주소)에 저장
    • 결론 req.body == {}라고 쓰면, 기존에 있던 body 객체와 방금 새로 만든 빈 객체 {}의 주소를 비교. 두 객체는 주소가 다르기 때문에 내부가 비어있어도 항상 false가 반환

Object.keys()

  • 주소가 아닌 '내용물'을 확인하기 위해 Object.keys()를 사용

  • 데이터 타입에 따라 결과가 달라지는 점을 주의

    • 문자열 (String) 자바스크립트는 문자열을 글자들의 나열로 봄, 따라서 각 글자의 순서(인덱스)를 '키(Key)'로 취급합니다. 글자가 있다면 키가 있는 것이므로 false(안 비어있음)가 나옴
    • 숫자 (Number) 숫자는 객체로 변환되어도 내부를 쪼갤 수 있는 키가 없음, 따라서 값이 1이든 100이든 키의 개수는 0이 되어 true(비어있음)가 나옴
    • 객체 (Object) 중괄호 안의 실제 속성 개수를 반환
  • 예제 코드

const obj1 = {};
const obj2 = { message: "안 빔" };

const str = "1";
const num = 1;

const str1 = "one";
const str2 = "";

console.log(Object.keys(obj1).length === 0); // true (빈 객체)
console.log(Object.keys(obj2).length === 0); // false (데이터 있음)

console.log(Object.keys(str).length === 0); // false : 문자열은 객체이다.
console.log(Object.keys(num).length === 0); // true  : 숫자는 객체가 아니다.

console.log(Object.keys(str1).length === 0); // false
console.log(Object.keys(str2).length === 0); // true

console.log(isEmpty(str1)); // str1은 "one"이므로 인덱스(0, 1, 2)라는 키가 존재함 -> 비어있지 않음(false)
console.log(isEmpty(str2)); // str2는 ""이므로 뽑아낼 키가 없음 -> 비어있음(true)으로 간주

function isEmpty(obj) {
  if (Object.keys(obj).length === 0) {
    return true;
  } else {
    return false;
  }
}

로그인 API 고도화 - Object.keys()

  • 전체 필드가 빈 경우, 아이디 필드가 빈 경우, 비밀번호 필드가 빈 경우에 대하여 Object.keys()를 활용하여 고도화

  • isEmpty() 함수 추가

// 1.1 Object.keys() 사용을 위해 isEmpty 함수 추가
function isEmpty(obj) {
  // 객체 안에 이름표(Key)가 하나도 없으면 true(비어있음)를 반환
  if (Object.keys(obj).length === 0) {
    return true;
  }
  return false;
}
  • 빈 필드 확인
// 필드가 비었는지 확인
if (isEmpty(req.body)) {
  return res.status(400).json({
    message: "입력된 정보가 없습니다. 아이디와 비밀번호를 입력해주세요.",
  });
}

if (!user_id) {
  return res.status(400).json({
    message: "아이디를 입력해주세요.",
  });
}

if (!pwd) {
  return res.status(400).json({
    message: "비밀번호를 입력해주세요.",
  });
}

로그인 API 전체 코드

// 1. 로그인
app.post("/login", (req, res) => {
  const { user_id, pwd } = req.body;

  // 필드가 비었는지 확인
  if (isEmpty(req.body)) {
    return res.status(400).json({
      message: "입력된 정보가 없습니다. 아이디와 비밀번호를 입력해주세요.",
    });
  }

  if (!user_id) {
    return res.status(400).json({
      message: "아이디를 입력해주세요.",
    });
  }

  if (!pwd) {
    return res.status(400).json({
      message: "비밀번호를 입력해주세요.",
    });
  }

  // 아이디, 비밀번호가 일치한지 확인
  let loginUser = null;

  db.forEach((user) => {
    if (user.user_id === user_id) {
      loginUser = user;
    }
  });
  if (loginUser) {
    if (loginUser.pwd == pwd) {
      res.status(200).json({
        message: `${loginUser.name}님 반갑습니다.`,
      });
    } else {
      res.status(400).json({
        message: "비밀번호를 다시 확인해보세요.",
      });
    }
  } else {
    res.status(400).json({
      message: "아이디를 다시 확인해보세요.",
    });
  }
});

// 1.1 Object.keys() 사용을 위해 isEmpty 함수 추가
function isEmpty(obj) {
  // 객체 안에 이름표(Key)가 하나도 없으면 true(비어있음)를 반환
  if (Object.keys(obj).length === 0) {
    return true;
  }
  return false;
}