Spring/JPA
-
JPA - OSIV와 성능 최적화Spring/JPA 2022. 3. 24. 10:33
OSIV와 성능 최적화 Open Session In View : 하이버네이트 Open EntityManager In View : JPA (관례상 OSIV라 한다) OSIV ON spring.jpa.open-in-view=true // OSIV 기본값 OSIV 전략은 트랜잭션 시작처럼 최초 데이터베이스 커넥션 시작 시점부터 API 응답이 끝날 때까지 영속성 컨텍스트와 데이터베이스 커넥션을 유지한다. 즉, 영속성 컨텍스트가 데이터베이스 커넥션을 응답을 보낼 때까지 유지하여 지금까지 View Template이나 API 컨트롤러에서 지연 로딩이 가능했던 것이다. 그런데 이 전략은 너무 오랜 시간 동안 데이터베이스 커넥션 리소스를 사용하기 때문에, 실시간 트래픽이 중요한 애플리케이션에서는 커넥션이 모자랄 수 있고..
-
JPA - API 개발 고급(OneToMany 컬렉션 조회 최적화)Spring/JPA 2022. 3. 23. 17:31
API 개발 고급(컬렉션 조회 최적화) 엔티티 직접 노출 엔티티를 DTO로 변환 - 페치 조인 최적화 JPA에서 DTO 직접 조회 - 컬렉션 조회 최적화 대부분의 성능 문제는 조회에서 발생하므로 컬렉션인 OneToMany 관계에서의 조회에 대한 성능 최적화에 대해 알아보자. 엔티티 직접 노출 항상 강조하지만 엔티티를 직접 전달하는 방법은 여러 문제가 발생할 뿐만 아니라 유지보수에도 문제가 생긴다. 따라서 참고만 하고 DTO를 사용하자. 지연로딩으로 인한 문제 지연 로딩으로 인해 JSON은 Order 엔티티가 갖고 있는 OrderItem를 proxy 객체로 가지고 있게 된다. proxy 객체로 가지고 있다는 것은 실제로 OrderItem 엔티티의 정보가 없고 OrderItem 엔티티의 정보를 접근할 시점에..
-
JPA - API 개발 고급(OneToOne, ManyToOne 지연 로딩과 조회 성능 최적화)Spring/JPA 2022. 3. 22. 20:11
API 개발 고급(OneToOne, ManyToOne 지연 로딩과 조회 성능 최적화) 엔티티를 직접 노출 엔티티를 DTO로 변환 - 페치 조인 최적화 JPA에서 DTO로 바로 조회 대부분의 성능 문제는 조회에서 발생하므로 OneToOne, ManyToOne 관계에서의 조회에 대한 성능 최적화에 대해 알아보자. 엔티티를 직접 노출 항상 강조하지만 엔티티를 직접 전달하는 방법은 여러 문제가 발생할 뿐만 아니라 유지보수에도 문제가 생긴다. 따라서 참고만 하고 DTO를 사용하자. 문제 1 - 양방향 연관관계에서의 문제 @RestController @RequiredArgsConstructor public class OrderSimpleApiController { private final OrderRepositor..
-
JPA - API 기본Spring/JPA 2022. 3. 21. 19:31
API에서는 하나만 기억하면 된다. 파라미터를 받거나 전송할 때 Entity를 사용하지 않고 DTO를 사용해야하는 것을 명심하자. DTO 사용 시 이점 엔티티 대신에 RequestBody와 ResponseBody에 각각 DTO를 매핑한다. 엔티티와 프레젠테이션(화면) 계층을 위한 로직을 분리할 수 있다. 엔티티와 API 스펙을 명확하게 분리할 수 있다. 엔티티가 변해도 API 스펙이 변하지 않는다. 실무에서는 엔티티를 API 스펙에 노출하면 안된다. 엔티티로 매핑시 문제점 엔티티에 프레젠테이션 계층을 위한 로직이 추가된다 엔티티에 API 검증을 위한 로직이 들어간다.(@NotEmpty 등) 실무에서는 회원 엔티티를 위한 API가 다양하게 만들어지는데, 한 엔티티에 각각의 API를 위한 모든 요청 요구사항..
-
JPA - Entity 설계시 주의점Spring/JPA 2022. 3. 16. 19:18
Entity 설계 시 주의점 Entity 설계 시 다음과 같은 사항들을 주의해야한다. 엔티티에는 가급적 Seter를 사용 금지 Setter를 무분별하게 사용하게 되면 어디서 해당 값이 변경되었는지 추적하기가 힘들어진다. 즉, 유지보수가 어려워지기 때문에 사용하지 않는 것이 좋다. Setter가 필요할 경우에는 추적하기 쉽도록 메서드를 따로 생성해준다. @Entity @Getter public abstract class Item { @Id @GeneratedValue @Column(name = "item_id") private Long id; private String name; private int price; private int stockQuantity; // Setter 대신 생성해준 메서드 pub..
-
JPA - 설계 순서Spring/JPA 2022. 3. 16. 15:50
김영한님이 추천하는 설계 순서는 다음과 같다. 1. 엔티티 클래스 설계 엔티티 클래스를 설계하고 필요하면 엔티티를 UML로 그린다 2. DB 테이블 설계 엔티티 클래스 설계 단계에서 사실 필요한 DB 테이블의 그림 어느정도 그려진다 여기서 ERD를 그리고 DB 특성에 맞는 PK, FK, INDEX, 제약조건 같은 부분에 초점을 맞춘다. 3. 엔티티 클래스와 DB 테이블 설계를 성능과 제약에 맞추어 양방향으로 조율 엔티티 클래스 객체를 중심으로 설계해도, 현실적으로 DB에 데이터를 넣어야 하므로, 구조적 한계가 있을 수 있다. 성능 때문에 역정규화가 필요할 때도 있다. 이런 부분을 고려해서 엔티티 클래스를 DB에 맞추는 과정을 반복한다.
-
JPA - JPQL 기본 문법 2Spring/JPA 2022. 3. 11. 17:56
기본 문법 2 경로 표현식 용어 특징 탐색 명시적 조인과 묵시적 조인 페치 조인(fetch join) 엔티티 페치 조인 컬렉션 페치 조인 페치 조인과 일반 조인의 차이 페치 조인의 한계 다형성 쿼리 쿼리에 엔티티 직접 사용 벌크 연산 경로 표현식 점( . )을 찍어 객체 그래프를 탐색하는 것을 말한다. select m.username -> 상태 필드 from Member m join m.team t -> 단일 값 연관 필드 join m.orders o -> 컬렉션 값 연관 필드 where t.name = '팀A' 경로 표현식 용어 상태 필드(state filed) : 단순히 값을 저장하기 위한 필드(예시 : m.username) 연관 필드(association field) : 연관관계를 위한 필드 - 단..
-
JPA - JPQL 기본 문법과 기능Spring/JPA 2022. 3. 11. 14:56
JPQL 기본 문법과 기능 JPA가 지원하는 다양한 쿼리 JPQL 기본 문법 집합과 정렬 반환 타입 결과 조회 파라미터 바인딩 프로젝션(SELECT) 프로젝션(SELECT) - 여러 값 조회 페이징 API 조인 ON절을 활용한 조인 서브 쿼리 JPQL 타입 표현 조건식 - CASE JPQL 기본 함수 JPA가 지원하는 다양한 쿼리 JPQL 검색을 할 때 테이블이 아닌 엔티티 객체를 대상으로 검색 필요한 데이터만 DB에서 불러오기 위해 검색 조건이 포함된 SQL SQL을 추상화한 JPQL이라는 객체 지향 쿼리 언어(특정 DB SQL에 의존 X) SQL과 유사하며 SELECT, FROM, WHERE, GROUP BY, HAVING, JOIN 지원 JPQL은 엔티티 객체를 대상으로 쿼리를 작성한다. //검색 ..