본문 바로가기

JPA4

JPA Auditing 으로 CreatedDate / LastModifiedDate 기능 넣기 JPA 로 RDB와 엔티티를 매핑하다 보면, 항상 생성일과 수정일을 기본적으로 넣어 두고, 누가 언제 생성 혹은 수정하였는지 기록을 하여 감시를 하는것이 일반적입니다. 그렇다면 엔티티에 매번 매핑을 해야 하는데, 그것보다 JPA 에서는 Aduiting 기능을 제공함으로 그 기능을 이용해서 중복 코드를 제거해보도록 해보도록 하겠습니다. 1. AuditingEntity 생성 @MappedSuperclass @EntityListeners(AuditingEntityListener::class) class AuditingEntity { @CreatedDate @Column(updatable = false, nullable = false) var createdAt: LocalDateTime = LocalDateTi.. 2021. 2. 22.
JPA Fetch Join과 페이징 문제 JPA 로 개발을 할때, 컬렉션을 Fetch Join 하면 페이징 조회 시 메모리에서 페이징 처리하는 문제가 있다. 데이터가 적으면 크게 상관은 없겠지만, 데이터가 많다고 한다면 큰 문제가 발생하게 된다. 아래와 같은 경고 메시지가 출력된다. 경고 메시지 HHH000104: firstResult/maxResults specified with collection fetch; applying in memory! 아래와 같이 엔티티를 정의해 보자 @Entity public class Category { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private long id; private String name; @ManyToMany(mappedBy = .. 2020. 9. 22.
JPA - ManyToMany 관계시 Set과 List의 차이 JPA 로 개발을 할때, @ManyToMany 관계를 맺는 경우가 있는데, 이때 Set 과 List 의 차이점을 알고 사용하도록 하자. Category - Article 관계가 n:m 이라고 가정을 하자. @ManyToMany 관계시 List 를 사용하였을 경우 @Entity public class Category { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private long id; private String name; @ManyToMany(mappedBy = "categories") private List articles = new ArrayList(); public void deleteArticle(Article article) { ar.. 2020. 8. 11.
Optimistic Lock과 Pessimistic Lock 낙관적 락 (Optimistic Lock) 트랜잭션 대부분은 충돌이 발생하지 않을 것이라고 낙관적으로 접근하는 방식 어플리케이션 레벨에서 Lock 을 건다. 데이터를 읽는 시점에 Lock을 걸지 않고, 수정을 하려고 할때 데이터가 변경되었는지 확인하고 데이터를 변경을 시도한다. @Version JPA의 @Version 어노테이션을 제공하고 있다. 엔티티가 수정될때 마다 자동으로 버전을 증가 시키며, 커밋을 하기 전에 엔티티의 버전과 DB의 버전이 같은지 확인을 한다. 버전이 다르면 OptimisticLockException 을 발생 시킨다. 지원하는 타입은 long, Long int, Integer, short, Short, timestamp @Version private Integer version; .. 2020. 4. 15.