orm16 [쿠링] Spring JDBC를 사용한 Batch Insert 구현과 고민 예전부터 시간 나면 해결하고 싶었던 문제 중 하나인 Batch(Bulk) insert에 대한 구현을 하며 이번글을 남기게 되었다. 기존에 주로 사용해 왔던 JPA의 한계로 인하여 이러한 결정을 하게 되었는데, 어떤 문제점과 고민이 있었는지 이번 글을 통하여 공유해 볼까? 한다. 고민 1 : JPA가 무엇인가? 이것부터 생각해 보기 기존에 내가 사용하던 ORM 기술인 JPA는 ORM의 대표 기술이다. 그럼 ORM은 어떤 철학을 갖고 설계된 것일까? 이를 wiki에서 검색해 보았다! ORM (Object–relational mapping) Object–relational mapping (ORM, O/RM, and O/R mapping tool) in computer science is a programmin.. BackEnd/쿠링 2024. 1. 14. [JPA] 예제 도메인 모델 내가 공부한 것을 올리며, 중요한 단원은 저 자신도 곱씹어 볼 겸 상세히 기록하고 얕은 부분들은 가볍게 포스팅하겠습니다. 1. 예제 도메인 모델과 동작확인 " data-ke-type="html"> HTML 삽입 미리보기할 수 없는 소스 앞으로 활용할 간단한 도메인 entity를 하나 만들어보자. 다음과 같다. 위 다이어그램을 통해 만들어지는 Entity는 다음과 같다. Member : Team = N : 1 의 연관관계를 가지고 있다. 1. Member 코드 @Entity @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) @ToString(of = {"id", "username", "age"}) public class Member { @Id @Gen.. BackEnd/JPA 2022. 5. 2. [JPA] 컬렉션 조회 최적화 - 4 내가 공부한 것을 올리며, 중요한 단원은 저 자신도 곱씹어 볼 겸 상세히 기록하고 얕은 부분들은 가볍게 포스팅하겠습니다. 7. 주문 조회 V6: JPA에서 DTO로 직접 조회, 플랫 데이터 최적화 " data-ke-type="html"> HTML 삽입 미리보기할 수 없는 소스 이번시간에는 지난 V5 버전을 더욱 최적화 하여 쿼리1 번으로 끝내보자! 우선 컨트롤러는 다음과 같다. @GetMapping("/api/v6/orders") public List ordersV6() { return orderQueryRepository.findAllByDtoFlat(); } 이번에는 데이터를 한번에 가져오기 위해 Order, OrderItems, Item을 전부 Join할 것 이다. 다만 그냥 Join을 하게 되면 .. BackEnd/JPA 2022. 4. 24. [JPA] 컬렉션 조회 최적화 - 3 내가 공부한 것을 올리며, 중요한 단원은 저 자신도 곱씹어 볼 겸 상세히 기록하고 얕은 부분들은 가볍게 포스팅하겠습니다. 5. 주문 조회 V4: JPA에서 DTO 직접 조회 " data-ke-type="html"> HTML 삽입 미리보기할 수 없는 소스 이번 시간에는 DTO를 직접 반환하도록 코드를 변경해 보자. join을 해도 tuple의 수가 증가하지 않는 ToOne 관계는 JOIN으로 최적화 하기 쉬우므로 한번에 조회하고, ToMany 관계는 최적화 하기 어려우므로 findOrderItems() 같은 별도의 메서드를 만들어 처리할 것 이다. 우선 컨트롤러는 다음과 같다. @GetMapping("/api/v4/orders") public List ordersV4() { return orderQuery.. BackEnd/JPA 2022. 4. 24. [JPA] 컬렉션 조회 최적화 - 2 내가 공부한 것을 올리며, 중요한 단원은 저 자신도 곱씹어 볼 겸 상세히 기록하고 얕은 부분들은 가볍게 포스팅하겠습니다. 3. 주문 조회 V3: 엔티티를 DTO로 변환 - 페치 조인 최적화 " data-ke-type="html"> HTML 삽입 미리보기할 수 없는 소스 이번시간에는 Fetch Join을 통해 N+1 문제를 해결해보자. 이번 글에서 원래목적은 Order : OrderItems = 1 : N 의 관계에서, Order 기준에서 페이징처리를 하는 것 이 목적이다. 1) 컬력션 Fetch Join과 문제점 변경된 컨트롤러는 다음과 같다. @GetMapping("/api/v3/orders") public List ordersV3() { List orders = orderRepository.findA.. BackEnd/JPA 2022. 4. 23. [JPA] 컬렉션 조회 최적화 - 1 내가 공부한 것을 올리며, 중요한 단원은 저 자신도 곱씹어 볼 겸 상세히 기록하고 얕은 부분들은 가볍게 포스팅하겠습니다. 1. 주문 조회 V1: 엔티티 직접 노출 " data-ke-type="html"> HTML 삽입 미리보기할 수 없는 소스 컬렉션 조회같은 경우 1:N 에서 N의 데이터 수가 3건 이라면, JOIN시 1쪽 또한 3건으로 증가해 버린다. Order - OrderItem - Item 의 연관관계가 (1 : N) (N : 1) 로 되어있는 상황이다. Order 와 Item의 다대다 관계를 중간 Order_Item 테이블을 통하여 만든 상황이다. 우선 다음 컨트롤러를 확인해 보자. @RestController @RequiredArgsConstructor public class OrderApiC.. BackEnd/JPA 2022. 4. 22. [JPA] 지연 로딩과 조회 성능 최적화 - 2 내가 공부한 것을 올리며, 중요한 단원은 저 자신도 곱씹어 볼 겸 상세히 기록하고 얕은 부분들은 가볍게 포스팅하겠습니다. 간단한 주문 조회 V3: 엔티티를 DTO로 변환 - 페치 조인 최적화 " data-ke-type="html"> HTML 삽입 미리보기할 수 없는 소스 이번시간에는 Join Fetch를 이용하여 성능 개선을 이루어 낼 것 이다! 우선 V3의 메서드는 다음과 같다. @GetMapping("/api/v3/simple-orders") public List ordersV3() { List orders = orderRepository.findAllWithMemberDelivery(); return orders.stream() .map(SimpleOrderDto::new) .collect(Coll.. BackEnd/JPA 2022. 4. 20. [JPA] 객체지향 쿼리 언어 4 (중급 문법) 내가 공부한것을 올리며, 중요한 단원은 저 자신도 곱씹어 볼겸 상세히 기록하고 얕은부분들은 가겹게 포스팅 하겠습니다. 4. 다형성 쿼리 " data-ke-type="html"> HTML 삽입 미리보기할 수 없는 소스 ● TYPE - 조회 대상을 특정 자식으로 한정한다. 예를 들면, Item 중 Book, Movie를 조회해라 와 같은 JPQL은 다음과 같다. //JPQL select i from Item i where type(i) IN(Book, Movie) //SQL select i from Item i where i.DTYPE in('B', 'M'); ● TREAT (JPA2.1) - 자바에서의 다운캐스팅과 유사하다. - 상속 구조에서 부모타입을 특정 자식 타입으로 다루기 위해 사용한다. - FRO.. BackEnd/JPA 2022. 4. 10. [JPA] 객체지향 쿼리 언어 2 (기본 문법) 내가 공부한것을 올리며, 중요한 단원은 저 자신도 곱씹어 볼겸 상세히 기록하고 얕은부분들은 가겹게 포스팅 하겠습니다. 5. 조인 " data-ke-type="html"> HTML 삽입 미리보기할 수 없는 소스 ● 내부 조인 SELECT m FROM Member m [INNER] JOIN m.team t ● 외부 조인 SELECT m FROM Member m LEFT [OUTER] JOIN m.team t ● 세타 조인 select count(m) from Member m, Team t where m.username = t.name (설명에서 세타 조인의 의미가 내가 알던것과 달라 질문글을 찾아봤는데, 다음과 같이 설명해 주셨다. => 세타조인은 동등조인이면서 동시에 sql에서 join구문 없이 사용하는 .. BackEnd/JPA 2022. 4. 9. [JPA] 객체지향 쿼리 언어 1 (기본 문법) 내가 공부한것을 올리며, 중요한 단원은 저 자신도 곱씹어 볼겸 상세히 기록하고 얕은부분들은 가겹게 포스팅 하겠습니다. 1. 소개 " data-ke-type="html"> HTML 삽입 미리보기할 수 없는 소스 ● JPQL 소개 가장 단순한 조회 방법은 다음과 같다. EntityManager.find() 또는 객체 그래프 탐색을 하면서 조회할수도 있다. => a.getB().getC() 만약 나이가 18살 이상인 회원을 모두 검색하고 싶다면? 특정 조건을 기준으로 검색을 하고싶다면 어떻게 해야할까? ● JPQL 필요성 JPA를 사용하면 엔티티 객체를 중심으로 개발할수 있다. 문제는 검색 쿼리이다! 애당초 모든 DB데이터를 객체로 변환해서 검색하는 것은 불가능하다. 검색을 할 때도 테이블이 아닌 엔티티 객체.. BackEnd/JPA 2022. 4. 8. [JPA] 값 타입 - 2 내가 공부한것을 올리며, 중요한 단원은 저 자신도 곱씹어 볼겸 상세히 기록하고 얕은부분들은 가겹게 포스팅 하겠습니다. 4. 값 타입의 비교 " data-ke-type="html"> HTML 삽입 미리보기할 수 없는 소스 인스턴스가 달라도 그 안에 값이 같으면 같은것으로 봐야한다. // primitive type 비교 int a = 10; int b = 10; System.out.println(a == b); // true // 임베디드 타입 비교 Address a = new Address("서울", "test", 7777); Address b = new Address("서울", "test", 7777); System.out.println(a == b); // false 임베디드 타입을 '==' 연산자로 .. BackEnd/JPA 2022. 4. 7. [JPA] 값 타입 - 1 내가 공부한것을 올리며, 중요한 단원은 저 자신도 곱씹어 볼겸 상세히 기록하고 얕은부분들은 가겹게 포스팅 하겠습니다. 1. 기본값 타입 " data-ke-type="html"> HTML 삽입 미리보기할 수 없는 소스 JPA의 데이터 타입은 크게 2가지로 분류 가능하다. (엔티티 타입, 값 타입) 1. 엔티티 타입 - @Entity로 정의하는 객체이다. - 데이터가 변해도 식별자로 지속적인 추적이 가능하다. => 예를 들어 회원 엔티티의 키나 나이값 을 변경해도 식별자로 인식 가능하다. 2. 값 타입 - int, Integer, String처럼 단순히 값으로 사용하는 자바 기본 타입이나 객체 - 식별자가 없고 값만 있으므로 변경시 추적 불가 => 예를 들어 숫자 100을 200으로 변경하면 완전히 다른 값.. BackEnd/JPA 2022. 4. 7. 이전 1 2 다음