본문 바로가기
728x90

[JAVA]/JPA35

JPQL - 프로젝션 프로젝션 SELECT 절에 조회할 대상을 지정하는 것 프로젝션 대상으로는 엔티티, 임베디드 타입, 스칼라 타입(숫자, 문자 등 기본 데이터 타입) SELECT m FROM Member m -- 엔티티 프로젝션 SELECT m.team FROM Member m -- 엔티티 프로젝션, Member에 연관된 Team을 가져옴 SELECT m.address FROM Member m -- 엔티티 타입 프로젝션 SELECT m.username, m.age FROM Member m -- 스칼라 타입 프로젝션 -- * DISTINCT로 중복 제거 여러 값 조회 SELECT m.username, m.age FROM Member m 1. Query 타입으로 조회 2. Object[] 타입으로 조회 3. new 명령어로 조.. 2023. 5. 1.
JPA가 지원하는 다양한 쿼리 방법(JPQL, QueryDSL 등) JPQL JPA를 사용하면 엔티티 객체를 중심으로 개발하게 된다. 문제는 검색 쿼리를 날릴 때이다. 테이블이 아닌 엔티티 객체를 대상으로 검색한다. 모든 DB 데이터를 객체로 변환해서 검색하는 것은 현실적으로 불가능하다. 애플리케이션이 필요로 하는 데이터만 DB에서 불러와야 한다. 그러기 위해서는 결국 검색 조건이 포함된 SQL이 필요하다. JPA는 SQL을 추상화한 JPQL이라는 객체지향 쿼리 언어를 제공한다. SQL과 문법이 유사하며 SELECT, FROM, WHERE, GROUP BY, HAVING, JOIN을 지원한다. JPQL은 엔티티 객체를 대상으로 쿼리를 만든다. SQL은 데이터베이스 테이블을 대상으로 쿼리를 만든다. SQL을 추상화하기 때문에 특정 데이터베이스 SQL에 의존하지 않는다. 한.. 2023. 4. 22.
JPA - 값 타입 JPA의 데이터 타입 분류 엔티티 타입 @Entity로 정의하는 객체를 뜻한다. 데이터가 변해도 식별자로 지속해서 추적할 수 있다. ex) 회원 엔티티의 키나 나이를 변경해도 식별자로 인식이 가능하다. 값 타입 int, Integer, String처럼 단순히 값으로 사용하는 자바의 기본 타입이나 객체를 뜻한다. 식별자가 없고 값만 있으므로 변경 시에 추적할 수 없다. ex) 100 -> 200으로 변경 시 완전히 다른 값으로 대체되는 것을 의미한다. 생명주기를 엔티티에 의존한다. 공유하지 않는 것이 안전하다. 불변 객체로 만드는 것이 안전하다. 값 타입 분류 기본값 타입(primitive type) 자바기본타입(int, double, String 등) 생명주기를 엔티티에 의존한다. ex) 회원을 삭제하면.. 2023. 4. 20.
JPA - 영속성 전이: CASCADE와 고아 객체 영속성 전이: CASCADE 특정 엔티티를 영속 상태로 만들 때 연관된 엔티티도 함께 영속 상태로 만들 수 있다. ex) 부모 엔티티를 저장할 때 자식 엔티티도 함께 저장할 수 있다. @OneToMany(mappedBy="parent", cascade=CascadeType.PERSIST) 주의할 점 영속성 전이는 연관관계를 매핑하는 것과 아무 관련이 없다. 엔티티를 영속화할 때 연관된 엔티티도 함께 영속화하는 편리함을 제공할 뿐 그 이상 그 이하도 아니다. CASCADE의 종류 @OneToMany(mappedBy="parent", cascade=CascadeType.ALL) // 모두 적용 @OneToMany(mappedBy="parent", cascade=CascadeType.PERSIST) // 영속.. 2023. 4. 17.
JPA - 즉시 로딩과 지연 로딩 사용시 주의할 점 실무에서는 지연 로딩만 사용한다. 즉시 로딩을 적용하면 예상하지 못한 SQL 쿼리가 발생하여 성능 저하 문제가 발생할 것이다. 즉시 로딩은 JPQL에서 N+1 문제를 일으킨다. @ManyToOne, @OneToOne은 기본이 즉시 로딩이므로 지연 로딩으로 변경하여 사용하면 된다. @OneToMany, @ManyToMany는 기본이 지연 로딩이다. 참고 김영한 - 자바 ORM 표준 JPA 프로그래밍 2023. 4. 17.
JPA - 프록시(Proxy) em.find()와 em.getReference() em.find() 데이터베이스에서 실제 엔티티 객체를 조회한다. em.getReference() 데이터베이스를 조회 곧장 하지 않고 미룬다. 대신 가짜(프록시) 엔티티 객체를 조회한다. 프록시 객체의 특징 실제 클래스를 상속받아 만들어졌기 때문에 겉모양이 같다. 타입 체크시에는 원본 엔티티를 상속받기 때문에 instance of를 사용해야 한다. 사용하는 입장에서 진짜 객체인지 아닌지 구분하지 않고 사용할 수 있다. 프록시 객체는 실제 객체의 참조를 보관한다. 프록시 객체를 호출하면 프록시 객체는 실제 객체의 메소드를 호출하는 방식으로 동작한다. 프록시 객체를 처음 사용할 때 한 번만 초기화한다. 초기화할 때는 프록시 객체가 실제 엔티티로 바뀌는 것은 .. 2023. 4. 17.
상속관계 매핑과 @MappedSuperclass 자바와 관계형데이터베이스의 차이 관계형 데이터베이스는 상속관계라는 것이 따로 없다. 슈퍼타입 서브타입 관계라는 모델링 기법이 객체의 상속과 유사하다. 따라서 상속관계 매핑이란 객체의 상속 & 구조와 데이터베이스의 슈퍼타입 서브타입 관계를 매핑하는 것을 말한다. 슈퍼타입 서브타입 논리 모델을 실제 물리 모델로 구현하는 방법 각각 테이블로 변환하는 경우 : 조인 전략 통합 테이블로 변환하는 경우 : 단일 테이블 전략 서브타입 테이블로 변환하는 경우 : 구현 클래스마다 테이블 전략 주요 애너테이션 @Inheritance(strategy=InheritanceType.XXX) JOINED : 조인 전략 SINGLE_TABLE : 단일 테이블 전략 TABLE_PER_CLASS : 구현 클래스마다 테이블 전략 @Di.. 2023. 4. 13.
N+1 문제 3분 요약 정리 💡 N+1 문제란? 연관관계가 설정된 엔티티(1)를 조회할 때, 조회된 데이터의 수(N)만큼 연관관계의 조회 쿼리가 추가로 발생하여 데이터를 읽어오는 문제를 말한다. 📌 Example : N + 1 재현하기 @Setter @Getter @Entity @NoArgsConstructor public class Rich { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; @OneToMany(mappedBy = "rich", cascade = CascadeType.ALL, fetch = FetchType.EAGER) // 즉시호출 private List cars = new ArrayList().. 2023. 1. 23.
728x90