iixanx / triggers_report

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Triggers_Report

(주)트리거스 입사 과제 진행을 위해 제작한 레포지토리입니다.

소스 코드 중 루트 경로의 triggers.erd.drawio에서 ERD를 확인할 수 있습니다.

목차 Contents table

각 제목을 클릭할 경우 곧바로 해당 파트로 이동이 가능합니다.

  1. 설계 의도
  2. 기능 설명
    1. 인증 도메인
    2. 단어장 도메인
    3. 퀴즈 도메인
    4. 오답노트 도메인
    5. 관리자 도메인
  3. 실행 방법

설계 의도

기술 문서에 적힌 기획에 더해 확장성 있고 단단한 구조를 지향하여 구성하였습니다.
OOP와 AOP를 함께 도입하였으며, DI / IoC를 적극적으로 활용하였습니다.
이를 통해 코드의 확장 및 변경, 테스팅 등에서 효율성을 추구하였습니다.

winston logger를 사용하여 편리하고 확장성 있는 로깅 시스템을 구축하였습니다. swagger docs를 활용하여 가독성 좋은 API 문서를 작성하였습니다. Repository Pattern을 활용하여 SQL 처리 로직을 분리하였습니다.

기능 설명

도메인 별로 기능을 설명합니다.
각각의 리스트를 클릭할 경우 상세 요청 및 응답 객체에 대한 설명이 나옵니다.

인증 도메인 ("/auth")

사용자 회원가입, 로그인, 회원탈퇴 등을 지원합니다.
  • POST /signup

    회원가입입니다.
    입력값에 맞추어 새로운 계정을 생성합니다.

    Request

    위치 제약 조건
    Body email
  • Type: String
  • Unique Value
  • Not Null
  • Length: 5 ~ 50
  • password
  • Type: String
  • Not Null
  • Length: 8 ~ 50
  • Response

    응답 코드 코드명 발생하는 경우 응답값
    201 Created 입력값을 제약조건에 맞게 입력한 경우
    제약조건
    id
  • Type: Number
  • Not Null
  • Auto Increment
  • 400 Bad Request 제약조건에 일치하지 않는 입력값
    409 Conflict 이미 존재하는 아이디
    500 Internal Server Error 서버 처리 오류
  • POST /signin

    로그인 기능입니다.
    올바른 아이디와 비밀번호를 입력하면 로그인에 성공하여 특정 계정에 접속할 수 있습니다.

    Request

    위치 제약 조건
    Body email
  • Type: String
  • Not Null
  • password
  • Type: String
  • Not Null
  • Response

    응답 코드 코드명 발생하는 경우 응답값
    200 OK 올바른 아이디와 비밀번호로 성공적으로 로그인한 경우
    제약 조건
    access_token
  • Type: String
  • Not Null
  • Bearer Token
  • refresh_token
  • Type: String
  • Not Null
  • Bearer Token
  • 400 Bad Request 비밀번호가 일치하지 않는 경우
    404 Not Found 아이디에 해당하는 계정을 찾을 수 없는 경우
    500 Internal Server Error 서버 처리 오류
  • DELETE /unsub

    회원탈퇴입니다.
    로그인한 상태에서 올바른 비밀번호를 입력하면 해당 계정을 영구히 삭제합니다.

    Request

    위치 제약 조건
    Header authorization
  • Type: String
  • Not Null
  • Access Token을 입력받습니다
  • Bearer Token 형식
  • Body password
  • 계정의 비밀번호를 입력
  • Response

    응답 코드 코드명 발생하는 경우 응답값
    204 No Content 성공적으로 계정을 삭제한 경우
    제약조건
    401 Unauthorized Header의 authorization을 입력받지 못한 경우
    403 Forbidden JWT 토큰 계정과 비밀번호가 일치하지 않는 경우
    404 Not Found 존재하지 않는 계정에 접근 시도
    500 Internal Server Error 서버 처리 오류
  • GET /refresh

    리프레시 토큰으로 액세스 토큰을 재발급받습니다.

    Request

    위치 제약조건
    Header authorization
  • Type: String
  • Not Null
  • Refresh Token을 입력
  • Bearer Token
  • Response

    응답 코드 코드명 발생하는 경우 응답값
    200 OK Access Token을 성공적으로 재발급받음
    제약조건
    accessToken
  • Type: String
  • Not Null
  • Bearer Token
  • refreshToken
  • Type: String
  • Not Null
  • Bearer Token
  • 400 Bad Request authorization이 비어 있거나 Bearer Token 형식이 아닌 경우
    401 Unauthorized authorization이 유효하지 않을 경우
    404 Not Found 존재하지 않는 계정에 대해 토큰 발급 요청
    500 Internal Server Error 서버 처리 오류

단어장 도메인 ("/word")

유저는 단어장에 단어를 조회, 삭제, 수정, 등록 할 수 있습니다. 예시) apple 사과
  • POST /new

    단어장에 단어를 추가합니다.
    영단어와 한글 뜻을 입력할 수 있습니다.

    Request

    위치 제약조건
    Header authorization
  • Type: String
  • Not Null
  • Access Token을 입력받습니다
  • Bearer Token 형식
  • Body word
  • Type: String
  • Not Null
  • 영어 대소문자
  • mean
  • Type: String
  • Not Null
  • Response

    응답 코드 코드명 발생하는 경우 응답값
    201 Created 올바른 값을 입력하여 요청에 성공한 경우
    제약 조건
    word_id
  • Type: Number
  • Not Null
  • 400 Bad Request 입력값이 제약조건에 맞지 않는 경우
    401 Unauthorized Header의 authorization이 유효하지 않은 경우
    409 Conflict 중복 단어를 추가하는 경우
    500 Internal Server Error 서버 처리 오류
  • GET /list

    단어장의 단어 리스트를 조회합니다.
    한 페이지 당 단어를 10개씩 조회할 수 있으며, 페이지는 0 또는 자연수입니다.

    Request

    위치 제약조건
    Header authorization
  • Type: String
  • Not Null
  • Access Token을 입력받습니다
  • Bearer Token 형식
  • Query page
  • Type: Number
  • Nullable (Default : 0)
  • 0 <= page인 자연수
  • Response

    응답 코드 코드명 발생하는 경우 응답값
    200 OK 성공적으로 조회한 경우
    제약 조건
    words
    제약 조건
    word_id
  • Type: Number
  • Not Null
  • 0 <= word_id인 자연수
  • word
  • Type: String
  • Not Null
  • A-Za-z의 정규식을 따르는 문자열
  • mean
  • Type: String
  • Not Null
  • word에 해당하는 단어의 뜻
  • 400 Bad Request page 쿼리의 값이 Numeric하지 않은 경우
    401 Unauthorization Header의 authorization이 유효하지 않은 경우
    404 Not Found 페이지에 해당하는 단어가 없을 경우
    500 Internal Server Error 서버 처리 오류
  • GET /rand

    단어장의 단어를 랜덤으로 조회합니다.

    Request

    위치 제약조건
    Header authorization
  • Type: String
  • Not Null
  • Access Token을 입력합니다
  • Bearer Token
  • Response

    응답 코드 코드명 발생하는 경우 응답값
    200 OK 조회에 성공하는 경우
    제약 조건
    word_id
  • Type: Number
  • Not Null
  • 0 <= word_id인 자연수
  • word
  • Type: String
  • Not Null
  • A-Za-z의 정규식을 따르는 문자열
  • mean
  • Type: String
  • Not Null
  • word에 해당하는 단어의 뜻
  • 401 Unauthorization authorization이 유효하지 않은 경우
    500 Internal Server Error 서버 처리 오류
  • GET /:word_id

    단어장에 있는 단어를 조회합니다.

    Request

    위치 제약조건
    Header authorization
  • Type: String
  • Not Null
  • Access Token을 입력합니다
  • Bearer Token 형식
  • Param word_id
  • Type: Number
  • Not Null
  • 0 <= word_id인 자연수
  • Response

    응답 코드 코드명 발생하는 경우 응답값
    200 OK 조회에 성공하는 경우
    제약 조건
    word_id
  • Type: Number
  • Not Null
  • 0 <= word_id인 자연수
  • word
  • Type: String
  • Not Null
  • A-Za-z의 정규식을 따르는 문자열
  • mean
  • Type: String
  • Not Null
  • word에 해당하는 단어의 뜻
  • 400 Bad Request word_id 파라미터의 값이 Numeric하지 않은 경우
    401 Unauthorized authorization의 값이 유효하지 않은 경우
    404 Not Found 자신의 단어장에 등록되지 않은 단어 아이디
    500 Internal Server Error 서버 처리 오류
  • PATCH /:word_id

    단어장에 등록된 단어를 수정합니다.

    Request

    위치 제약조건
    Header authorization
  • Type: String
  • Not Null
  • Access Token을 입력합니다
  • Bearer Token 형식
  • Param word_id
  • Type: Number
  • Not Null
  • 0 <= word_id인 자연수
  • Body word
  • Type: String
  • Nullable (json 상에서 누락 가능 / null 금지)
  • A-Za-z의 정규식을 따르는 문자열
  • mean
  • Type: String
  • Nullable (json 상에서 누락 가능 / null 금지)
  • Response

    응답 코드 코드명 발생하는 경우 응답값
    200 OK 조회에 성공하는 경우
    제약 조건
    word_id
  • Type: Number
  • Not Null
  • 0 <= word_id인 자연수
  • word
  • Type: String
  • Not Null
  • A-Za-z의 정규식을 따르는 문자열
  • mean
  • Type: String
  • Not Null
  • word에 해당하는 단어의 뜻
  • 400 Bad Request 파라미터 / 요청 바디의 제약조건 위반
    401 Unauthorized authorization의 값이 유효하지 않은 경우
    404 Not Found 단어장에 등록되지 않은 단어의 아이디로 요청
    500 Internal Server Error 서버 처리 오류
  • DELETE /:word_id

    Request

    위치 제약조건
    Header authorization
  • Type: String
  • Not Null
  • Access Token을 입력
  • Bearer Token
  • Response

    응답 코드 코드명 발생하는 경우 응답값
    204 No Content 성공적으로 해당 단어를 단어장에서 삭제
    제약 조건
    400 Bad Request word_id 파라미터가 Numeric하지 않은 경우
    401 Unauthorized authorization의 값이 유효하지 않은 경우
    404 Not Found 단어장에 해당 아이디의 단어가 없음
    500 Internal Server Error 서버 처리 오류

퀴즈 도메인 ("/quiz")

2. 유저는 퀴즈를 조회 할 수 있습니다. 조회 시, 단어장에서 4지선다 형식의 문제가 랜덤으로 출제됩니다.
3. 유저는 조회한 퀴즈를 풀 수 있습니다. 풀이 제출 시, 정답 결과를 바로 볼 수 있습니다.
3-1. (개인적 추가) 퀴즈를 맞출 경우 골드를 획득할 수 있습니다. 골드는 1회당 2~13 사이의 양을 무작위로 받아갈 수 있습니다.
3-2. (개인적 추가) 퀴즈를 틀릴 경우 해당 문제는 오답 처리되며, "오답 노트"에 추가됩니다.
  • GET /rand

    랜덤으로 퀴즈를 조회합니다.
    단어는 사용자의 단어장에서 출제됩니다.

    Request

    위치 제약조건
    Header authorization
  • Type: String
  • Not Null
  • Access Token을 입력
  • Bearer Token
  • Response

    응답 코드 코드명 발생하는 경우 응답값
    200 OK 조회에 성공한 경우
    제약 조건
    word_id
  • Type: Number
  • Not Null
  • 0 <= word_id인 자연수
  • word
  • Type: String
  • Not Null
  • A-Za-z의 정규식을 따르는 문자열
  • means
  • Type: Array < Object >
  • Not Null
  • Length : 4 (고정값)
  • 제약 조건
    word_id
  • Type: Number
  • Not Null
  • 0 <= word_id인 자연수
  • mean_id
  • Type: Number
  • Not Null
  • 0 <= mean_id인 자연수
  • mean
  • Type: String
  • Not Null
  • 단어의 뜻
  • 401 Unauthorized authorization의 값이 유효하지 않을 경우
    500 Internal Server Error 서버 처리 오류
  • POST /rand

    단어 문제를 풀이합니다.

    Request

    위치 제약조건
    Header authorization
  • Type: String
  • Not Null
  • Access Token을 입력
  • Bearer Token
  • Query word_id
  • Type: Number
  • Not Null
  • 0 <= word_id인 자연수
  • Body mean_id
  • Type: Number
  • Not Null
  • 0 <= select인 자연수
  • Response

    응답 코드 코드명 발생하는 경우 응답값
    200 OK 요청이 성공적으로 전송된 경우
    제약조건
    is_correct
  • Type: Boolean
  • Not Null
  • word
  • Type: String
  • Not Null
  • mean
  • Type: String
  • Not Null
  • earned_coins
  • Type: Number
  • Not Null
  • Min: 7 (when wrong then 0), Max: 13
  • 400 Bad Request word_id 파라미터가 Numeric하지 않거나 body의 mean_id가 Number가 아닌 경우
    401 Unauthorized authorization의 값이 유효하지 않은 경우
    404 Not Found 단어 아이디가 단어장에 등록되지 않은 경우
    500 Internal Server Error 서버 처리 오류

(개인적 추가) 오답 노트 도메인 ("/wrong")

4. 오답 노트는 사용자가 퀴즈에서 틀린 단어들을 모아둔 도메인입니다.
해당 도메인에서 (틀린 횟수) × 2회만큼 퀴즈를 맞추면 해당 단어는 오답 노트에서 제외됩니다.
추가로, 오답 노트 도메인에서 맞춘 퀴즈의 경우 1 ~ 7코인을 무작위로 얻을 수 있습니다.
  • GET /rand

    틀린 단어 중 무작위로 퀴즈를 조회합니다.
    4개의 보기가 제공됩니다.

    Request

    위치 제약조건
    Header authorization
  • Type: String
  • Not Null
  • Access Token을 입력
  • Bearer Token
  • Response

    응답 코드 코드명 발생하는 경우 응답값
    200 OK 올바른 요청으로 조회에 성공한 경우
    제약 조건
    word_id
  • Type: Number
  • Not Null
  • 0 <= word_id인 자연수
  • word
  • Type: String
  • Not Null
  • means
  • Type: Array < Object >
  • Not Null
  • Length : 4 (고정값)
  • 제약조건
    mean_id
  • Type: Number
  • Not Null
  • 0 <= mean_id인 자연수
  • mean
  • Type: String
  • Not Null
  • 401 Unauthorized authorization의 값이 유효하지 않은 경우
    500 Internal Server Error 서버 처리 오류
  • GET /list

    오답노트에 있는 단어들을 모아볼 수 있습니다.
    페이지 당 단어는 10개씩 제공됩니다.

    Request

    위치 제약조건
    Header authorization
  • Type: String
  • Not Null
  • Access Token을 입력
  • Bearer Token
  • Query page
  • Type: Number
  • Nullable (Default: 0)
  • 0 <= page인 자연수
  • Response

    응답 코드 코드명 발생하는 경우 응답값
    200 OK 조회에 성공한 경우
    제약조건
    words
  • Type: Array < Object >
  • Nullable
  • Max Length : 10
  • 제약조건
    word_id
  • Type: Number
  • Not Null
  • 0 <= word_id인 자연수
  • word
  • Type: String
  • Not Null
  • mean
  • Type: String
  • Not Null
  • 400 Bad Request page의 값이 Numeric하지 않은 경우
    401 Unauthorized authorization의 값이 올바르지 않을 경우
    404 Not Found (page 파라미터 + 1) × 10 − 10 + 1개만큼의 단어가 존재하지 않는 경우
    500 Internal Server Error 서버 처리 오류
  • GET /:word_id

    오답노트에 있는 단어를 조회합니다.

    Request

    위치 제약조건
    Header authorization
  • Type: String
  • Not Null
  • Access Token을 입력
  • Bearer Token
  • Param word_id
  • Type: Number
  • Not Null
  • Response

    응답 코드 코드명 발생하는 경우 응답값
    200 OK 조회에 성공하는 경우
    제약조건
    word_id
  • Type: Number
  • Not Null
  • 0 <= word_id인 자연수
  • word
  • Type: String
  • Not Null
  • mean
  • Type: String
  • Not Null
  • 400 Bad Request word_id의 타입이 Number가 아닌 경우 또는 음수인 경우
    401 Unauthorized authorization의 값이 유효하지 않은 경우
    404 Not Found 오답 노트에 등록되지 않은 단어의 아이디
    500 Internal Server Error 서버 처리 오류
  • POST /:word_id

    랜덤으로 조회한 오답노트 내의 문제를 풀이합니다.
    정답을 (해당 단어 문제를 틀린 횟수) × 2회만큼 맞출 경우 해당 단어는 오답 노트에서 제외됩니다.

    Request

    위치 제약조건
    Header authorization
  • Type: String
  • Not Null
  • Access Token을 입력
  • Bearer Token
  • Param word_id
  • Type: Number
  • Not Null
  • 0 <= word_id인 자연수
  • Body mean_id
  • Type: Number
  • Not Null
  • 0 <= mean_id인 자연수
  • Response

    응답 코드 코드명 발생하는 경우 응답값
    200 OK 요청에 성공한 경우
    제약조건
    is_correct
  • Type: Boolean
  • Not Null
  • word
  • Type: String
  • Not Null
  • mean
  • Type: String
  • Not Null
  • earned_coins
  • Type: Number
  • Not Null
  • Min: 0, Max: 7
  • 400 Bad Request word_id의 타입이 Number가 아닌 경우 또는 음수인 경우
    401 Unauthorized authorization의 값이 유효하지 않은 경우
    404 Not Found 오답노트에 등록되지 않은 단어의 아이디
    500 Internal Server Error 서버 처리 오류

관리자 도메인 ("/admin")

관리자는 관리자 페이지에 로그인 할 수 있습니다. 관리자는 유저 리스트와, 유저의 단어장을 볼 수 있습니다. 관리자는 유저가 푼 퀴즈 리스트와, 결과를 볼 수 있습니다.
  • GET /users

    사용자 목록을 확인할 수 있습니다.
    페이지 당 최대 10명까지 조회 가능합니다.

    Request

    위치 제약조건
    Header authorization
  • Type: String
  • Not Null
  • Access Token을 입력
  • Bearer Token
  • Query page
  • Type: Number
  • Nullable (Default : 0)
  • 0 <= page인 자연수
  • Response

    응답 코드 코드명 발생하는 경우 응답값
    200 OK 올바른 입력으로 요청에 성공하는 경우
    제약조건
    users
  • Type: Array < Object >
  • Not Null
  • Length : 0 ~ 10
  • 제약조건
    user_id
  • Type: Number
  • Not Null
  • 0 <= user_id인 자연수
  • name
  • Type: String
  • Not Null
  • email
  • Type: String
  • Not Null
  • Email 형식 필요
  • coin
  • Type: Number
  • Not Null (Default 0)
  • 0 <= coin인 자연수
  • 400 Bad Request page 쿼리 파라미터가 Numeric하지 않을 경우
    401 Unauthorized authorization 값이 유효하지 않은 경우
    403 Forbidden 인증 대상자의 사용자 정보에서 is_admin이 false인 경우 (관리자 권한 없는 사용자의 접근)
    404 Not Found (page 파라미터 + 1) × 10 − 10 + 1개만큼의 단어가 존재하지 않는 경우
    500 Internal Server Error 서버 처리 오류
  • GET /words

    특정 사용자의 단어장을 조회할 수 있습니다.
    페이지 당 최대 10개의 단어를 조회할 수 있습니다.

    Request

    위치 제약조건
    Header authorization
  • Type: String
  • Not Null
  • Access Token을 입력
  • Bearer Token
  • Query user_id
  • Type: Number
  • Not Null
  • 0 <= user_id인 자연수
  • page
  • Type: Number
  • Nullable (Default : 0)
  • 0 <= page인 자연수
  • Response

    응답 코드 코드명 발생하는 경우 응답값
    200 OK 올바른 입력으로 요청에 성공하는 경우
    제약조건
    words
  • Type: Array < Object >
  • Nullable
  • Max Length : 10
  • 제약조건
    word_id
  • Type: Number
  • Not Null
  • 0 <= word_id인 자연수
  • word
  • Type: String
  • Not Null
  • A-Za-z의 정규식을 따르는 문자열
  • mean
  • Type: String
  • Not Null
  • 400 Bad Request user_id 또는 page 쿼리 파라미터가 Numeric하지 않음
    401 Unauthorized authorization의 값이 유효하지 않은 경우
    403 Forbidden 인증 대상자의 사용자 정보에서 is_admin이 false인 경우 (관리자 권한 없는 사용자의 접근)
    404 Not Found (page 파라미터 + 1) × 10 − 10 + 1개만큼의 단어가 존재하지 않는 경우
    500 Internal Server Error 서버 처리 오류
  • GET /results

    특정 사용자가 푼 퀴즈와 결과가 포함된 리스트를 조회합니다.

    Request

    위치 제약조건
    Header authorization
  • Type: String
  • Not Null
  • Access Token을 입력
  • Bearer Token
  • Query user_id
  • Type: Number
  • Not Null
  • 0 <= user_id인 자연수
  • page
  • Type: Number
  • Nullable (Default : 0)
  • 0 <= page인 자연수
  • Response

    응답 코드 코드명 발생하는 경우 응답값
    200 OK 올바른 입력으로 요청에 성공하는 경우
    제약조건
    quizzes
  • Type: Array < Object >
  • Nullable
  • Max Length : 10
  • 제약조건
    word_id
  • Type : Number
  • Not Null
  • 0 <= word_id인 자연수
  • word
  • Type : String
  • Not Null
  • A-Za-z의 정규식을 따름
  • mean
  • Type : String
  • Not Null
  • has_correct
  • Type : Boolean
  • Not Null
  • earned_coin
  • Type : Number
  • Not Null
  • Min : 0, Max : 13
  • 400 Bad Request user_id 또는 page 쿼리 파라미터가 Numeric하지 않음
    401 Unauthorized authorization의 값이 유효하지 않은 경우
    403 Forbidden 인증 대상자의 사용자 정보에서 is_admin이 false인 경우 (관리자 권한 없는 사용자의 접근)
    404 Not Found (page 파라미터 + 1) × 10 − 10 + 1개만큼의 단어가 존재하지 않는 경우
    500 Internal Server Error 서버 처리 오류

실행 방법

실행 환경

  • Node Version >= 18.19.0
  • npm version >= 10.2.4
  • pnpm version >= 8.15.1

실행 명령어

npm i pnpm -g # pnpm install

pnpm i # dependency install
pnpm build # 빌드

pnpm start:dev # Develop mode 실행

pnpm start:prod # Production mode 실행

About


Languages

Language:TypeScript 99.1%Language:JavaScript 0.9%