TIL

내일배움캠프 5주차 화요일 TIL

news0516 2024. 11. 26. 21:03

금일 작업 중 회원가입 API를 작성하고, 서버를 연후 인섬니아에서 입력값을 제대로 받는지 테스트하였다.

{
        "email" : "dbeodnjs1001@naver.com",
        "password" : "sfzeho2gy",
        "name" : "유대원",
        "age" : 26,
        "gender": "male"
}


해당 내용을 인섬니아 바디에 넣고 포스트하였을 때, 서버가 꺼지면서 DATABASE_URL을 제대로 읽어오지 못한다는 오류메시지가 표시되었다. env 파일에  DATABASE_URL은 양식대로 잘 적었고, DB와의 연결도 문제 없었기 때문에 튜터님의 도움을 받아 진행하였다.


피드백 결과는 DATABASE_URL을 담고있는 파일이 app.js이 있는 src폴더 외부에 존재하고 있어, 코드 문제가 없었음에도 DATABASE_URL을 제대로 불러오지 못했다. 터미널의 PS C:\Itemsimul/src> 에서 app.js를 실행하고 있었기 때문이다;
 
시작점은 packege.json이 위치한다는 것을 배웠고 PS C:\Itemsimu>  node src/app.js 로 입력하여 실행하거나,

"scripts" : {
    "dev" : "node src/app.js"
  },

스크립트를 설정하여  PS C:\Itemsimul> npm run dev를 입력하여 실행할 수 있다

그후 다시 테스트하였다.

테스트 성공!


회원가입 API에서는 해당 조건에 따라 계정이 생성되어야 한다.

  • 아이디: 다른 사용자와 중복될 수 없으며 오로지 영어 소문자 + 숫자 조합으로 구성이 되어야 합니다.
  • 비밀번호: 최소 6자 이상이며, 비밀번호 확인과 일치해야 합니다.


해당 아이디, 비번 구성 조건을 검사하기 위해 입력된 아이디, 패스워드를 배열로 만든 후 아이디는 find 메서드를 통해 소문자, 숫자가 있는지 확인하는 로직, 비번은 배열로 만든 후 배열 길이를 조건으로 추가하여 로직을 짜야하나? 라고 초보적인 생각을 해봤지만 코드 길이가 감당되지 않을거 같아 다른 방법을 찾아보았다.

찾아본 결과 정규표현식으로 id와 password의 양식을 결정한 후 그 양식에 맞지 않은 입력값이 들어왔을 때 오류 메시지를 출력하는 것이 적절해보였다.
위 조건을 정규표현식으로 표현하는 방법을 웹검색을 통해 찾은 결과
id는 /^[a-z0-9]+$/ , password는 /^.{1,6}$/으로 위 조건을 표현할 수 있었다.

import express from 'express';
import { prisma } from '../utils/prisma/index.js';
import bcrypt from 'bcrypt';

const router = express.Router();

/** 사용자 회원가입 API **/
// localhost:c/api/sign-up POST
router.post('/sign-up', async (req, res) => {
  const { email, id, password, name, age, gender } = req.body;

  // 이메일 중복 체크
  const isExistEmail = await prisma.accounts.findUnique({
    where: { email },
  });

  if (isExistEmail) {
    return res.status(409).json({ message: '이미 존재하는 이메일입니다.' });
  }

  const isExistId = await prisma.accounts.findUnique({
    where: { id },
  });

  if (isExistId) {
    return res.status(409).json({ message: '이미 존재하는 id입니다.' });
  }

  const idForm = /^[a-z0-9]+$/;
  if (!idForm.test(id)) {
    return res.status(409).json({ message: 'id는 영어(소문자)와 숫자로만 설정해야 합니다' });
  }

  const passwrodForm = /^.{1,6}$/;
  if (!passwrodForm.test(password)) {
    return res.status(409).json({ message: 'password는 6자리 이하로만 설정할 수 있습니다' });
  }

  const hashedPassword = await bcrypt.hash(password, 10);

  // 사용자 정보를 Accounts 테이블에 추가
  const newAccount = await prisma.accounts.create({
    data: {
      email,
      id,
      password: hashedPassword,
      name,
      age,
      gender: gender.toUpperCase(),
    },
  });

  return res
    .status(201)
    .json({ message: '회원가입이 완료되었습니다.', account_id: newAccount.account_id });
});

export default router;


다만 인섬니아를 통해 테스트했을 때, 비밀번호는 검증이 되지만 아이디 검증은 잘 진행되지 않는다.
내일 튜터님께 문의할 예정(아이디 검증, 포스트한 값이 db에 저장이 되고 있는건지)