프레임워크/Spring
#13 모델 설계 1
Scala0114
2022. 5. 13. 22:56
1. ERD 작성
- 본격적으로 게시판 개발에 들어가기 위해 데이터 모델을 설계할 필요가 있다. 위 그림은 이번 게시판 프로젝트를 위해 간단하게 작성한 ERD이다. (ERD 작성을 위한 툴은 매우 다양하지만 이번에 사용한 QuickDBD는 텍스트 코드를 작성하면 이를 파싱하여 위 처럼 깔끔하게 ERD를 그려주기 때문에 굉장히 편리했다. 앞으로도 ERD 작성은 이 사이트를 이용하게 될 것 같다.)
- 각 엔티티들과 그 사이의 관계를 어떻게 구성했는지 하나씩 살펴보며 정리해보자(PK로 사용할 식별자(id)에 대해서는 별도로 설명하지 않기로 한다).
2. 회원 정보
- member
- 회원 정보를 저장하기 위한 엔티티
- name
- 회원 ID. 여기서의 ID는 PK로서의 ID가 아닌 로그인시에 입력하는 계정이름을 의미(최대 20자)
- 회원 ID. 여기서의 ID는 PK로서의 ID가 아닌 로그인시에 입력하는 계정이름을 의미(최대 20자)
- password
- 회원 비밀번호. 회원 가입 시에 입력받아 로그인 시에 사용
- 암호화된 패스워드를 저장해야 하기 때문에 넉넉하게 최대 크기를 100자로 잡음
- email
- 회원의 email 주소(최대 50자)
- 회원의 email 주소(최대 50자)
- register_datetime
- 회원 가입 일시
- role
- 역할(권한)을 나타내기 위한 엔티티
- name
- 역할의 이름(최대 20자)
- 역할(권한)을 나타내기 위한 엔티티
- member_role
- member와 role 을 연결해주기 위한 엔티티
- 한 명의 member는 여러 개의 role을 가질 수 있고 하나의 role 또한 여러 멤버에게 주어질 수 있기에 두 엔티티의 관계는 다대다(N:M) 관계이다. 관계형 데이터베이스에서 다대다 관계를 나타내기 위해서는 사이를 이어줄 join table이 필요한데, 이 역할을 해주기 위해 필요한 엔티티이다.
- member_id
- role을 가질 member의 PK
- role_id
- member가 가질 role의 PK
- member와 role 을 연결해주기 위한 엔티티
3. 게시글 관련 정보
- post
- 게시글의 정보를 저장하기 위한 엔티티
- title
- 게시글 제목(최대 40자)
- 게시글 제목(최대 40자)
- content
- 게시글 내용
- 게시글 내용은 매우 길어질 수 있기 때문에 TEXT 타입을 사용
- create_datetime
- 작성 일자
- 작성 일자
- modify_datetime
- 최근 수정 일자
- 최근 수정 일자
- author_id
- 작성자인 member의 PK
- 게시글의 정보를 저장하기 위한 엔티티
- comment
- 댓글의 정보를 저장하기 위한 엔티티
- content
- 댓글 내용(최대 255자 - VARCHAR 최대크기)
- 댓글 내용(최대 255자 - VARCHAR 최대크기)
- create_datetime
- 작성 일자
- 작성 일자
- modify_datetime
- 수정 일자
- 수정 일자
- author_id
- 작성자인 member의 PK
- 작성자인 member의 PK
- post_id
- 댓글이 달린 post의 PK
- 댓글의 정보를 저장하기 위한 엔티티
- vote_info
- 게시글의 추천(혹은 좋아요) 정보를 관리하기 위한 엔티티
- 하나의 게시글을 여러 회원이 추천할 수도 있으며 한 명의 회원이 여러 게시글을 추천할 수도 있는 다대다 관계
- member : role 관계때와 마찬가지로 post와 member를 연결해줄 엔티티로 사용됨
- post_id
- 추천받은 post의 PK
- 추천받은 post의 PK
- voter_id
- 추천한 member의 PK
이정도면 게시판을 개발하기 위해 필요한 기본적인 데이터 모델의 설계가 끝났다고 볼 수 있다. 다음에는 실제 프로그램상에서 사용될 클래스를 설계하기 위해 클래스 다이어그램을 작성해볼 것이다.
+ ERD 수정)
- 기존에는 member와 role을 다대다 관계로 매핑하려 했지만 굳이 조인테이블을 두는 것보다 role은 enum 타입을 정의하여 입력을 한정하고 하나의 member가 여러개의 member_role 테이블의 레코드에 매핑되는 방식이 나을 것 같아서 구조를 조금 바꿨다. role 엔티티가 없어지고 member_role에 role의 이름이 바로 들어가도록 수정되었다.
- post에 조회수를 나타내기 위해 view_count 속성을 추가했다.
- member의 name에 index를 추가했다.