본문 바로가기

Spring Data

(14)
벌크 연산 재고가 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 중급 문법 - 경로표현식 경로 표현식 . (점)을 찍어 객체 그래프를 탐색하는 것. select m.username -> 상태 필드 from Member m join m.team t-> 단일 값 연관 필드 join m.orders o-> 컬렉션 값 연관 필드 where t.name = '팀A' 상태 필드 : 단순히 값을 저장힉 위한 필드 연관 필드 : 연관관계를 위한 필드 단일 값 연관 필드 : @ManyToOne, @OneToOne 대상이 엔티티 컬력션 값 연관 필드 : @OneToMany, @ManyToMany 대상이 컬렉션 경로표현식 특징 상태필드 : 경로 탐색의 끝, 탐색 x 단일 값 연관 경로 : 묵시적 내부 조인(inner join) 발생, 탐색 o 컬렉션 값 연관 경로 : 묵시적 내부 조인 발생, 탐색 x from ..
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 ..
값 타입 #9 엔티티 타입 @Entity로 정의하는 객체 데이터가 변해도 식별자로 지속해서 추적 가능 예) 회원 엔티티의 키나 나이 값을 변경해도 식별자로 인식 가능 값 타입 int, Integer, String처럼 단순히 값으로 사용하는 자바 기본 타입이나 객체 식별자가 없고 값만 있으므로 변경 시 추적 불가 예) 숫자 100을 200으로 변경하면 완전히 다른 값으로 대체 값 타입 분류 기본값 타입 자바 기본 타입(int, double) 래퍼 클래스(Integer, Long) String 임베디드 타입(embedded type, 복합 값 타입) 컬렉션 값 타입(collection value type) 특징 생명주기를 엔티티의 의존 예) 회원을 삭제하면 이름, 나이 필드도 함께 삭제 값 타입은 공유하면 안 된다 예) ..
프록시와 연관관계 관리(지연로딩, 즉시로딩) #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에 들어갈 값, 지정하지 않으면 자식클래스의 클래스..