본문 바로가기

JAVA/JPA

(4)
[JPA] 성능 최적화하기_N+1 문제 회사에서 맡은 서비스맵을 성능적인 측면에서 개선할 수 있는 포인트들을 찾아 기록하기 N+1 문제 개선하기 하이버네이트의 연관관계를 사용할 때, 고려해야 할 가장 기본적인 요인이라고 생각한다. 즉시 로딩과 N+1 Member 엔티티와 Order 엔티티의 관계가 1:N, N:1 양방향 연관관계라고 가정하자. 이런한 상황에 특정 회원 하나를 em.find() 메소드를 조회하면 즉시 로딩으로 설정한 주문(Order) 정보도 함께 조회된다. SELECT M.*, O.* FROM MEMBER M OUTER JOIN ORDERS O ON M.ID=O.MEMBER_ID여기까지만 보면 즉시 로딩이 상당이 좋아보이지만, 문제는 JPQL을 사용할 때 발생한다. 다음 코드를 보면, List
[동시성] 동시성 문제 해소하기(JPA)_개념 동시성은 모든 소프트웨어 시스템의 핵심적인 요구 사항이다. 이러한 동시성을 만족시킬 수 있는 소프트웨어 개발 시 겪을 수 있는 난관이 있는데, 시스템의 상태를 최신으로 유지하고 데이터베이스의 race contions(경쟁상태)나 stale state(부실 상태)를 피해야 하는 것이다. 동시성 문제란 두 개 이상의 세션이 공통된 자원에 대해서, 모두 읽고 쓰는 작업(Read -> Write)을 하려고 하는 경우 발생할 수 있는 문제를 가리킨다. 동시성 문제는 "완전한 해결"이 아닌 "적절한 해결(제어)"이다. "정확성"과 "활동성"을 어떻게 하면 모두 최대로 할 수 있을까"에 대한 고민 "활동성(빠르기)"를 포기하면 정확성을 높일 수 있고, 반대로 "정확성"을 포기하면 "활동성"을 높일 수 있다. 동시성 ..
ManyToOne 관계와 연관관계 맵핑을 효율적으로 사용하기[기본] ManyToOne 관계를 가지고 있는 자식 엔티티를 등록할 때, 단순히 외래키만을 사용하지만 엔티티 자체를 조회해서 사용하는 모습이 더러보였다. 불필요한 리소스 낭비이기 때문에 좀 더 효율적으로 연관관계를 사용하는 게 필요해 보여 정리하게 됐다. @ManyToOne 관게는 가장 흔한 관계이기 때문에, 어떻게 적절하게 맵핑하는 지를 아는 것은 App의 성능에 큰 영향을 준다. 테이블 관계 post_comment 테이블은 post테이블의 id를 외래키로 가지는 ManyToOne 관계 @Entity @Table public class PostComment { @Id @GeneratedValue private Long id; private String review; @ManyToOne(fetch = FetchT..
[Hibernate] @Notnull vs @ NotEmpty vs @NotBlank 속성에 null 값을 금지할 때 @Notnull을 많이 사용했었다. 이와 비슷한 annotation이면서 조금씩 차이가 있는 @NotEmpty, @NotBlank가 있는데 그 차이를 알아보자. ==================================================================== 1. @NotNull : CharSequence, Collection, Map or Array의 객체가 null일 수 없다. 그러나 empty는 가능하다. 2. @NotEmpty : CharSequence, Collection, Map or Array의 객체가 null과 empty 값(size > 0)이 될 수 없다 3. @NotBlank : 'String'이 null일 수 없으며, legnt..