Skip to content

주식회사 하이 - Admin용 데이터 관리 프로그램 만들기

Notifications You must be signed in to change notification settings

Jyoung706/pre-onboarding-2nd-haii

 
 

Repository files navigation

주식회사 하이 - Admin용 데이터 관리 프로그램 만들기

JavaScript Badge         

🏥 개요

원티드 프리온보딩 백엔드 코스 2차 과제 입니다.

전국치매센터표준데이터 JSON 데이터 파일을 데이터베이스에 저장하고 데이터를 조회해서 엑셀 파일로 다운로드하는 어플리케이션 입니다.

어플리케이션 기능을 이용하기 위한 회원가입 기능부터 데이터베이스 저장 및 조회, 엑셀 다운로드까지의 모든 프로세스를 구현했습니다.

  • 개발기간: 2022.10.07 - 2022.10.10 (3일)
  • 개발인원: 김윤희, 박정용, 오인환, 음정민(PM), 전준영 (5명)

🏥 프로젝트 실행 방법

  • 사전에 Git, node, MySQL이 설치되어있어야 합니다.
# 레포지토리 클론
$ git clone https://github.com/J-EUM/pre-onboarding-2nd-haii.git

# 접속
$ cd pre-onboarding-2nd-haii

# 패키지 설치
$ npm install

# 데이터베이스 생성
mysql> create database 데이터베이스명 character set utf8mb4 collate utf8mb4_general_ci; 

# .env파일 만들기
DATABASE_URL = mysql://계정:비밀번호@호스트주소:포트번호/데이터베이스명
TYPEORM_CONNECTION = mysql
TYPEORM_HOST = 호스트주소
TYPEORM_PORT = 포트번호
TYPEORM_USERNAME = 계정
TYPEORM_PASSWORD = 비밀번호
TYPEORM_DATABASE = 데이터베이스명
TYPEORM_LOGGING = TRUE
jwt_secret_key = 토큰용 시크릿키

# 데이터베이스 테이블 생성
$ npx dbmate up

# 프로젝트 실행
$ node server.js

# server start : http://localhost:8000

🏥 프로젝트 구조

DB모델링

image

🏥 구현 기능에 대한 소개

1. 회원가입 기능 (전준영)


  • 각 API 테스트 시 필요한 상세 이용 방법

    필수요청값 (이름, 계정, 이메일주소, 휴대폰번호, 비밀번호, 관리자여부), 담당지역코드 를 요청값으로 받습니다.

    ※ 사용자의 이름의 경우

    한글로 이루어져야하며 2~10자 이내로 설정했습니다.

    ※ 사용자의 계정의 경우

    영문과 숫자로 이루어져있으며 3~30자 이내로 설정했습니다.

    ※ 사용자의 email의 경우

    "@" 가 포함되어있어야하며 "." 이 포함되어있어야하도록 설정했습니다.

    ※ 사용자의 핸드폰번호의 경우

    "-"를 포함하지 않고 요청을 보냅니다. 앞자리는 01[0,6,7,8,9] 로 이루어져있어야하며 중간자리는 3자리 또는 4자리 숫자 끝자리는 4자리 숫자로 설정해두었습니다.

  1. 사용자의 계정,이메일,전화번호는 UNIQUE 설정이 되어있어 데이터가 중복되는경우에는 가입할 수 없습니다.

  2. 필수항목(이름,계정,이메일,전화번호,비밀번호,관리자여부)가 빈값일 경우 에러처리를 했습니다. 지역담당 코드의 경우 대표관리자는 해당 사항이 없기때문에 필수항목이 아니며 대표관리자는 빈값으로 요청을 보냅니다.

  3. 존재하지 않는 지역코드를 넣어 요청을 보낼경우 에러처리를 했습니다.

  4. 지역담당자의 경우 지역선택을 하지 않고 요청을보냈을 때 에러처리를 했습니다.

  • 기능 구현 시 어려웠던 점과 그에 대한 해결 방안을 모색하기 위해 노력한 점(특정 키워드를 가지고 검색했다, 공식 문서를 참조했다 등)

정규표현식을 이용한 유효성검사는 처음으로 해보았기 때문에 정규표현식을 알아보기위해 공식문서와 여러 기술블로그를 참조했습니다.
처음에 이해하는 데에는 오래걸렸지만 어느정도 내가 원하는 대로 정규표현식을 사용할 수 있게되었습니다.
swagger를 처음 사용해보았기 때문에 사용하는데에 힘들었지만 여러 기술블로그와 동기들이 작성한 코드를 토대로 설정을 해두고 api명세의 작성법의 경우에는 swagger editor 홈페이지를 사용하여 작성했습니다.
아직 익숙하지않아 에러코드의 경우 모두 400번으로 설정해두었는데 중복에러가 발생하여 401,2,3,4,5...로 설정하였습니다.

2. 로그인 기능 (박정용)


  • hearder에 authorization , req.body를 통하여 account, password를 받아옵니다.
  • 만약 둘중 하나라도 틀리면 에러 메세지를 반환해줍니다.
  • 토큰에는 유저 정보 , 지역 정보, 역할정보를 담겨져 있어 보다 편의성을 고려했습니다.
  • 토큰으로 인증, 인가를 거칩니다.
  • 유효하지않는 토큰이거나 , 토큰이 없다면 에러를 발생시킵니다.
  • 모든것이 완료되면 로그인 성공 메세지와 함께 로그인이 완료됩니다.

3. 회원 정보 수정 기능 (김윤희)


  • header에 토큰 값과 user_id(수정할 사용자의 고유 id 값), name(이름), phone_number(휴대폰 번호), 값들을 필수로 받습니다.
  • 필수값을 넣어주지 않으면 에러가 반환됩니다.
  • 토큰값으로 인증 인가를 거친 뒤 관리자가 맞다면 수정 단계로 넘어가지만 관리자가 아니라면, 에러를 반환합니다.
  • 휴대폰 번호는 unique 제약 조건을 설정해두었기 때문에 DB에 데이터와 중복된다면 에러를 반환합니다.
  • DB에서 업데이트 된 시점을 알 수 있도록 컬럼을 추가했습니다.

4. JSON 데이터 파싱 후, 데이터베이스 저장 (전준영(도우미: 오인환))


  • 각 API 테스트 시 필요한 상세 이용 방법

    필수요청값(token, 전국치매센터표준데이터.JSON)을 요청값으로 받습니다.

    1. 대표관리자 코드로 회원가입된 유저로 로그인 한 후에 토큰값을 받아 인가처리를 받습니다. 지역 담당자의 경우에는 기능을 이용할 수 없습니다.

    2. 이미 있는 치매센터명의 경우 중복하여 생성할 수 없습니다.

  • 선택 사항 구현 시, 구현 방법과 이유에 대한 간략한 설명

    1. 우선 전국치매센터표준데이터 JSON파일로 받아보면 배열안에 fields라는 키와 records라는 키로 이루어져있는데 그중 records라는 데이터만 필요하다고 생각되어 fields키는 제외하였습니다.

    2. 대표관리자만 생성,수정,삭제기능을 할수 있기 때문에 대표관리자 코드를 따로 boolean형태인 0과 1로 만들어 관리하기위해 users테이블에 is_admin 컬럼을 추가하였습니다.

    3. 지역담당자는 담당 지역을 설정할 수 있어야 하기 때문에 users 테이블에 province_id 컬럼을 추가하였습니다. 이 때 대표관리자는 담당지역이 없기 때문에 테이블을 생성 할 때에 province_id를 null on 으로 설정해두었습니다.

    4. 전국치매표준데이터 JSON 파일을 다운받기 위해 사이트에 들어가서 제공되는 표의 컬럼을 보고 hospitals 테이블의 컬럼을 정했습니다. 사이트의 표에는 "제공기관코드"와 "제공기관명" 컬럼이 없어서 "제공기관코드"컬럼은 모델링에서 제외하였습니다. "제공기관명"컬럼은 지역코드명으로 관리하기위해 hospitals 테이블의 province_id로 사용하였습니다.

    5. 치매센터유형의 경우 중복되는 경우가 많아 코드로 관리하기위해 테이블을 따로두었습니다.

  • 기능 구현 시 어려웠던 점과 그에 대한 해결 방안을 모색하기 위해 노력한 점(특정 키워드를 가지고 검색했다, 공식 문서를 참조했다 등)

테이블을 구성할 때부터 생성기능이 대표관리자만 상세데이터를 저장가능하기 때문에 유저와 데이터들간의 연관성을 고려하여 컬럼을 어떤 컬럼을 추가해야할까 생각을 많이하게 되는 과제였습니다.
처음에는 JSON 파일을 받아 각 컬럼들을 파싱하는 과정이 복잡하고 어려웠지만 결국 필요한 데이터는 변경하고 필요한 컬럼들을 데이터베이스에 저장하기위해 Object, map, includes, switch case 등을 더 공부하게 되는 계기였고, users 테이블에서 대표관리자의 province_id 값이 null 이되도록 null on 처리를 해두었는데 null이 되는것 보다는 대표관리자라는 명확한 코드를 부여하는 것이 낫다고 프로젝트 중간에 생각이 되었습니다. province 테이블에 따로 id를 두어 대표관리자 라는 행을 추가했으면 어떨까 생각을해보았습니다.

5. 엑셀 다운로드 기능 (음정민)


데이터를 먼저 조회하고, 원할 때만 다운로드를 할 수 있도록 요청 엔드포인트를 나누어서 구현했습니다.

치매센터 조회 API

  1. 회원가입, 로그인을 하고 토큰을 발급받는다.
  2. Request Headers에 Authorization키에 토큰을 담아서 http://localhost:8000/hospital 로 get요청을 보낸다.
  3. 로그인한 유저가 대표 관리자라면 전체 데이터가, 지역 담당자라면 해당 지역의 데이터만 조회할 수 있다.

조회한 리스트 엑셀 다운로드 API

  1. 회원가입, 로그인을 하고 토큰을 발급받는다.
  2. Request Headers에 Authorization키에 토큰을 담아서 http://localhost:8000/hospital/download 로 get요청을 보낸다.
  3. 로그인한 유저가 대표 관리자라면 전체 데이터가, 지역 담당자라면 해당 지역의 데이터만 다운로드할 수 있다.

예외처리

  • 유저가 관리자인데 담당지역이 설정되어있는 경우
    • 유저가 관리자인지, 지역 담당자인지 확실하지 않기 때문에 에러처리를 했습니다.
  • 유저가 관리자가 아닌데 담당지역이 설정되어 있지 않은 경우
    • 담당지역의 유무로만 유저를 관리자로 판단하면 아직 담당지역을 배정받지 못한 지역 담당자가 관리자의 권한을 가질 수 있기 때문에 에러처리를 했습니다.

추가기능: 조건에 맞는 데이터만 보기(다운로드하기)

항목 Query Params Key Data Type 결과
치매센터명 name string 단어 부분 일치하는 센터
운영기관대표자명 representative string 단어 부분 일치하는 센터
운영기관전화번호 operatorcontact string 단어 부분 일치하는 센터
치매센터유형 type string 모든 단어 일치하는 센터
의사인원수 doctor integer 의사 수가 해당숫자 이상인 센터
간호사인원수 nurse integer 간호사 수가 해당숫자 이상인 센터
사회복지사인원수 socialworker integer 사회복지사 수가 해당숫자 이상인 센터
  • 위 표에 맞춰서 알맞은 Key와 Value를 Query Parameter로 요청보내서 해당하는 조건의 데이터만 조회/다운로드한다.
  • 검색 조건이 여러개면 모든 검색조건을 만족하는 결과만 볼 수 있다.
  • 일치하는 데이터가 없으면 빈 리스트가 반환된다.
    • 쿼리 파라미터의 키가 있으면 SQL WHERE절을 AND로 연결해서 조건에 맞는 데이터만 나오도록 구현했습니다.
    • 부분일치: LIKE "%검색어%"
    • 모든 단어 일치: = "검색어"
    • 해당숫자 이상: >= 해당숫자

대표 관리자일 때는 모든 데이터를 조회할 수 있어서 WHERE절이 붙지 않아서 처음에 SQL문을 관리자용 지역담당자용 두개로 나누었는데 검색기능도 더해지면서 하나로 합칠 방법을 찾았고 WHERE 1이라는 조건을 주면 조건이 없는것과 같은 결과가 나온다는 것을 알게 됐습니다. 그래서 관리자용으로 WHERE 1조건을 주고 나머지 지역담당자일떼, 검색했을때 경우는 모두 AND 조건을 준 문자열을 붙여서 하나의 SQL문으로 모든 요청을 처리할 수 있게 되었습니다.

Swagger명세서를 처음 작성해 보았는데 엔드포인트 하나에 중복되는 에러코드를 두 개 작성할 수 없었는데 작성해둔 에러코드를 변경하는 대신 swagger same response code 키워드로 검색을 통해 스택오버플로우에서 chema를 나누는 방법을 찾아서 작성할 수 있었습니다.

🏥 API doc

SWAGGER

  • 서버를 열고 접속
$ node server.js

👉 http://localhost:8000/api-docs

Postman

  • 김윤희 : (회원정보 수정기능) 👉 [Postman API doc]
  • 박정용 : (로그인) 👉 Postman API doc
  • 음정민 : (엑셀 다운로드) 👉 Postman API doc
  • 전준영 : (회원가입, 병원데이터생성) 👉 Postman API doc

About

주식회사 하이 - Admin용 데이터 관리 프로그램 만들기

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • JavaScript 100.0%