JAVA/JPA4 [JPA] Soft Delete 적용과 @Where, @SQLDelete 프로젝트 중 hard delete 에서 soft delete 로 리팩토링한 과정과 @Where, @SQLDelete 에 관한 생각이다. Spring boot + JPA 로 프로젝트 진행 중, delete 관련 에러가 생겼고 관련 코드를 보며 앞으로의 delete 에러를 줄이기 위해서는 hard delete 가 아닌 soft delete 로 리팩토링 해야겠다는 생각을 했다. Soft Delete vs Hard Delete soft delete (물리 삭제) 는 SQL 의 delete 를 사용해 실제로 데이터를 삭제하는 방법이다. hard delete (논리 삭제) 는 삭제 여부를 판단하는 필드를 만든 후, 해당 필드를 SQL 의 update 를 통해 변경하여 삭제가 되었다고 표기하는 방법이다. 이때, 다른.. 2023. 9. 6. [JPA] DirtyCheck vs merge 준영속(detached) 엔티티 준영속 엔티티란 준영속 상태의 엔티티로 JPA가 더는 관리하지 않는 엔티티, 즉 영속성 컨텍스트에 저장되었다가 분리된 상태인 엔티티를 말한다. 또한, DB에 한번 저장된 엔티티는 식별자가 존재하는데, 기존 식별자를 가지고 있다면 준영속 엔티티로 볼 수 있다. 준영속 엔티티는 영속성 컨텍스트가 제공하는 기능을 사용하지 못한다. /* 준영속 상태로 만드는 방법 */ em.detach(entity); // 특정 엔티티 준영속 상태로 전환 em.clear(); // 영속성 컨텍스트 초기화 em.close(); // 영속성 컨텍스트 종료 Item item = new Item(); item.setId(id); // id가 기존 식별자라면 기존 식별자를 가진 item은 준영속 엔티티라.. 2022. 5. 15. [JPA] getSingleResult() 와 null 토이프로젝트 중 발생한 에러에 대해 원인을 찾고 정리하였다. 당시 상황은 다음과 같다. public Optional findByEmail(String email) { return Optional.ofNullable( em.createQuery("select u from User u where u.email = :email", User.class) .setParameter("email", email) .getSingleResult()); } UserRepository에 findByEmail 메서드를 생성하고 쿼리문의 반환값이 null일수도 있다 생각하여 Optional을 통해 wrapping 했다. private void validateDuplicateUserByEmail(User user) { Optio.. 2022. 3. 22. [JPA] CascadeType.REMOVE vs orphanRemoval = true 토이프로젝트 중 CascadeType.REMOVE 와 orphanRemoval = true 가 헷갈려 둘의 차이를 찾고 정리하였다. 당시 상황은 다음과 같다. @Entity @Getter @Table(name = "orders") public class Order { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "order_id") private Long id; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "user_id") private User user; @OneToOne(fetch = FetchType.LAZY,cascade = CascadeType.ALL) @Joi.. 2022. 3. 19. 이전 1 다음