작성
·
339
0
JPA 연관관계를 맺어서 게시글과 댓글을 구현하는데 각 테이블이 1번으로 시작하는게 아니라 이어지는 상황이 생겨서 이게 정상적인가 의문이 들어서 질문을 드립니다. 기능은 제대로 돌아가는데 등록, 수정, 삭제 잘되는데 제가 알기론 id는 auto_increment 기능이면 각자 테이블에서 1번 부터 시작해서 자동증가로 알고있는데 여기는 이어지다 보니 의문이 생겨서
@Entity(name = "board")
@ToString
@Table
@Getter
@NoArgsConstructor
public class BoardEntity extends BaseEntity{
@Id @GeneratedValue
@Column(name = "board_id")
private Long boardId;
private String title;
private String contents;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "member_id")
private MemberEntity member;
@OneToMany(mappedBy = "boardEntity", cascade = CascadeType.ALL)
// 댓글 정렬
@OrderBy("id asc")
private List<CommentEntity> comments = new ArrayList<>();
@Builder
public BoardEntity(Long boardId,
String title,
String contents,
MemberEntity member,
List<CommentEntity> comments) {
this.boardId = boardId;
this.title = title;
this.contents = contents;
this.member = member;
this.comments = comments;
}
}
@Entity(name = "comment")
@Table
@Getter
@NoArgsConstructor
public class CommentEntity extends BaseTimeEnity{
@Id @GeneratedValue
@Column(name = "comment_id")
private Long id;
private String comment;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "board_id")
private BoardEntity boardEntity;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "member_id")
private MemberEntity memberEntity;
@Builder
public CommentEntity(Long id, String comment, BoardEntity boardEntity, MemberEntity memberEntity) {
this.id = id;
this.comment = comment;
this.boardEntity = boardEntity;
this.memberEntity = memberEntity;
}
}
@RequiredArgsConstructor
@Service
@Transactional
public class CommentService {
private final CommentRepository commentRepository;
private final MemberRepository memberRepository;
private final BoardRepository boardRepository;
// 댓글 작성
public ResponseEntity<?> save(Long boardId,
CommentDTO commentDTO,
String memberEmail) {
MemberEntity findMember = memberRepository.findByMemberEmail(memberEmail);
BoardEntity findBoard = boardRepository.findById(boardId)
.orElseThrow(EntityNotFoundException::new);
List<CommentEntity> commentEntities = new ArrayList<>();
if(findMember != null) {
CommentEntity commentEntity = CommentEntity.builder()
.comment(commentDTO.getComments())
.boardEntity(findBoard)
.memberEntity(findMember)
.build();
CommentEntity saveComment = commentRepository.save(commentEntity);
commentEntities.add(saveComment);
findBoard = BoardEntity.builder()
.boardId(findBoard.getBoardId())
.title(findBoard.getTitle())
.contents(findBoard.getContents())
.member(findMember)
.comments(commentEntities)
.build();
boardRepository.save(findBoard);
CommentDTO commentDTO1 = CommentDTO.toCommentDTO(saveComment);
return ResponseEntity.ok().body(commentDTO1);
} else {
return ResponseEntity.notFound().build();
}
}
// 댓글 삭제
public String remove(Long boardId,
Long commentId,
String memberEmail) {
BoardEntity findBoard = boardRepository.findById(boardId)
.orElseThrow(EntityNotFoundException::new);
CommentEntity findComment = commentRepository.findById(commentId)
.orElseThrow(EntityNotFoundException::new);
MemberEntity findMember = memberRepository.findByMemberEmail(memberEmail);
boolean equalsEmail =
findMember.getMemberEmail().equals(findComment.getMemberEntity().getMemberEmail());
boolean equalsId = findComment.getBoardEntity().getBoardId().equals(findBoard.getBoardId());
if(equalsEmail && equalsId) {
commentRepository.deleteById(findComment.getId());
return "댓글을 삭제했습니다.";
} else {
return "해당 이메일의 댓글이 아닙니다.";
}
}
// 댓글 수정
public ResponseEntity<?> update(Long boardId,
Long commentId,
CommentDTO commentDTO,
String memberEmail) {
BoardEntity findBoard = boardRepository.findById(boardId)
.orElseThrow(EntityNotFoundException::new);
CommentEntity findComment = commentRepository.findById(commentId)
.orElseThrow(EntityNotFoundException::new);
MemberEntity findMember = memberRepository.findByMemberEmail(memberEmail);
boolean equalsEmail =
findMember.getMemberEmail().equals(findComment.getMemberEntity().getMemberEmail());
boolean equalsId =
findComment.getBoardEntity().getBoardId().equals(findBoard.getBoardId());
List<CommentEntity> commentEntities = new ArrayList<>();
if(equalsEmail && equalsId) {
findComment = CommentEntity.builder()
.id(findComment.getId())
.comment(commentDTO.getComments())
.boardEntity(findBoard)
.memberEntity(findMember)
.build();
CommentEntity saveComment = commentRepository.save(findComment);
commentEntities.add(saveComment);
findBoard = BoardEntity.builder()
.boardId(findBoard.getBoardId())
.contents(findBoard.getContents())
.title(findBoard.getTitle())
.member(findBoard.getMember())
.comments(commentEntities)
.build();
boardRepository.save(findBoard);
CommentDTO returnComment = CommentDTO.toCommentDTO(saveComment);
return ResponseEntity.ok().body(returnComment);
} else {
return ResponseEntity.badRequest().body("일치하지 않습니다.");
}
}
}
답변 1
0
안녕하세요, 인프런 AI 인턴이에요. JPA 연관관계를 맺어서 게시글과 댓글을 구현하고 계시는데, 각 테이블의 id가 숫자가 이어지는 상황이 생겼다고 하셨네요.
JPA에서는 @GeneratedValue 어노테이션을 사용하여 자동으로 id 값을 생성할 수 있습니다. 기본적으로는 auto_increment 기능으로 각 테이블마다 1번부터 시작해서 자동으로 증가하는 값을 할당합니다. 따라서, 보통은 각 테이블의 id 값이 숫자가 이어지게 됩니다.
그런데, 여러 테이블이 연관관계를 맺을 때는 연관되는 테이블의 id 값이 다른 테이블의 외래키로 사용됩니다. 이 때 연관 테이블의 id 값은 자동증가로 생성되지 않기 때문에 숫자가 이어질 수 있습니다.
제공해주신 코드를 보니 @ManyToOne과 @OneToMany 어노테이션을 사용하여 연관관계를 설정하고 계신데, 이런 경우에는 주 테이블의 id 값은 순차적으로 증가하고, 연관된 테이블의 외래키로 사용됩니다. 그래서 주 테이블의 id 값은 이어진 숫자가 될 수 있어요. 그리고 연관된 테이블의 id 값은 주 테이블과는 별개로 생성되기 때문에 순차적인 값이 아닐 수 있습니다.
큰 문제가 없으면서 기능도 정상적으로 동작한다면, 이렇게 id 값이 이어지는 것은 당신의 코드에서 의도한 동작일 가능성이 높습니다. 부가적으로, 데이터베이스에서 이어진 숫자 값이 중요한 요소라면, 다른 방법을 사용하여 숫자를 이어지지 않게 할 수도 있습니다.
더 자세한 도움이 필요하시면 언제든지 말씀해주세요. 좋은 하루 되세요!