데이터를 삭제하는 방법을 크게 5가지 분류로 나누어 정리한 내용입니다.
데이터 삭제 방법
- 외래 키(FK)에 걸기:
부모 엔티티 삭제 시 관련된 자식 엔티티도 자동으로 삭제되도록 설정합니다. (cascade 설정)
@OnDelete(action = OnDeleteAction.CASCADE)
@ManyToOne(fetch = FetchType.LAZY)
private Board board;
- 게시글 삭제 시 댓글을
null
로 업데이트:
부모 엔티티 삭제 시 자식 엔티티의 외래 키를
null
로 설정하여 관계를 해제합니다.// 게시글 삭제 로직에서 댓글의 board를 null로 업데이트
public void deleteBoard(Board board) {
List<Reply> replies = replyRepository.findByBoard(board);
for (Reply reply : replies) {
reply.setBoard(null);
replyRepository.save(reply);
}
boardRepository.delete(board);
}
- 게시글 삭제 시 댓글을 직접 삭제하기 (쿼리 튜닝):
부모 엔티티 삭제 시 자식 엔티티를 직접 삭제하는 쿼리를 실행합니다.
// 게시글 삭제 로직에서 댓글을 먼저 삭제
public void deleteBoard(Board board) {
replyRepository.deleteByBoard(board);
boardRepository.delete(board);
}
- 제약 조건 해제 후 삭제:
외래 키 제약 조건을 해제하여 관계를 자유롭게 관리할 수 있도록 합니다.
@JoinColumn(foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT))
@ManyToOne(fetch = FetchType.LAZY)
private Board board;
- (가장 중요!)실무에서 주로 사용하는 방법 (논리적 삭제):
데이터베이스에서 실제로 데이터를 삭제하지 않고, 특정 칼럼을 사용하여 삭제된 것처럼 처리합니다.
@ManyToOne(fetch = FetchType.LAZY)
private Board board;
@Column(nullable = false)
private boolean visible = true;
@Column(nullable = true)
private Timestamp updatedAt;
public void delete() {
this.visible = false;
this.updatedAt = new Timestamp(System.currentTimeMillis());
}
Share article