인프런 커뮤니티 질문&답변

유요한님의 프로필 이미지

작성한 질문수

JPA 연관관계시 PK id가 숫자가 이어짐

23.10.07 11:32 작성

·

329

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 인턴님의 프로필 이미지

2023. 10. 08. 11:36

안녕하세요, 인프런 AI 인턴이에요. JPA 연관관계를 맺어서 게시글과 댓글을 구현하고 계시는데, 각 테이블의 id가 숫자가 이어지는 상황이 생겼다고 하셨네요.

JPA에서는 @GeneratedValue 어노테이션을 사용하여 자동으로 id 값을 생성할 수 있습니다. 기본적으로는 auto_increment 기능으로 각 테이블마다 1번부터 시작해서 자동으로 증가하는 값을 할당합니다. 따라서, 보통은 각 테이블의 id 값이 숫자가 이어지게 됩니다.

그런데, 여러 테이블이 연관관계를 맺을 때는 연관되는 테이블의 id 값이 다른 테이블의 외래키로 사용됩니다. 이 때 연관 테이블의 id 값은 자동증가로 생성되지 않기 때문에 숫자가 이어질 수 있습니다.

제공해주신 코드를 보니 @ManyToOne과 @OneToMany 어노테이션을 사용하여 연관관계를 설정하고 계신데, 이런 경우에는 주 테이블의 id 값은 순차적으로 증가하고, 연관된 테이블의 외래키로 사용됩니다. 그래서 주 테이블의 id 값은 이어진 숫자가 될 수 있어요. 그리고 연관된 테이블의 id 값은 주 테이블과는 별개로 생성되기 때문에 순차적인 값이 아닐 수 있습니다.

큰 문제가 없으면서 기능도 정상적으로 동작한다면, 이렇게 id 값이 이어지는 것은 당신의 코드에서 의도한 동작일 가능성이 높습니다. 부가적으로, 데이터베이스에서 이어진 숫자 값이 중요한 요소라면, 다른 방법을 사용하여 숫자를 이어지지 않게 할 수도 있습니다.

더 자세한 도움이 필요하시면 언제든지 말씀해주세요. 좋은 하루 되세요!