본문 바로가기

JPA

(10)
벌크 연산 재고가 10개 미만인 모든 상품의 가격을 10% 상승하려면? JPA 변경 감지 기능으로 실행하려면 너무 많은 SQL 실행 재고가 10개 미만인 상품을 리스트로 조회한다. 상품 엔티티의 가격을 10% 증가한다. 트랜잭션 커밋 시점에 변경 감지가 동작한다. 변경된 데이터가 100건이라면 100번의 update SQL 실행 벌크 연산 주의 벌크 연산은 영속성 컨텍스트를 무시하고 데이터베이스에 직접 쿼리 만약 어떤 그룹의 연봉을 4000만원에서 5000만 원으로 수정하는 벌크 연산을 날리게 되면 데이터베이스에 직접 쿼리 하여 값이 수정된다. 하지만 영속성 컨텍스트를 무시했기 때문에 영속성 컨텍스트에는 아직 4000만 원으로 설정되어 있음. Member member1 = new Member(); member1.s..
JPQL 중급 문법 - 페치조인2 페치 조인의 특징과 한계 페치 조인 대상에는 별칭을 줄 수 없다. 하이버네이트는 가능, 가급적 사용 X // 페치 조인 대상에는 별칭을 줄 수 없다. select t from Team t join fetch t.members m // 이렇게 풀면 안됌.. select t from Team t join fetch t.members m where m.age > 10 둘 이상의 컬렉션은 페치 조인할 수 없다. 컬렉션을 페치 조인하면 페이징 API를 사용할 수 없다. 일대일, 다대일 같은 단일 값 연관 필드들은 페치 조인해도 페이징 가능 하이버네이트는 경고 로그를 남기고 메모리에서 페이징(매우 위험) 정리 모든 것을 페치 조인으로 해결할 수는 없음 페치 조인은 객체 그래프를 유지할 때 사용하면 효과적 여러 테이..
JPQL 중급 문법 - 페치 조인1 페치 조인(fetch join) SQL 조인 종류 X JPQL에서 성능 최적화를 위해 제공하는 기능 연관된 엔티티나 컬렉션을 SQL 한 번에 함께 조회하는 기능 join fetch 명령어 사용 // 페치 조인 select m from Member m join fetch m.team // 실제 실행되는 쿼리 select m.*, t.* from member m inner join team t on m.team_id = t.id String query = "select m from Member m"; List result = em.createQuery(query, Member.class) .getResultList(); for(Member member: result) { System.out.println("..
JPQL 기본 문법 JPQL JPA를 사용하면 엔티티 객체를 중심으로 개발 문제는 검색 쿼리 검색을 할 때도 테이블이 아닌 엔티티 객체를 대상으로 검색 모든 DB 데이터를 객체로 변환해서 검색하는 것은 불가능 애플리케이션이 필요한 데이터만 DB에서 불러오려면 결국 검색 조건이 포함된 SQL이 필요 JPA는 SQL을 추상화한 JPQL이라는 객체 지향 쿼리 언어 제공 SQL과 문법 유사, SELECT, FROM, WHERE, GROUP BY, HAVING, JOIN 지원 JPQL은 엔티티 객체를 대상으로 쿼리 SQL은 데이터베이스 테이블을 대상으로 쿼리 문법 select m from Member as m where m.age > 18 엔티티와 속성은 대소문자 구분 O (Member, age) JPQL 키워드는 대소문자 구분X ..
프록시와 연관관계 관리(지연로딩, 즉시로딩) #8 프록시 Member를 조회할 때 Team도 함께 조회해야 할까? 회원과 팀 함께 출력 public void printUserAndTeam(String memberId) { Member member = em.find(Member.class, memberId); Team team = member.getTeam(); System.out.println("회원 이름: " + member.getUsername()); System.out.println("소속팀: " + team.getName()); } 회원만 출력 public void printUser(String memberId) { Member member = em.find(Member.class, memberId); Team team = member.getTe..
고급매핑 #7 상속 매핑 관계형 데이터베이스는 상속관계 x 객체의 상속 구조와 DB의 슈퍼 타입 서브타입 관계를 매핑 구현 방법 조인 전략 : 각각 테이블로 변환 단일 테이블 전략 : 통합 테이블로 변환 구현 클래스마다 테이블 전략 : 서브타입 테이블로 변환 주요 어노테이션 @Inheritance(strategy=InheritanceType.XXX) 조인 전략 : JOINED 단일테이블 : SINGLE_TABLE 구현클래스마다 테이블 전략 : TABLE_PER_CLASS @DiscriminatorColumn(name="DTYPE") => 자식클래스를 구분하는 컬럼 지정하지 않으면 DTYPE으로 자동생성됌. @DiscriminatorValue("XXX") => DTYPE에 들어갈 값, 지정하지 않으면 자식클래스의 클래스..
다양한 연관관계 매핑 #6 연관관계 매핑시 고려사항 3가지 다중성 단방향, 양방향 연관관계의 주인 다중성 다대일 : @ManyToOne 일대다 : @OneToMany 일대일 : @OneToOne 다대다 : @ManyToMany 단방향, 양방향 테이블 외래 키 하나로 양쪽 조인 가능 사실 방향이라는 개념이 없음 객체 참조용 필드가 있는 쪽으로만 참조 가능 한쪽만 참조하면 단방향 양쪽이 서로 참조하면 양방향 연관관계 주인 테이블은 외래 키 하나로 두 테이블아 연관관계를 맺음 객체 양방향 관계는 A -> B, B -> A 처럼 참조가 2군데 객체 양방향 관계는 참조가 2군데 있음. 둘중 테이블의 외래 키를 관리할 곳을 지정해야함 연관관계의 주인 : 외래 키를 관리하는 참조 주인의 반대편 : 외래 키에 영향을 주지 않음, 단순 조회만 가..
연관관계 매핑 기초 #5 연관관계 매핑 기초 객체의 참조와 테이블의 외래 키를 매핑할 수 있다. 방향 단방향, 양방향 다중성 다대일(N:1), 일대다(1:N), 일대일(1:1), 다대다(N:N) 연관관계의 주인 객체 양방향 연관관계는 주인을 정해야한다. 예제 시나리오 회원과 팀이 있다. 회원은 하나의 팀에만 속한다. 회원과 팀은 대대일 관계이다. @Entity public class Member { @Id @GeneratedValue private Long id; @Column(name = "USERNAME") private String name; @Column(name = "TEAM_ID") private Long teamId; … } @Entity public class Team { @Id @GeneratedValue pri..