1:N 관계
🧔🏻 익명 게시판으로 서비스를 구현했더니, 너무 악용하는 사용자가 많아졌네요. 따라서 로그인을 해야만 게시글을 작성할 수 있는 서비스로 기획을 변경하겠습니다!
✅ 학습 목표
- DB 테이블 설계
- 1:N 관계
✅ 요구 사항 - 1단계
<aside> 💬 아래의 요구사항을 충족시킬 수 있게 DB 테이블을 설계해보자.
</aside>
- 사용자는 1개 이상의 게시글을 작성할 수 있다.
- 게시글의 작성자는 1명 뿐이다.
- 1개의 게시글에는 1개 이상의 댓글이 달릴 수 있다.
- 1개의 댓글은 1개의 게시글에만 달릴 수 있다.
- 사용자는 1개 이상의 댓글을 작성할 수 있다.
- 댓글의 작성자는 1명 뿐이다.
✅ 요구 사항 - 2단계
- 게시글 작성 기능
- 사용자가 요청을 보낼 때 Header에 JWT 토큰을 넘기도록 한다.
- Header에 JWT 토큰이 담겨있지 않다면 에러로 응답한다.
- Header에 담겨있는 JWT 토큰이 올바르지 않거나 조작되었다면 에러로 응답한다.
- Header에 담겨있는 JWT 토큰의 만료기간이 지났다면 에러로 응답한다.
- Haeder에 담겨있는 JWT 토큰이 올바르다면, JWT 토큰의 payload에 담겨있는 사용자의 id(PK, primary key)를 활용해라.
- 게시글을 작성할 때, 사용자의 id를 외래키(FK, foreign key)로 같이 저장해라.
- 특정 게시글 수정 기능
- 사용자가 요청을 보낼 때 Header에 JWT 토큰을 넘기도록 한다.
- Header에 JWT 토큰이 담겨있지 않다면 에러로 응답한다.
- Header에 담겨있는 JWT 토큰이 올바르지 않거나 조작되었다면 에러로 응답한다.
- Header에 담겨있는 JWT 토큰의 만료기간이 지났다면 에러로 응답한다.
- Header에 담겨있는 JWT 토큰에 담겨있는 사용자 id(PK, priamry key)가, 게시글의 user_id(외래키, FK, foreign key)가 일치하지 않는다면 에러로 응답해라.
- 특정 게시글 삭제 기능
- 사용자가 요청을 보낼 때 Header에 JWT 토큰을 넘기도록 한다.
- Header에 JWT 토큰이 담겨있지 않다면 에러로 응답한다.
- Header에 담겨있는 JWT 토큰이 올바르지 않거나 조작되었다면 에러로 응답한다.
- Header에 담겨있는 JWT 토큰의 만료기간이 지났다면 에러로 응답한다.
- Header에 담겨있는 JWT 토큰에 담겨있는 사용자 id(PK, priamry key)가, 게시글의 user_id(외래키, FK, foreign key)가 일치하지 않는다면 에러로 응답해라.
✅ 요구 사항 - 3단계
- 게시글 작성 기능
- 특정 게시글 조회 기능
- 특정 게시글에 달려있는 모든 댓글(댓글 내용, 댓글 작성 시간)을 같이 조회해라.
- 댓글 작성 기능
- 댓글의 정보를 저장할 때 내용, 작성 시간이 포함되어야 한다.
- 사용자가 요청을 보낼 때 Header에 JWT 토큰을 넘기도록 한다.
- Header에 JWT 토큰이 담겨있지 않다면 에러로 응답한다.
- Header에 담겨있는 JWT 토큰이 올바르지 않거나 조작되었다면 에러로 응답한다.
- Header에 담겨있는 JWT 토큰의 만료기간이 지났다면 에러로 응답한다.
- Haeder에 담겨있는 JWT 토큰이 올바르다면, JWT 토큰의 payload에 담겨있는 사용자의 id(PK, primary key)를 활용해라.
- 댓글을 작성할 때, 사용자의 id를 외래키(FK, foreign key)로 같이 저장해라.
✅ 요구 사항 - 4단계
- 특정 게시글 조회 기능
- 특정 게시글에 달려있는 모든 댓글(댓글 내용, 댓글 작성 시간, 댓글 작성자의 이메일)을 같이 조회해라.
유저와 게시물 데이터의 관계 형성
1. 관계를 형성하기 위해서는 엔티티에 서로간의 필드를 넣어줘야한다.
✅요구 사항 - 1단계
<aside> 💬 아래의 요구사항을 충족시킬 수 있게 DB 테이블을 설계해보자.
</aside>
- 사용자는 1개 이상의 게시글을 작성할 수 있다.
- 게시글의 작성자는 1명 뿐이다.
- 1개의 게시글에는 1개 이상의 댓글이 달릴 수 있다.
- 1개의 댓글은 1개의 게시글에만 달릴 수 있다.
- 사용자는 1개 이상의 댓글을 작성할 수 있다.
- 댓글의 작성자는 1명 뿐이다.
@OneTwoMany
파라미터
1. Type
2. inverseSide(post에서 유저로 접근하려면 board.user로 접근해야함)
3.Option (eager: ture일떄는 user정보를 가져올때 board도 같이 가져옴)
유저에 post라는 컬럼을 넣어준것이다.
타입은 배열로
각각 엔티티에 위 코드 추가
댓글의 관계를 위해서 댓글 테이블을 DB에서 만들어준다.
CREATE TABLE comments (
comment_id INT NOT NULL AUTO_INCREMENT,
content VARCHAR(255) NOT NULL,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
userIdx INT NOT NULL,
FOREIGN KEY (userIdx) REFERENCES user (userIdx),
PRIMARY KEY (comment_id)
);
생성
이후 typeorm generator로 enttiy코드도 수정해준다.
npx typeorm-model-generator -h localhost -d nest_board -p 3306 -u root -x 0000 -e mysql -o ./mymodel
0526
흠 데이터베이스 에 좋아요와 댓글등을 추가하여 변경되어 아싸리 erdclodue를 사용하여 다시 설계하였따.
user
유저 인덱스 userIdx INT PK
이메일 email varchar(50)
비밀번호 password varchar(50)
회원가입시간 signupTime datetime(6)
post
게시글 인덱스 id INT PK
유저인덱스 userIdx INT
제목 title varchar(100)
내용 content varchar(255)
생성시간 postcreated_at datetime(6)
FK -usrIdx(누가 작성했는지)
comments
댓글인덱스 commentIdx INT PK
게시글인덱스 id INT
유저인덱스 userIdx INT
댓글내용 commentcontent varchar(100)
댓글생성시간 commentcreated_at datetime(6)
FK -usridx (누가 작성했는지)
FK -id(어느 게시글에 단 댓글인지)
LikePost
좋아요인덱스 likeIdx INT PK
게시물인덱스 id INT
사용자인덱스 userIdx INT
FK -useridx(누가 좋아요 눌렀는지)
FK -id(어떤 게시글을 좋아하는지)
해당 erd를 쿼리로 뽑으니 아래 처럼 나왔다 FK 쿼리가 없어서 음 뭔가 찝찝하다..
식별 비식별 떄문인것 같은데 우선 차후 찾아보자..!
CREATE TABLE `User` (
`userIdx` INT NOT NULL,
`email` varchar(50) NULL,
`password` varchar(50) NULL,
`signupTime` datetime NULL
);
CREATE TABLE `post` (
`id` INT NOT NULL,
`userIdx` INT NOT NULL,
`title` varchar(100) NULL,
`content` varchar(255) NULL,
`postcreated_at` datetime NULL
);
CREATE TABLE `likepost` (
`likeIdx` INT NOT NULL,
`id` INT NOT NULL,
`userIdx` INT NOT NULL
);
CREATE TABLE `comments` (
`commentsIdx` INT NOT NULL,
`userIdx` INT NOT NULL,
`commentscontent` varchar(100) NULL,
`commentcreated_at` datetime NULL
);
ALTER TABLE `User` ADD CONSTRAINT `PK_USER` PRIMARY KEY (
`userIdx`
);
ALTER TABLE `post` ADD CONSTRAINT `PK_POST` PRIMARY KEY (
`id`
);
ALTER TABLE `likepost` ADD CONSTRAINT `PK_LIKEPOST` PRIMARY KEY (
`likeIdx`
);
ALTER TABLE `comments` ADD CONSTRAINT `PK_COMMENTS` PRIMARY KEY (
`commentsIdx`
);
자 디비를 새로 수정 했겠다 다시
npx typeorm-model-generator -h localhost -d nest_board -p 3306 -u root -x 0000 -e mysql -o ./mymodel
로 entity를 수정해 보
'외부 활동 > JSCODE[NEST]' 카테고리의 다른 글
4주차 회원가입, 로그인 기능 추가 (0) | 2023.05.19 |
---|---|
3주차 API 서버 배포(AWS의 Elastic Beanstalk) + CORS세팅+에러처리 (0) | 2023.05.18 |
2회차 익명 게시판 서비스 개발 시작! (0) | 2023.05.12 |
1회차 기록 Level 1 (1) | 2023.05.11 |