Framework/JPA

문제 배경 내가 작성한 리뷰를 조회하는 API를 스프링 데이터 JPA의 페이징 처리를 통해 구현했다. 현재 API를 호출했을 때 실행되는 SQL 쿼리문을 보면 N+1 문제가 발생한다. 실행되는 SQL 쿼리문 2024-02-11 18:31:29.479 INFO 29300 --- [nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet' 2024-02-11 18:31:29.479 INFO 29300 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServl..
순수 JPA에서의 DTO 조회 JPA에서 프로젝션으로 여러 타입의 필드를 조회하기 위한 방법 중 하나이다. new 명령어 사용해야 한다. DTO의 package 이름을 다 적어야 한다. 생성자 방식만 지원한다. List result = em.createQuery( "select new jpql.MemberDTO(m.username, m.age) from Member m", MemberDTO.class ).getResultList(); 위와 같이 패키지명을 작성해야 하는 불편함은 QueryDSL을 사용하여 극복할 수 있다. QueryDSL에서의 DTO 조회 기본적으로 QueryDSL에서는 프로젝션 대상으로 여러 필드를 선택하게 되면 Tuple이라는 타입을 리턴해준다. List fetch = query.se..
https://youtu.be/brE0tYOV9jQ위의 백기선님 영상에서 제시된 문제의 원인을 연관관계 매핑 시 @JoinColumn을 선언하지 않아서라고 생각했다. 하지만 답은 연관관계 편의 메서드를 통해 객체의 연관관계를 양방향으로 설정하지 않은 것이었다.다대일 매핑 시 항상 @JoinColumn을 선언했었는데, 위의 영상으로 인해 @JoinColumn의 역할에 대해 자세히 공부해 볼 필요성을 느꼈다. 예제로 진행할 전체 코드는 아래와 같다. Book 클래스@Entitypublic class Book { @Id @GeneratedValue private Integer id; private String isbn; private String title; @ManyToOne ..
@MappedSupperclass @MappedSupperclass는 상속 관계 매핑에서 사용되는 어노테이션이다. @MappedSuperclass public abstract class Timestamped { private LocalDateTime createdDate; private LocalDateTime modifiedDate; ... } @Entity public class Member extends BaseEntity { ... } 해당 어노테이션에 선언된 클래스는 테이블과 매핑되지 않으며, 자식 클래스에게 매핑 정보만 제공한다. 이를 통해 자식 클래스는 부모 클래스의 필드를 상속받아 사용할 수 있다. → 중복 코드를 줄이고 객체 지향적인 설계를 할 수 있다. @Embedded & @Embed..
JPA에서 양방향으로 연결된 엔티티를 json으로 직렬화할 때, 즉, Entity To Json serialize할 때 (보통 controller 단) 순한 참조가 발생할 수 있다. 이를 해결하기 위해 Jackson 라이브러리의 @JsonIgnore 어노테이션이나 @JsonManagedReference & @JsonBackReference 어노테이션을 사용하여 직렬화를 제한할 수 있다. Jackson은 스프링에서 JSON을 다룰 때 사용하는 라이브러리다. spring-boot-stater-web 의존성을 주입하면 Jackson 라이브러리가 자동으로 포함된다. 1. @JsonIgnore 필드 레벨에 적용되어 직렬화 시 포함시키고 싶지 않은 필드에 선언한다. @Entity public class Team {..
jyjyjy25
'Framework/JPA' 카테고리의 글 목록