| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 |
- 알고리즘
- 데이터베이스
- Next.js
- 코드테스트
- 디자인 패턴
- 미니정리
- 서버
- 스프링부트
- 쿼리
- 코드 테스트
- jpa
- 프론트엔드
- 프로그래머스
- spring
- 백엔드
- 자바
- web
- java
- 프런트엔드
- MySQL
- 정리
- oracle
- SQL
- 오라클
- JavaScript
- 자바스크립트
- 스프링
- jsp
- BACK-END
- node.js
- Today
- Total
목록JPA (18)
참치코더의 꿈 메모장
JPA를 쓰다 보면 성능이 갑자기 느려지는 구간이 있다.그 대표적인 원인이 바로 N+1 문제다. N+1 문제란? - 연관된 데이터를 조회할 때 쿼리가 불필요하게 많이 실행되는 현상 게시글과 댓글이 있을때 Post (1) : (N) Comment 게시글 10개를 조회했을 때 실행되는 쿼리 1번: 게시글 10개 조회10번: 각 게시글의 댓글 조회 -> 각각의 게시글에 작성되어 있는 댓글을 일일이 JPA Hibernate가 퍼오게 된다. 이게 바로 N(게시글 수) + 1 = N+1 문제이다. 왜 발생할까? - JPA의 지연 로딩(FetchType.LAZY) 때문이다. 123456789101112@ManyToOne(fetch = FetchType.LAZY)@OneToMany(mappedBy="post", f..
Named Query - Named Query는 미리 이름을 붙여 정의해두는 정적 쿼리입니다.- 프로젝트 빌드 시점에 JPQL 문법 오류를 잡을 수 있고, 재사용성도 높다.123456789101112131415// 정의하는 방법@Entity@NamedQuery( name = "Member.findByUsername", query = "select m from Member m where m.username = :username")public class Member { ...} // 사용 방법ListMember> members = em.createNamedQuery("Member.findByUsername", Member.class) .setParameter("username", "u..
다형성 쿼리 - JPA에서 상속구조가 있을때 부모타입으로 쿼리를 날리면 JPA가 자동으로 자식 엔티티들을 함께 조회하는 것을 말한다. Item에 Album, Book이 상속되어 있다고 가정할때 Item 뿐만 아니라 Album, Book 엔티티도 전부 조회한다.1234List items = em.createQuery("select i from Item i", Item.class) .getResultList(); //JPA가 내부적으로 자식 테이블까지 다 합쳐서 하나의 결과로 만들어 준다.cs TYPE - TYPE 키워드를 사용하여 상속관계에서 특정 자식만 조회가 가능하다.- 이 객체가 실제로 특정 자식 타입인 경우만 필터링해서 가져온다.123ListItem> books = em.cr..
경로 탐색 - 경로탐색은 JPQL에서 엔티티의 속성을 점(.)으로 접근해서 연관된 엔티티나 값을 탐색하는 것이다.123456789101112131415161718192021@Entitypublic class Member { @Id @GeneratedValue private Long id; private String username; @ManyToOne private Team team;} @Entitypublic class Team { @Id @GeneratedValue private Long id; private String name;} SELECT m.team from Member m -> 경로 탐색 // m.team -> Member가 가진 team 필드..
JPA 프로젝션(Projection) - 프로젝션은 SQL의 SELECT처럼 JPQL에서 엔티티 전체가 아닌 필요한 데이터만 선택해서 조회하는 기능이다. 프로젝션의 종류 엔티티 프로젝션 - 엔티티 전체를 조회하는 프로젝션- 영속성 컨텍스트로 관리되므로, 변경감지(Dirty Checking)가 가능하다.123ListMember> members = em.createQuery( "SELECT , FROM Member m", Member.class).getResultList();cs 임베디드 프로젝션 - @Embeddable 타입을 조회하는 프로젝션- 엔티티 내부에 속한 값이여서 영속성 컨텍스트로 관리가 된다.- 별도의 테이블로 분리되지 않는다.- 값 타입이라 불변(immutable)하게 설계하는 것이 좋..
- 값 타입 등을 List, Set, Map과 같은 컬렉션으로 보관할 때 사용하는 매핑 방식이다.- 엔티티가 아닌 값이므로 독립적인 테이블이 없고, JPA가 별도의 테이블을 만들어 관리하는 방식1234567891011121314151617181920@Entitypublic class Member { @Id @GeneratedValue private Long id; private String name; @ElementCollection @CollectionTable( name = "member_address", joinColumns = @JoinColumn(name = "member_id") ) private SetAddress> addr..
기본값 타입 : 자바 기본형 또는 Wrapper 클래스(Integer 등등), String 등임베디드 타입(복합 타입) : 여러 필드를 묶어 하나의 값 타입처럼 사용하는 것컬렉션 값 타입 : 값 타입을 Collection에 담아 사용하는 것 임베디드 타입(Embedded Type) - 여러 속성을 묶어 논리적으로 하나의 값 타입으로 활용하는 것- 엔티티의 재사용성과 응집도를 높임- 실제 DB에는 해당 엔티티 테이블에 컬럼으로 펼쳐짐1234567891011121314151617181920212223@Embeddablepublic class Address { private String city; private String street; private String zipcode;} @Ent..
지연 로딩 (Lazy Loading) - 필요할 때만 연관 객체를 조회하는 방식- 연관된 엔티티를 실제 사용할 때 SQL이 실행이 된다.- 처음에는 프록시 객체(가짜 객체)로 들고 있다가, 해당 데이터를 접근할때 쿼리를 날려 값을 구하는 방식이다.1234567891011121314@Entitypublic class Member { @Id @GeneratedValue private Long id; private String name; @ManyToOne(fetch = FetchType.LAZY) // 지연로딩 private Team team;} Colored by Color Scriptercs 장점- 필요한 시점에만 데이터를 불러와서 성능 향상- 불필요한 조인 ..