JPA
batch_size대로 in쿼리 개수가 안 나가는 이유!
JPA를 사용할 때 N+1 문제를 해결하기 위해 default_batch_fetch_size를 설정하여 in절로 여러 개를 한 번에 가져올 수 있도록 한다. 하지만 실제 default_batch_fetch_size를 100으로 설정하고 30개의 데이터를 가져오려 하니 25개를 담은 in절 쿼리 1번 + 5개를 담은 in절 쿼리 한 번이 호출되었다. Statement와 PreparedStatement RDB의 경우 쿼리가 호출 될 때 아래의 3가지의 과정을 거친다. 1) 쿼리 문장 분석 2) 컴파일 3) 실행 Statement를 사용할 경우 매번 쿼리가 수행할 때마다 위의 3단계를 거치게 되고, PreparedStatement는 처음 한 번만 세 단 계를 거친 후 캐시에 담아 이후부턴 재사용을 한다. 그러..
[JPA] 양방향 연관관계 순환 참조 문제 및 해결방법
https://dev-coco.tistory.com/133 [JPA] 양방향 순환참조 문제 및 해결방법 게시판 프로젝트를 진행하던 중 순환 참조 문제에 마주하였다. ※ 순환 참조(Circular reference)란, 참조하는 대상이 서로 물려 있어 참조할 수 없게 되는 현상을 말한다. JPA에서 양방향으로 연결된 E dev-coco.tistory.com
실전! 스프링 부트와 JPA 활용1 정리
@PersistenceContext @PersistenceContext private EntityManager em; 엔티티 매니저( EntityManager ) 주입 스프링 부트를 사용하면 @PersistenceContext대신 @Autowired를 쓸 수 있다. 이유는 스프링 데이터 JPA가 지원해주기 때문이다. @PersistenceUnit @PersistenceUnit private EntityManagerFactory emf; 엔티티 매니터 팩토리( EntityManagerFactory ) 주입 @Transactional 스프링에서 트랜잭션 처리를 하기위해선 DB와 관련된, 트랜잭션이 필요한 서비스 클래스 혹은 메서드에 @Transactional 어노테이션을 달아주면된다. tx.begin(); ..
객체지향 쿼리 언어
객체지향 쿼리 언어 소개 JPQL //검색 String jpql = "select m From Member m where m.name like ‘%hello%'"; List result = em.createQuery(jpql, Member.class).getResultList(); 가장 단순한 조회 방법 EntityManager.find() 객체 그래프 탐색(a.getB().getC()) JPA는 SQL을 추상화한 JPQL이라는 객체 지향 쿼리 언어 제공 테이블이 아닌 엔티티 객체를 대상으로 검색하는 객체 지향 쿼리 SQL을 추상화해서 특정 데이터베이스 SQL에 의존하지 않는다. JPQL은 결국 SQL로 변환된다. Criteria //Criteria 사용 준비 CriteriaBuilder cb = em...
값 타입
임베디드 타입(복합 값 타입) 새로운 값 타입을 직접 정의할 수 있음 JPA는 임베디드 타입(embedded type)이라 함 주로 기본 값 타입을 모아서 만들어서 복합 값 타입이라고도 함 int, String과 같은 값 타입 예시 Member 클래스 @Entity public class Member extends BaseEntity { @Id @GeneratedValue @Column(name = "MEMBER_ID") private Long id; @Column(name = "USERNAME") private String name; //기간 Period @Embedded private Period workPeriod; //주소 Address @Embedded private Address homeAdd..
고급 매핑
상속관계 매핑 관계형 데이터베이스는 상속 관계가 없다. 슈퍼타입 서브타입 관계라는 모델링 기법이 객체 상속과 유사하다. 상속관계 매핑이란 객체의 상속과 구조와 DB의 슈퍼타입 서브타입 관계를 매핑하는 것이다. 슈퍼타입 서브타입 논리 모델을 실제 물리 모델로 구현하는 방법 각각 테이블로 변환 -> 조인 전략 통합 테이블로 변환 -> 단일 테이블 전략 서브타입 테이블로 변환 -> 구현 클래스마다 테이블 전략 주요 어노테이션 @Inheritance(strategy=InheritanceType.XXX) JOINED: 조인 전략 SINGLE_TABLE: 단일 테이블 전략 TABLE_PER_CLASS: 구현 클래스마다 테이블 전략 @DiscriminatorColumn(name=“DTYPE”) 테이블 속성에 DTYP..
다양한 연관관계 매핑
연관관계의 주인이 어디 위치하는지에 따라 나뉜다. 다대일 => 연관관계 주인이 다(N)에 위치 일대다 => 연관관계 주인이 일(1)에 위치 다대일 (N:1) 단방향 (Member -> Team) 가장 많이 쓰이는 연관관계이다. Member @Entity public class Member { @Id @GeneratedValue @Column(name = "MEMBER_ID") private Long id; @Column(name = "USERNAME") private String name; @ManyToOne @JoinColumn(name = "TEAM_ID") private Team team; ... Team @Entity public class Team { @Id @GeneratedValue @Col..
연관관계 매핑 기초
객체를 테이블에 맞추어 데이터 중심으로 모델링하면, 협력 관계를 만들 수 없다. 테이블은 외래 키로 조인을 사용해서 연관된 테이블을 찾는다. 객체는 참조를 사용해서 연관된 객체를 찾는다. 단방향 연관관계 회원과 팀이 있을 때, 회원 -> 팀 또는 팀 -> 회원처럼 한쪽만 참조하는 것을 단방향 연관관계라고 한다. 객체의 참조와 테이블의 외래 키를 매핑하여 객체지향적으로 모델링 할 수 있다. Member -> Team 인 단방향 연관관계 Member.class (Team 객체를 참조) @Entity public class Member { @Id @GeneratedValue private Long id; @Column(name = "USERNAME") private String name; private int..