[TIL] 24.09.13 FRI

GDORI·2024년 9월 13일
0

TIL

목록 보기
40/79
post-thumbnail

오늘 푼 알고리즘 코드카타

70129. 이진 변환 반복하기

정규식 유창하게 쓰고 싶다..😥

전부터 문자열 관련 코드카타를 풀다보면 난 몇줄 이상의 코드를 써야하지만, 다른사람 코드를 봤을 때 한줄로 끝나는 것을 보고
허무함을 느낀적이 많았다.
바로 정규식이다..
회원가입 시 이메일 형식에 대하여 검증을 할 때 정규식을 사용하였다.
물론 저번 과제때도 사용했지만, 인터넷에서 그냥 가져다가 쓰는 것 보다도 어떤 역할을 하는지 다시 한번 집고 넘어가는게
남는거라 생각해서 기록해본다..

/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/

/^ $/
정규식의 처음과 끝을 의미한다.
[a-zA-Z0-9._%+-]+
들어갈 수 있는 형식이 a-z , A-Z, 0-9 , _ , %, +, - 라는 뜻이고 +는 하나 이상이 입력이 되어야 한다라는 뜻이다.
{2,} 2글자 이상 입력이 되어야 할 때 사용한다.

정규식 예시

const validEmail = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/;
const email = "test@naver.com";
if(validEmail.test(email)) console.log("ㅇㅇ 형식 맞음"); // ㅇㅇ 형식 맞음이 출력된다.

팀프로젝트 시작 🤮

개인 과제가 끝나자마자.. 팀 프로젝트가 시작되었다.

풋살게임 백엔드 서버 구현

24.09.13 ~ 24.09.16 필수 목록 구현
24.09.19 ~ 24.09.25 도전 목록 구현

필수 구현 목록

  1. 회원가입 / 로그인 기능
  2. 캐시 구매 기능
  3. 선수 데이터 준비
  4. 선수 뽑기 기능
  5. 나만의 팀 꾸리기 기능
  6. 축구 게임 기능

도전 구현 목록

  1. 승리/패배 시 게임 점수 조정 기능
  2. 유저 랭킹 조회 기능
  3. 점수 기반 자동 매치 메이킹 기능
    ⭐ 스페셜 : 선수 강화 기능

팀원 4명이서 필수구현 역할을 분담하여 작업하기로 했고, 본인은 전 과제 활용할 수 있는 1,2,3 을 맡게 되었다.
기존 코드에서 조금만 손보면 바로 연동 가능한 상태라 필수 구현 목록 역할에서 파생하여 별도의 라우터를
좀 더 구현 해야겠다.

선수 데이터의 경우 이름, 스탯을 무작위로 돌려서 SQL에 직접 주입했다.

ERD

시작 전 회의를 통해 DB를 우선적으로 설계하고 시작하였고 큰 프로젝트가 아니기 때문에 테이블을 최대한 줄여서 작업.

API 명세서

회원가입 API


router.post('/auth/sign-up', async (req, res, next) => {
    const {
        body: { email, password, name }, // body에서 필요한 데이터 추출
    } = req;
    const validEmail = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/; // 유효한 이메일 형식

    try {
        // 데이터베이스에서 userId에 해당하는 사용자가 있는지 확인
        const isExistUser = await prisma.users.findFirst({
            where: { email },
        });

        // 이메일이 이미 존재하는 경우
        if (isExistUser) {
            return res.status(409).json({
                errorMessage: '이미 존재하는 이메일 입니다.',
            });
        }

        // 아이디 형식이 소문자와 숫자의 조합이 아닌 경우
        if (!validEmail.test(email)) {
            return res.status(400).json({
                errorMessage: '이메일 형식이 아닙니다.',
            });
        }

        // 비밀번호 길이가 6자리 미만인 경우
        if (password.length < 6) {
            return res.status(400).json({
                errorMessage: '비밀번호는 최소 6자리 이상만 가능합니다.',
            });
        }

        const hashedPw = await bcrypt.hash(password, 10); // 비밀번호 해시화

        // 유저 정보 Database 등록
        const user = await prisma.Users.create({
            data: { email, password: hashedPw, name }, // 새로운 사용자 생성
        });

        return res.status(201).json({
            data: {
                userID: user.userID, // 생성된 사용자 번호 반환
                email: user.email, // 생성된 사용자 아이디 반환
                name: user.name, // 생성된 사용자 이름 반환
            },
        });
    } catch (err) {
        console.error(err);
        next(err); // 에러 발생 시 다음 미들웨어로 전달
    }
});

로그인 API

router.post('/auth/sign-in', async (req, res, next) => {
    const {
        body: { email, password }, // Body에서 userId와 userPw 추출
    } = req;
    try {
        // 데이터베이스에서 userId에 해당하는 사용자가 있는지 확인
        const isExistUser = await prisma.users.findFirst({
            where: { email },
        });

        // 사용자가 존재하지 않는 경우
        if (!isExistUser) {
            return res.status(400).json({
                errorMessage: '없는 아이디 입니다.',
            });
        }

        // 비밀번호가 틀린 경우
        if (!(await bcrypt.compare(password, isExistUser.password))) {
            return res.status(401).json({
                errorMessage: '틀린 비밀번호 입니다.',
            });
        }
        const token = jwt.sign({ userID: isExistUser.userID }, SECRET_CODE); // JWT 토큰 생성
        res.setHeader('Authorization', `Bearer ${token}`); // 응답 헤더에 토큰 설정
        return res
            .status(200)
            .json({ message: '로그인 성공, 헤더에 토큰값이 반환되었습니다.' }); // 성공 메시지 반환
    } catch (err) {
        console.error(err);
        next(err); // 에러 발생 시 다음 미들웨어로 전달
    }
});
profile
하루 최소 1시간이라도 공부하자..

0개의 댓글