저번 포스팅에서 OneToOne 관계의 주인에서는 지연로딩이 적용되지만 주인이 아니면 지연로딩이 적용되지 않고 EAGER로 데이터가 불러오는 문제에 대해서 다뤄봤다. 그렇다면 해결방법은 뭐가 있을까? 내가 생각한 방법은 OneToOne 연관관계에서 주인이 아닌 쪽에 Long 타입으로 주인의 Seq를 저장하는것이다. @AllArgsConstructor @NoArgsConstructor(access = AccessLevel.PROTECTED) @DynamicInsert @Getter @Table(name = "appointment") @Entity @Builder public class Appointment extends BaseEntity { @GeneratedValue(strategy = Generati..
전체 글
개발자를 꿈꾸는 비전공자 낙타 github https://github.com/jun9898프로젝트를 진행하다가 OneToOne 관계에서 FetchType.LAZY를 설정해주었음에도 즉시 로딩이 실행되 N+1 문제가 발생하는것을 확인했다. 문제의 Entity들 @AllArgsConstructor @NoArgsConstructor(access = AccessLevel.PROTECTED) @Getter @Table(name = "review") @Entity @Builder public class Review extends BaseEntity { @Id @GeneratedValue(strategy = GenerationType.SEQUENCE) private Long reviewSeq; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "hospita..
평소와 같이 아무생각 없이 Builder를 사용해서 Entity를 작성했다. Member Entity package com.playdata.eungae.member.domain; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; import org.hibernate.annotations.DynamicInsert; import com.playdata.eungae.base.BaseEntity; import com.playdata.eungae.hospital.domain.Hospital; import jakarta.persistence.CascadeType; i..
부트캠프에서 파이널 프로젝트를 진행하며 Entity를 생성하다가 문뜩 이런 생각이 들었다. Entity의 Id값은 null이 허용되지 않는데 어째서 Wrapper class인 Long타입으로 작성할까? 기존에는 단순히 하이버네이트에서 권장하는 스펙이 Wrapper class라서 생각없이 작성했지만 저번 멘토님이 지적해주신 사항이 떠올라 찾아보기로 했다. 1. 표현 범위 만약 실제로 배포가 완료된 서비스에서 int형을 사용한다면 저장 범위를 뛰어넘는 수가 Id값에 할당될 수 있다. 2. Null 처리 원시타입 long에 null이 들어온다면 0으로 값이 처리된다. 하지만 entity의 관점에서 봤을땐 0은 null이 아닌 값으로 본다. id가 없을때 null을 선언함으로 id가 없다는 것을 보장할 수 있게..
JPA를 사용하며 OneToMany 관계를 DTO로 변경하는 과정에서 N+1 문제가 심심치 않게 발생하는 것을 발견할 수 있다. 기존엔 방법을 몰라 모든 연관관계를 fetch join으로 처리하면 되겠다고 생각했지만 해당 방법은 페이징 처리가 불가능하다는 단점이 있다는 사실을 알게되었다. 그렇다면 해결 방법으로는 어떤것들이 있을까? 실습에 사용될 Entity OrderEntity @Entity @Getter @Setter @Table(name = "orders") // 이렇게 선언해주면 함부로 기본 생성자로 객체를 생성할 수 없다 @NoArgsConstructor(access = AccessLevel.PROTECTED) public class Order { @Id @GeneratedValue @Colum..
@PostMapping("/{appointment_seq}/reviews") public void createReview(@PathVariable Long appointment_seq, Principal principal, @RequestBody RequestReviewFormDto dto) 부트캠프에서 파이널 프로젝트를 진행하다 생각없이 짠 코드에 멘토님이 코멘트를 달아주셨다. appointmentSeq 경우 pathvariable 로 받고 있어 null 일수가 없는데 reference type 를 사용한 이유가 있을까요? 망치로 머리를 얻어맞은 기분이였다. 과연 null값이 들어올 수 없는 PathVariable에도 Wrapper class를 사용하는 의미가 있을까? 하이버네이트 공식 문서에서 엔티티..
App.js import React, { useState } from "react"; import { NavigationContainer } from "@react-navigation/native"; import { createStackNavigator } from "@react-navigation/native-stack"; const App = () => { const [screen, setScreen] = useState("Home"); return ( ); }; export default App; Test1 import React from 'react'; const Test = (navigation) => { return ( navigation.navigate("Test2")} /> ); }; ex..
경로 표현식 점을 찍어 객체 그래프를 탐색하는 것 (m.member t) 경로 표현식 용어 정리 상태 필드 (state field) : 단순히 값을 저장하기 위한 필 연관 필드 (association field) : 연관관계를 위한 필드 단일 값 연관필드 : @ManyToOne, @OneToOne, 대상이 엔티티 컬렉션 값 연관 필드 : @OneToOne, @ManyToMany, 대상이 컬렉션 경로 표현식 특징 상태 필드 (state field) : 경로 탐색의 끝, 탐색 X "select m.username From Member m"; 단일 값 연관경로 : 묵시적 내부 조인 (inner join) 발생, 탐색 O "select m.team.id From Member m"; 컬렉션 값 연관 경로 : 묵시..
JPA는 다양한 쿼리 방법을 지원 JPQL JPA Criteria QueryDSL 네이티브 SQL JDBC API 직접 사용, MyBatis, StringJdbcTemplate도 함께 사용 JPQL이란 가장 단순한 조회방법 em.find() 객체 그래프 탐색 (a.getB().getC()) jpa를 사용하면 엔티티 객체를 중심으로 개발 문제는 검색 쿼리 검색을 할 때도 테이블이 아닌 엔티티 객체를 대상으로 검색 모든 DB데이터를 객체로 변환해서 검색하는 것은 불가능 애플리케이션이 필요한 데이터만 DB에서 불러오려면 결국 검색조건이 포함된 SQL이 필요 JPA는 SQL을 추상화한 JPQL 이라는 객체 지향 쿼리 언어 제공 SQL과 문법 유사, select, from, where, group by, havi..
기본 값 타입 jpa의 데이터 타입 분류 엔티티 타입 @Entity로 정의하는 객체 데이터가 변해도 식별자로 지속해서 추적 가능 예) 회원 엔티티의 키나 나이값을 변경해도 식별자로 인식 가능 값 타입 int Integer String 처럼 단순히 값으로 사용하는 자바 기본타입이나 객체 식별자가 없고 값만 있으므로 변경시 추적 불가 예) 숫자 100을 200으로 변경하면 완전히 다른 값으로 대체 값 타입 분류 기본 값타입 자바 기본타입 (int, double) 래퍼 클래스 String 임베디드 타입(embedded type, 복합 값타입) 컬렉션 값타입 (collection value type) 기본 값 타입 예) String name, int age 생명주기를 엔티티에 의존 예) 회원을 삭제하면 이름, ..