💻/SPRING + REACT

[스프링+리액트 웹 만들기] #2. DB 설계하기

김씨리 2021. 3. 24. 17:31

 

 

이전 글 : [스프링+리액트 웹 만들기] #1. 환경 세팅하기


DB로는 MySQL을 이용했다.

 

formapp 이라는 이름으로 스키마를 생성했고, 대략적인 구조는 아래 그림과 같다.

 

 

 

 

1. USER

user 정보를 저장해두는 테이블. userIdx가 PK로 들어가고 id와 password 칼럼을 생성했다. password가 그대로 DB에 들어가는 보안 문제를 막기 위해서는 암호화 시킨 값을 password 대신 DB에 저장하도록 하는 것이 좋지만, 로컬에서만 돌려보는 개인 공부용 프로젝트이므로 그냥 진행했다..^0^

 

 

 

2. FORM

설문 정보 저장해두는 테이블. formIdx를 PK로 가지고, 작성자 id, 설문 제목, 생성 시간을 칼럼으로 두었다. 생성 시간인 createdAt 칼럼은 디폴트를 CURRENT_DATETIME으로 둠으로써 생성될 때의 시간이 자동으로 들어가도록 했다.

 

 

3. USER_FORM

정규화 규칙에 의해 user와 form 테이블 간의 중간 테이블을 하나 두었다. 어느 user가 어느 form을 받았는지를 알 수 있는 테이블이다. 나중에 더 디벨롭시킨다면 설문을 받을 사용자를 지정하여 보내는 기능을 추가하면 좋을 것 같다.

 

 

 

userIdx와 formIdx는 중간 테이블의 칼럼으로, 각각 user 테이블과 form 테이블의 PK를 외래키로 참조한다.

user가 수정 또는 삭제될 때에 같이 수정/삭제 되도록 CASCADE 조건을 넣었다.

 

form이 수정 또는 삭제될 때에 같이 수정/삭제 되도록 CASCADE 조건을 넣었다.

 

 

 

4. CONTENT

설문 안에 들어가는 문항을 의미하는 테이블이다. 문항은 객관식과 주관식으로 이루어져 있다고 프로젝트 개요를 짤 때 지정했었다. 한 설문 안에는 여러 개의 문항이 들어갈 수 있고, content 테이블에서 객관식과 주관식에서 공통으로 가지고 있는 문항 제목(질문)과 문항 설명을 칼럼으로 가지도록 했다. 문항이 객관식이냐 주관식이냐에 따라 이후 DB 상 흐름이 달라진다.

 

formIdx는 content 테이블의 특정 문항이 어떤 설문에 들어가는지를 알려주는 칼럼으로, form 테이블의 formIdx를 참조한다. form이 수정되더라도 formIdx는 수정될 일이 없기 때문에(PK, AI) 삭제에 대해서만 CASCADE를 설정해두었다.

 

5. OBJ_ENTRY

객관식 문항은 문항에 답할 수 있는 선택지가 있어야 하므로, obj_entry 테이블은 객관식 문항의 선택지 정보를 담는다. entryIdx가 PK가 되고 entry는 선택지 내용 칼럼이 된다. 한 객관식 문항에 1개 이상의 선택지가 존재해야 한다.

 

contentIdx는 이 entry가 어떤 문항에 포함되는 것인지를 나타내야 하므로, content 테이블의 contentIdx를 참조한다. 4번과 마찬가지로 content 테이블이 변경된다 하더라도 contentIdx가 변경될 일은 없으므로 우선 삭제에 대해서만 CASCADE 설정을 해두었다.

 

 

 

6. OBJ_RESULT

설문조사를 했으면 결과를 확인할 수도 있어야 하기 때문에 객관식/주관식 문항별로 각각의 결과를 모아두는 테이블을 만들기로 했다. obj_result는 객관식 문항에 대한 결과를 볼 수 있는 테이블이다. 어느 사용자가 어떤 객관식 선택지를 골랐는지 체크하기 위해 userIdx와 entryIdx를 결합해 PK로 설정했다.

 

entryIdx는 5번의 obj_entry 테이블의 entryIdx를 참조하고, 역시 삭제에 대해 CASCADE 조건을 지정해두었다.

 

 

 

7. SUBJ_RESULT

주관식 문항은 따로 선택지가 없고, 문항의 제목(질문), 문항 설명과 그에 답할 수 있는 입력 창만 있으면 된다. 따라서, 문항을 보여줄 수 있는 데에 content 테이블 외 별도의 테이블이 필요하지 않으며 결과를 저장해두는 테이블만 두었다.

어느 사용자가 어떤 주관식 문항에 대해 어떤 답변을 했는지에 대한 정보가 필요하므로, userIdx, contentIdx, answer 칼럼을 생성했다. 답변을 하지 않을 수도 있으므로 answer 칼럼은 NN을 체크하지 않았다.

어느 주관식 문항에 대한 답변 결과인지를 표현해야 하므로 content 테이블에서 contentIdx를 참조한다. 역시 삭제에 대해 CASCADE.

 

 

 

 

 

위와 같은 테이블 생성 단계를 거치면 제일 처음 제시했던 ERD 대로의 구조가 만들어진다.

 

 

 

DB 세팅을 끝냈다! (Yay~~~)

이제 본격적으로 기능을 하나씩 만들어 보겠다. 먼저 로그인과 회원가입부터 시작해서 웹의 메인으로 진입하도록 하자.