스프링 프레임워크/쇼핑몰 프로젝트

[Spring][쇼핑몰 프로젝트][45] 댓글 구현 방향 & 댓글 테이블 설계

Kim VamPa 2021. 12. 31. 10:00
728x90
반응형
프로젝트 Github : https://github.com/sjinjin7/Blog_Project
프로젝트 포스팅 색인(index) : https://kimvampa.tistory.com/188

 

목표

댓글 & 평점 구현 방향 설정 및 테이블 생성

 '댓글&평점' 구현에 앞서 어떠한 방향과 방식으로 할지에 대해 생각해보고자 합니다.

 

 

순서

1. 댓글&평점 기능 개요

2. 댓글 테이블 설계

 

 

 

1. 댓글&평점 기능 개요

 상품페이지에는 회원들이 작성한 댓글과 평점을 볼 수 있다. 로그인한 사용자는 댓글 등록 버튼을 누르면 댓글&평점을 등록할 수 있다. 자신이 작성한 댓글&평점을 수정하거나 삭제할 수 있다.

 댓글&평점에 대한 CRUD(Create, Read, Update, Delete)를 구현하고자 합니다. (편의상 이하 댓글&평점을 댓글이라고 통칭하겠습니다.) 댓글 관련 기능들은 페이지의 이동 없이 동작하도록 만들 것입니다. 구현하고자 하는 댓글 CRUD의 각 동작 흐름을 정리해보겠습니다.

 

※ 평점은 1.0부터 4.0 까지 0.5 단위로 회원이 선택할 수 있도록 할 것입니다.

 

Create

 - 로그인한 회원이 '상품 상세 페이지'로 이동했을 때 "댓글 등록" 버튼이 보인다.

 - 댓글 등록 버튼을 누르면 댓글을 작성할 수 있는 팝업창이 뜬다.

 - 팝업창에서는 평점을 select 방식으로 선택할 수 있고, 댓글은 <textarea>에 작성할 수 있다.

 - 다 작성 후 '등록' 버튼을 누르면 DB에 댓글 등록이 완료된다.

 - 댓글 등록 동작과정에서 상품 테이블(vam_book)의 평점(평균 평점)이 최신화된다.

 - 댓글이 등록되면 팝업창이 닫히고 '상품 상세 페이지' 에는 등록한 댓글을 볼 수 있다.

 

Read

 - '상품 상세 페이지' 하단에 10개 단위로 페이징 된 댓글을 볼 수 있다.

 - 댓글 리스트 하단에 페이징 버튼이 있다.

 - 페이징 버튼을 클릭하면 페이지 이동 없이 댓글 리스트가 바뀐다.

 

Update

 - '상품 페이지'에서 회원이 작성한 댓글이 있는 경우 자신의 댓글에 '수정 버튼'이 보인다.

 - '수정 버튼'을 누르면 수정을 할 수 있는 팝업창이 등장한다.

 - 팝업창에선 기존 작성된 평점과 댓글이 작성되어 있고, 이를 수정이 가능하다.

 - 댓글&리뷰를 수정하고 '수정 버튼'을 누르면 DB에 수정된 데이터가 반영된다.

 - 수정한 평점은 상품 테이블의 평균에 반영된다.

 - 수정 완료 후 팝업창이 닫히고 '상품 수정 페이지'에  댓글이 수정한 댓글로 바로 최신화된다.

 

 

Delete

 - '상품 페이지'에서 회원이 작성한 댓글이 있는 경우 자신의 댓글에 '삭제 버튼'이 보인다.

 - '삭제 버튼'을 누르면 DB에서 댓글 정보가 삭제된다.

 - 상품 테이블의 평균 평점이 최신화된다.

 - 페이지 이동 없이 댓글 리스트가 최신화된다.

 

 최대한 위의 흐름을 따르는 댓글 기능을 다음 포스팅부터 구현해보겠습니다.

 

 본격적인 구현에 앞서 댓글 데이터를 담을 테이블을 설계하겠습니다.

 

 

2. 댓글 테이블 설계

 

관계 설계

 

 댓글 개체는 다른 개체들과 어떠한 관계를 가지는지, 어떠한 제약조건을 설정해 줄 지에 대해 먼저 생각해보겠습니다. 먼저 회원과 댓글의 관계입니다. 한 명의 회원은 여러개의 댓글을 작성할 수 있습니다. 하지만 하나의 댓글은 반드시 한명의 회원에 의해 작성되어야 합니다. 따라서 댓글과 회원은 일대다(1:N) 관계입니다. ( 댓글 테이블에는 회원 테이블의 기본키 값을 가지는 외래 키를 추가해줄 것입니다.)

 

그림 2-1

 

 

 그다음 댓글과 상품의 관계입니다. 하나의 상품은 여러 개의 댓글을 가질 수 있습니다.  하지만 댓글은 반드시 하나의 상품에 속해야만 합니다. 따라서 댓글과 상품은 다대일(N:1) 관계 입니다.(댓글 테이블에는 상품 테이블의 기본키값을 가지는 외래키를 추가 해줄 것입니다.)

 

그림 2-2

 

 

 여기에 하나의 조건을 추가 해줄 것입니다. 회원은 댓글을 여러개 작성할 수 있지만, 하나의 상품에 관한 댓글은 하나만 작성할 수 있도록 할 것입니다. 따라서 댓글 테이블에서 회원, 상품 외래 키 두 개를 하나의 단위로 하는 유니크 제약조건을 추가해주겠습니다.

 

테이블 속성

 

 테이블명은 "vam_reply"이며 테이블이 가질 속성은 아래와 같습니다.

 


replyId
 vam_reply 테이블의 기본키입니다.

bookId
 vam_book 테이블의 외래 키입니다.

memberId
 book_member 테이블의 외래 키입니다.

content
 댓글의 내용입니다.

rating
 상품의 평점입니다.

regDate
 댓글이 등록되는 날짜입니다. 


 

테이블 등록

 

 위에서 살펴본 제약조건, 속성을 가지는 테이블이 등록되도록 아래의 명령어를 실행하였습니다.

 

Oracle

--리뷰 테이블
create table vam_reply(
    replyId number generated always as IDENTITY primary key,
    bookId number not null,
    memberId varchar2(50) not null,
    regDate date default sysdate,
    content varchar2(3500),
    rating number(2,1) not null,
    FOREIGN KEY (memberId)REFERENCES book_member(memberId),
    FOREIGN KEY (bookId) REFERENCES vam_book(bookId),
    UNIQUE(bookId, memberId)
);

 

 

MySQL

-- 댓글 테이블
create table vam_reply(
    replyId int auto_increment primary key,
    bookId int not null,
    memberId varchar(50) not null,
    regDate timestamp default now(),
    content varchar(3500),
    rating decimal(2,1) not null,
    FOREIGN KEY (memberId)REFERENCES book_member(memberId),
    FOREIGN KEY (bookId) REFERENCES vam_book(bookId),
    UNIQUE(bookId, memberId)
);

 

 

 

※ 댓글 리스트 페이징 테스트를 위해 최소 10개 이상의 댓글이 필요로 해서, 저는 의미 없는 댓글 정보를 등록할 수 있도록 제약조건을  생략한 댓글 테이블 등록 명령어를 실행하였습니다. 

Oracle

-- 테스트 테이블
create table vam_reply(
    replyId number generated always as IDENTITY primary key,
    bookId number not null,
    memberId varchar2(50) not null,
    regDate date default sysdate,
    content varchar2(3500),
    rating number(2,1) not null
);

 

 

REFERENCE

  •  

 

 

DATE

  • 2020.12.31

 

728x90
반응형