본문 바로가기

개발46

[N+1 문제] EAGER로딩에서 N+1이 발생하지 않는 경우 다시, N+1 문제가 발생하는 이유 JPA에서 연관관계 매핑이 되어있는 데이터들을 조회할 때 N+1 문제가 발생한다. 예를 들면, 한 사람이 작성한 게시글을 조회할 때 User 테이블과 Article 테이블을 조인한 형태의 쿼리문을 원했지만, User 테이블에서 조회하고 이후에 Article 테이블에서 해당 유저가 작성한 게시글을 N번 조회하는 현상이다. 왜 이런 일이 발생할까? JPA가 내부적으로 사용하는 JPQL은 기본적으로 글로벌 Fetch 전략을 무시하고 JPQL만 갖고 SQL을 생성하기 때문에, JPA Repository로 find 시 실행하는 첫 쿼리에서 하위 엔티티까지 한 번에 가져오지 않고, 하위 엔티티를 사용할 때 추가로 조회한다. JPA는 대상이 되는 엔티티에만 신경을 써서 연관관계까지.. 2023. 10. 3.
[리팩토링] Spring-data-JPA와 Querydsl을 함께 사용하며 기존 코드 no offset paging을 구현하면서 querydsl을 사용하기 시작했다. 하지만 spring-data-jpa와 함께 사용하며 기존 코드는 다음과 같았다. public interface ReviewRepository extends JpaRepository { Review findByReviewId(Long reviewId); List findAllByUser(User user); } JpaRepository를 상속하는 ReviewRepository 인터페이스를 두고 querydsl을 사용하는 쿼리는 Service 단에 위치해 있었다. @Slf4j @Service @RequiredArgsConstructor public class ReviewService { private final Rev.. 2023. 10. 1.
MySQL 외래키와 데드락 엔티티 구조 Debate, DebateMember 엔티티가 있고, DebateMember에서 Debate에 대한 외래키를 갖는다. @Entity @Getter @Table(name = "debate_member") @NoArgsConstructor public class DebateMember { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "deb_mem_id") private Long debMemId; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "deb_id") private Debate debate; @ManyToOne(fetch = FetchType.LAZY) @.. 2023. 8. 17.
MySQL 비관적 락을 이용한 인원 제한 구현하기 틀린 부분이 있다면 언제든 알려주세요 debate Entity 토론방 pk: deb_id @Entity @Getter @Table(name = "debate") @NoArgsConstructor public class Debate { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "deb_id") private Long debateId; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "b_id") private Book book; @Column(name = "deb_topic") private String debateTopic; ... @OneToMany(mappedBy = .. 2023. 8. 17.
[N+1 문제] 일반조인, fetch조인으로 OSIV, LAZY/EAGER, N+1문제 확실히 이해하기 차례 일반조인 이해하기 일반조인에서 LazyInitializationException가 발생하는 상황 이해하기(feat. LAZY/EAGER, OSIV ON/OFF) 준영속 상태란? fetch조인 이해하기 일반조인 public interface BookRepository extends JpaRepository { @Query("SELECT b from Book b join b.bookCategory where b.bookPublisher = :bookPublisher") List findBooks(@Param("bookPublisher") String bookPublisher); } @Entity @Table(name = "book_info") @Getter public class Book { @Id @.. 2023. 8. 16.
[리팩토링] 함수형 인터페이스와 lambda 람다 익명 함수 함수를 하나의 식으로 표현한 것이다. 불필요한 코드를 줄이고 가독성을 높일 수 있다. // 람다 방식 (매개변수, ... ) -> { 실행문 ... } // 예시 () -> "Hello World!"; 함수형 인터페이스 1개의 추상 메서드를 갖는 인터페이스를 의미한다. java 8부터는 인터페이스에 구현체가 있는 default method, static method를 추가할 수 있는데, 여러 default method, static method가 있더라도 추상 메서드가 오직 하나인 경우를 함수형 인터페이스라고 한다. lambda 표현식은 함수형 인터페이스로만 사용 가능하다. @FunctionalInterface 애노테이션은 해당 인터페이스가 함수형 인터페이스 조건에 맞는지 검사한다. @F.. 2023. 8. 16.