반응형
우선 프로젝트를 시작하면서 제일 먼저 구현할 기능을 게시판으로 정했습니다.
이에 따라 게시판을 먼저 구현하고 추가적인 기능을 더해가려고 합니다.
툴은 Aquery Tool을 사용했으며, 아래와 같은 엔티티(테이블)를 4개 작성했습니다.
M : N 관계를 풀기 위한 중간 테이블도 하나 작성했습니다.
- Member - 게시판을 사용할 유저들의 정보를 저장할 테이블입니다.
- Post - 게시판을 사용할 때 게시글을 작성하면 그에 대한 정보를 저장할 테이블입니다.
- Comment - 게시글이 있으면 댓글을 달아야 소통이 이루어지므로, 댓글에 관련된 데이터를 저장할 테이블입니다.
- Alarm - 개인적으로 고민을 정말 많이 한 테이블입니다. 결국 소통을 하기 위해서는 게시글에 댓글이 달리거나, 댓글에 대댓글이 달려야하는데 이를 알려주는 알람에 대한 정보를 저장하는 테이블입니다.
아래는 작성한 ERD 다이어그램 이미지입니다. 본격적으로 자세히 제 생각을 설명해보겠습니다.
먼저 Member 테이블입니다.
- 기본키인 user_id
- 유저 이메일과, 유저가 로그인할 때 필요한 로그인 아이디와 비밀번호가 있습니다.
- 유저 닉네임과 유저 이름이 존재하고, 논리적 삭제를 지원하고 더 많은 상태를 제공할 예정이기 때문에,
status를 VARCHAR을 사용했습니다 - 특별한 부분이 없다고 생각합니다. 이후에 소셜 로그인을 진행하면 그 때 소셜 로그인 관련 애트리뷰트를 추가할 예정입니다.
다음은 POST 테이블입니다.
- 당연히 기본키 post_id가 존재합니다.
- 게시글의 제목 title, 게시글의 내용 content, 작성한 날짜 created_at가 있습니다.
- 작성자를 역추적할 수 있게 member_id를 외래키로 두었습니다.
- 논리적 삭제를 지원할 예정입니다. 활성화와 비활성화만 지원하려고 하므로 Boolean을 위해 TINYINT로 타입을 설정했습니다.
본인은 유저가 좋아요를 누른 게시글을 한 번에 보여주는 기능을 구현하고 싶습니다.
따라서 유저가 좋아요를 게시글에 누르는 것을 다대다 관계로 해석했습니다. 이에 따른 중간 테이블입니다.
- 테이블의 기본키인 like_post_id가 존재하고, 좋아요를 누른 유저와, 좋아요를 받은 게시글의 아이디가 각각 존재합니다.
- like는 2가지 고민이 있었습니다.
- 먼저 첫 번째 방법은 like 애트리뷰트를 만들고 일정 시간을 마다 모든 행을 count하고 그 값을 저장하는 방법입니다.
- 두 번째 방법은 like를 저장하는 애트리뷰트를 만들지 않고 해당 게시글을 가져올 때마다 count를 해서 값을 가져오는 것입니다.
- 예전에 공부하면서 두 번째 방법을 computing field라고 들은 것 같습니다.
- 첫 번째 방법은 좋아요가 엄청나게 많이 발생하는 인플루언서들에게 효과적인 방법 같다고 생각하여, 두 번째 방법을 채택했습니다.
Comment 테이블입니다.
- 먼저 기본키인 comment_id가 있습니다.
- 유저가 댓글에 작성한 내용인 content가 있습니다.
- 댓글 좋아요로는 유저를 추적하지 않을 생각이므로 like를 int 타입으로 정했습니다.
- 작성일 created_at가 존재하고, 댓글이 달린 게시글의 아이디 post_id를 가지고 있습니다.
- 댓글을 작성한 유저의 user_id를 저장하고, 대댓글인 경우에는 부모 댓글의 id(parent_id)를 저장합니다.
- 이 경우에는 부모 댓글의 여부를 확인하고, 메소드를 구분해 댓글을 생성할 생각입니다.
마지막으로 제일 고민한 Alarm 부분입니다.
- 먼저 기본키인 알람 아이디가 존재한다.
- 잘 생각해보면 현재 게시판에서는 무조건 댓글의 알람만 달린다. 따라서 알람을 울리는 댓글의 아이디를 가진다.
- 알람 받을 대상 target_id를 가진다. 2가지 경우를 생각했다.
- 게시글을 작성하고 댓글이 달리면 이는 게시글 작성자에게 알람이 간다.
- 게시글이 작성된 후 댓글이 달렸다. 이후 대댓글이 달렸는데 이 대댓글에 대한 알람은 부모 댓글 작성자에게 알람이 간다.
- 뭔가 찜찜한 구석이 있는데 게시글 작성자는 모든 알람을 받아야 한다고 생각해서.. 이는 제 생각에 변화가 있으면 수정하도록 하겠습니다.
- 또 알람을 읽었는지 확인하기 위해 read_at 이라는 애트리뷰트를 두었습니다.
- 마지막으로 생성된 날짜 create_at가 있습니다.
이렇게 뿌리가 될 게시판의 ERD 다이어그램 설계를 마쳤습니다. 간단한 5개의 테이블이지만 엄청나게 고민한 것 같습니다.
이제 API 디자인 책을 읽기 전, 제가 API를 디자인해보려고 합니다. 책을 읽고 다시 디자인 했을 때 변화한 차이가 궁금해서 이렇게 정했습니다. 이상으로 ERD 다이어그램 설계 설명을 마칩니다.
계속 고민할 부분
- 사진, 동영상을 저장할 미디어 테이블을 만들고 이를 활용. S3를 써보고 싶습니다.
- 소셜 로그인을 진행하고 싶으므로, 데이터베이스도 차후에 좀 더 수정할 예정입니다. 일단은 기본에 충실하려고 합니다.
- 나중에는 게시판 알림말고 다른 알람도 만들어보려고 합니다. 알람 target에 대해서도 계속 고민할 예정입니다.
- 댓글을 만약 계단식으로 디자인한다면 데이터베이스 애트리뷰트에 level이라는 것을 추가하고 API로 응답해 프론트에서 구현하는데, 이걸 현재 내 능력에서 프론트로 구현할 수 있을까.
이상으로 포스팅을 마치겠습니다. 감사합니다.
반응형
댓글