JPA 연관관계시 PK id가 숫자가 이어짐
393
작성한 질문수 49
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 값이 이어지는 것은 당신의 코드에서 의도한 동작일 가능성이 높습니다. 부가적으로, 데이터베이스에서 이어진 숫자 값이 중요한 요소라면, 다른 방법을 사용하여 숫자를 이어지지 않게 할 수도 있습니다.
더 자세한 도움이 필요하시면 언제든지 말씀해주세요. 좋은 하루 되세요!
강의 소스코드는 어디서 다운받을 수 있나요?
1
8
1
힌트 적용에 대해서
0
15
0
리프레시토큰
0
40
1
수료증 제공하나요?
0
40
1
로그인 확인
0
65
3
조회 대상 행이 적을 때도 Using filesort 제거를 고려해야 하나요?
0
62
2
PK를 AUTO_INCREMENT UUID를 UNIQUE로 하는것에 대해
0
68
2
Jib 빌드가 83%에서 멈추는 문제 해결(windows 사용자)
1
53
1
pk를 auto increment로 하는것에 대해서
0
61
2
서비스에서와 컨트롤러의 @Vaild 적용 차이에 대해서
0
67
2
해결했습니다
0
51
1
트랜잭션 내 Redis I/O 에 대한 궁금한점
1
50
1
지금 강의가 어려우신분 추천드립니다.
0
71
1
경쟁상태
0
64
1
기존의 완성된 CRUD의 Build.gradle에 security관련 dependency를 추가하면 문제가 생깁니다.
0
73
2
stmt
0
56
1
실행 통계2 explain analyze 조인 쿼리
0
67
1
EmailSender 관련 문의
0
67
1
CRA ? 질문입니다
0
65
1
[해결됨]마지막 강의 내용 수정 화면이 기능을 못하네요.
0
59
1
[해결됨]부분적으로 화면 이동이 안되는 부분이 있습니다.
0
93
6
68강 문제 풀이
0
50
1
현대 쿼리 복잡성에 관한 질문
0
118
3
key_length 가 사용되는곳
0
53
1





