[미소 클론코딩 프로젝트] 요구사항 정의 및 데이터베이스 설계

2023. 8. 15. 18:31초기 과업/BackEnd

작성자알 수 없는 사용자

728x90
반응형

2023.08.12 - [초기 과업/BackEnd] - [미소 클론코딩 프로젝트] 2-14. 관리자 서비스 API - 일정 관리

 

[미소 클론코딩 프로젝트] 2-14. 관리자 서비스 API - 일정 관리

2023.08.12 - [초기 과업/BackEnd] - [미소 클론코딩 프로젝트] 2-13. 관리자 서비스 API 설계 - 협력업체 관리 [미소 클론코딩 프로젝트] 2-13. 관리자 서비스 API 설계 - 협력업체 관리 2023.08.12 - [분류 전체

giggal-people.tistory.com

 

안녕하세요. 기깔나는 사람들에서 백엔드를 맡고있는 황시아입니다.

저번 시간까지 API 설계를 진행해 보았는데요, 

이번 시간엔 프로젝트 생성 전에 핵심 요구사항을 정의하고 데이터베이스 설계를 진행해 보겠습니다.

 

 


요구사항 정의

미소 클론코딩 프로젝트의 주 요구사항은 인증/인가, 이용자 견적서, 계약서 서비스, 관리자의 협력업체 관리, 일정관리구현 등이 있습니다. 하지만 주어진 기한이 그렇게 길지 않기 때문에 현실적으로 저 모든 것을 구현한다는 것은 불가능에 가깝습니다. 

그래서 기한 내에 개발 가능한 요구사항에 집중하려 합니다.

 

현재 미소 클론코딩 프로젝트의 백엔드 담당자는 2명이며, 인증/인가, 견적서, 계약서 서비스를 구현하기로 했습니다. 

저는 그 중에서 견적서와 계약서 서비스를 구현할 예정입니다.

 


견적서 서비스 요구사항 정의

견적서 서비스의 요구사항은 다음과 같습니다.

 

- 비회원과 회원은 견적서를 받기 위해 정보를 입력하여 제출하면 견적서를 받아볼 수 있다.

- 비회원인 경우 견적서가 생성되면 견적서 일련번호와 임시 비밀번호를 받을 수 있다.

- 비회원은 견적서 일련번호와 임시 비밀번호를 입력해서 견적서를 조회할 수 있다.

- 견적서 일련번호는 Q+생성일시(8자리)+순번(4자리) 조합 문자열로 생성된다. 견적서 일련번호는 Unique해야 한다.

- 임시 비밀번호는 영문과 숫자를 무작위로 조합한 10자리 문자열로 생성된다.

- 회원인 경우 로그인만 하면 생성된 견적서를 조회할 수 있다.

- 비회원과 회원 모두 견적서에서 잘못 입력된 내용을 수정할 수 있다.

- 비회원과 회원 모두 생성된 견적서를 취소할 수 있다.

 


계약서 서비스 요구사항 정의

계약서 서비스의 요구사항은 다음과 같습니다.

 

- 비회원과 회원은 견적서에 작성된 내용을 토대로 업체에 서비스를 요구하면 계약서를 받고 내용을 확인할 수 있다.

- 비회원과 회원 모두 계약서 작성시 이름, 주소, 연락처, 자필 서명을 필수 입력해야 한다.

- 비회원인 경우 계약서 작성시 계약서 일련번호와 임시 비밀번호를 받을 수 있다. 

- 비회원인 경우 계약서 일련번호와 임시 비밀번호를 입력해서 계약서를 조회할 수 있다.

- 계약서 일련번호는 C+생성일시(8자리)+순번(4자리) 조합 문자열로 생성된다. 계약서 일련번호는 Unique해야 한다.

- 임시 비밀번호는 영문과 숫자를 무작위로 조합한 10자리 문자열로 생성된다.

- 회원은 로그인만 하면 계약서를 조회할 수 있다.

- 비회원과 회원 모두 계약을 취소할 수 있다.

- 비회원과 회원 모두 작성된 계약서를 PDF 파일로 내려받을 수 있다.

 


ERD DIAGRAM

 

견적서와 계약서 서비스를 만드는 데에 필요한 테이블들만 정의해 보았습니다.

 

회원과 비회원을 관리하는 테이블은 분리했습니다.

한 테이블에서 관리할 수도 있지만 비회원 데이터를 저장하는 경우에는 수많은 필드에 NULL과 같이 무의미한 데이터를 삽입하게 되기 때문에 분리했습니다.

 

견적서/계약서 테이블과 회원/비회원 테이블과의 관계는 비식별 관계로 정의했습니다. 사실 회원/비회원과 식별 관계이지만 회원과 비회원 테이블을 분리했기 때문에 둘 중 하나만 존재해도 견적서/계약서의 존재가 가능하기 때문에 비식별 관계로 정의했습니다. 그렇기 때문에 회원/비회원 FK 컬럼에는 NULL을 허용했습니다.

협력업체 FK 컬럼 또한 이용자가 업체를 선택하기 전에는 입력할 수 없기 때문에 견적서에서는 NULL을 허용했지만, 계약서 작성 단계에서는 선택된 협력업체와 진행하는 것이기 때문에 계약서 테이블에서는 NULL을 허용하지 않았습니다.

 

마지막으로 채번 테이블은 견적서와 계약서 일련번호를 생성할 때 중복되지 않게 하려고 만들었습니다. 견적서/계약서 일련번호는 Q/C+YYYYMMDD+SEQ(4) 형태로 만들 것입니다. 만약 C202308150001 과 같은 형태로 만들 때, 이 일련번호 중 마지막 4자리는 0001, 0002, 0003, ... 과 같이 1씩 차례로 증가하는 순번입니다. 

이 때 이 순번을 따로 관리하지 않는다면 새 일련번호를 생성할 때 중복되지 않는 순번을 만들기 위해 테이블에서 일련번호를 가져온 뒤 substring해서 각 자리와 비교하고 다음 순번이 뭐가 되어야 하는지 구하기... 등을 하기 위해 수고가 많이 들어가게 됩니다. 하지만 채번테이블을 통해서 일련번호와 순번에 대한 정보만 따로 관리하면 채번테이블에서 순번을 제외한 일련번호로 조회한 뒤 순번의 max 값만 찾아서 다음 순번을 만들 수 있습니다. 

이 때 순번을 10진수로 증가시키게 되면 하루에 견적서/계약서 생성 요청이 9999건을 넘어가게 되면 새로운 일련번호를 만들 수 없게 됩니다. 이 때 해결방안으로 순번을 10진수가 아닌 62진법을 적용하면 좋다고 하여 공부해 본 뒤 62진법으로 순번을 만들 계획입니다.

그리고 일련번호 생성 요청이 동시에 들어오면 서로 다른 계약서가 같은 일련번호를 가지게 될 수 있기 때문에 낙관적 락을 적용해 동시성 문제를 해결하려 합니다.

 

 

여기까지 요구사항과 ERD DIAGRAM을 정의해 보았습니다.

부족한 점이 있으면 댓글 부탁드립니다.

 

 

 

 

 

728x90
반응형