Transactional처리로 Comment테이블에 Post, board의 row중 commentcount +1을
동시에 처리하도록 구현을 해 보았다.(comment를 포스트하는 api 호출)
댓글이란 글이 하나 이상이 존재해야 작성이 가능하다.
글이란 것은 board라는 테이블에 컬럼중 (commentCount) 댓글갯수가 나타나야 하고,
comment데이터 추가하면 어떤글의 comment인지를 나타내는 id존재하여야 한다.
결국 코멘트의 아이디는 Board의 어딘가의 id가 되고, Comment에 포스트 할때는 Board 호출할때 한번의 sql호출이 필요하고 , CommentCount호출이 또 한번 필요하다
따라서 insert(댓글 post시),update(댓글수 +1) 두개를 호출을 해야하며 실패했을때를 생각해봐야한다.
둘중하나만 성공하면 절대안됨(무결성이 무너짐)
@Transactional 필수적으로 어노테이션을 붙이게 되있음.
구현에 앞서 우선 commetjpa 디렉토리 추가
CommentController.java
Comment.java
package kr.ac.daegu.springbootapi.commentJpa.model;
import lombok.*;
import javax.persistence.*;
import java.time.LocalDate;
import java.time.LocalTime;
@Entity
@Getter
@Setter
@Table(name = "comment")
@ToString
@Builder
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Comment {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "cid")
private int cid;
@Column(name = "id")
private int id;
@Column(name = "author")
private String author;
@Column(name = "content")
private String content;
@Column(name = "writeDate")
private LocalDate writeDate;
@Column(name = "writeTime")
private LocalTime writeTime;
public Comment(int cid, int id, String author, String content, LocalDate writeDate, LocalTime writeTime) {
this.cid = cid;
this.id = id;
this.author = author;
this.content = content;
this.writeDate = writeDate;
this.writeTime = writeTime;
}
}
기본키는 cid로 지정, 모든 Comment 컬럼을 정의
Builder패턴 : dto로 써도 이점도 없고 차이는 없다. 단순히 개발자의 실수를 줄이기 위함.
CommentRepository.java
CommentJpaService.java
Transactional로 인해 두가지로 나뉜다.
1. Comment 테이블에 Insert
2. commentcount +1 (update)
마지막까지 완료 후 db에 들어가서 board의 외래키를 삭제해야 한다.
Postman에서 api요청 결과 정상적으로 댓글이 Post되었다.
'Spring boot' 카테고리의 다른 글
Spring boot (.war파일로 배포) (0) | 2021.11.03 |
---|---|
spring boot (.jar파일로 배포) (0) | 2021.11.02 |
Springboot (Jpa를 사용하여 Crud기능 구현) (0) | 2021.10.26 |
Spring boot (test호출시 sequence diagram) [3] (0) | 2021.10.20 |
Spring boot (test호출시 sequence diagram) [2] (0) | 2021.10.19 |