일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 유니크제약조건
- 연관관계
- 힙
- 비관적락
- BOJ
- eager
- 이진탐색
- fetch
- FetchType
- shared lock
- exclusive lock
- 즉시로딩
- 일대다
- 동적sql
- 백트래킹
- 낙관적락
- 스프링 폼
- querydsl
- 데코레이터
- 지연로딩
- CHECK OPTION
- SQL프로그래밍
- 다대일
- 다대다
- PS
- 연결리스트
- execute
- 스토어드 프로시저
- JPQL
- dfs
- Today
- Total
목록JPA (46)
흰 스타렉스에서 내가 내리지
.orderBy(Expressions.numberTemplate(Double.class, "function('rand')").asc()) queryFactory .select(Projections.constructor(CurationSimpleResponseDto.class, curation.id, curation.title, curation.description, curation.cnt, curation.thumbnail, curationBookmark.status)) .from(curation) .leftJoin(curationBookmark) .on(curationBookmark.curation.id.eq(curation...
# 트랜잭션과 락트랜잭션은 ACID 라 하는 원자성 (Atomocity), 일관성 (Consistency), 격리성 (Isolation), 지속성 (Durability) 을 보장해야 한다 1. 원자성 트랜잭션 내에서 실행한 작업들은 마치 하나의 작업인 것처럼 모두 성공하든가 모두 실패해야 한다.START TRANSACTION -- 이 블록안의 명령어들은 마치 하나의 명령어 처럼 처리됨 -- 성공하던지, 다 실패하던지 둘중 하나가 됨. A의 계좌로부터 인출; B의 계좌로 입금;COMMIT 2. 일관성모든 트랜잭션은 일관성 있는 데이터베이스 상태를 유지해야 한다. 트랜잭션이 진행되는 동안에 데이터베이스가 변경되더라도, 업데이트된 데이터베이스로 트랜잭션이 진행되는 것이 아니라, 처음에 트..
트랜잭션을 지원하는 쓰기 지연과 변경 감지 기능 덕분에 성능과 개발의 편의성의 장점을 얻었다.하지만 진짜 장점은 데이터베이스 row 에 lock 이 걸리는 시간을 최소화한다는 점이다.이 기능은 트랜잭션을 커밋해서 영속성 컨텍스트를 플러시하기 전까지는 데이터베이스에 데이터를 등록, 수정, 삭제하지 않는다.따라서 커밋 직전까지 데이터베이스 로우에 락을 걸지 않는다. update(member); // UPDATE SQL AlogicA(); // UPDATE SQL ...logicB(); // UPDATE SQL ...commit(); JPA 를 사용하지 않고 SQL 을 직접 다루면 update(member) 를 호출할 때 UPDATE SQ..
# 배치 처리수백만 건의 데이터를 배치 처리해야 하는 상황일반적인 방식으로 엔티티를 계속 조회하면 영속성 컨텍스트에 아주 많은 엔티티가 쌓이면서 메모리 부족 오류가 발생한다.따라서 이런 배치 처리는 적절한 단위로 영속성 컨텍스트를 초기화해야 한다. # JPA 등록 배치수만 건 이상의 엔티티를 한 번에 등록할 떄 주의할 점은 영속성 컨텍스트에 엔티티가 계속 쌓이지 않도록 일정 단위마다 영속성 컨텍스트의 엔티티를 데이터베이스에 플러시하고 영속성 컨텍스트를 초기화해야 한다.만약 이렇게 안하면, 영속성 컨텍스트에 너무 많은 엔티티가 저장되면서 메모리 부족 오류가 발생할 수 있다.public void batch(){ EntityTransaction tx = em.getTransaction(); tx...
# 엔티티가 영속성 컨텍스트에 관리되면...장점 : 1차캐시, 변경 감지하지만 스냅샷 인스턴스를 보관하므로 더 많은 메모리를 사용한다. 읽기 전용으로 엔티티를 조회하면 메모리 사용량을 최적화 할 수 있다. # 스칼라 타입으로 조회select o.id, o.name from Order o스칼라 타입은 영속성 컨텍스트가 결과를 관리하지 않는다. # 읽기전용 쿼리 힌트 사용TypedQuery query = em.createQuery("select o from Order o", Order.class); query.setHint("org.hibernate.readOnly", true);엔티티를 읽기 전용으로 조회한다.읽기 전용이므로 영속성 컨텍스트는 스냅샷을 보관하지 않는다.따라서 메모리 사용량을..
1. 페치 조인 사용가장 일반적인 방법select m from Member m join fetch m.ordersSELECT M.*, O.* FROM MEMBER MINNER JOIN ORDERS O ON M.ID=O.MEMBER_ID 일대다 조인을 했으므로 중복된 결과가 나타날 수 있다.따라서 JPQL 의 DISTINCT 를 사용해서 중복을 제거하는 것이 좋다. 2. 하이버네이트 @BatchSize하이버네이트가 제공하는 org.hibernate.annotations.BatchSize 어노테이션을 사용하면 연관된 엔티티를 조회할 때 지정한 size 만큼 SQL 의 IN 절을 사용해서 추가 조회한다.만약 조회한 회원이 10명인데 size=5 로 지정하면 2번의 SQL 만 추가로 실행한다. @Entitypu..
Member refMember = em.getReference(Member.class, "member1");Member findMember = em.find(Member.class, "member1");assertTrue(refMember == findMember); // 성공 먼저 em.getReference() 메소드를 사용해서 프록시로 조회했다.그리고 다음 em.find() 를 사용해서 조회했다. refMember 는 프록시고, findMember 는 원본 엔티티이므로 둘은 서로 다른 인스턴스인가? # 프록시로 조회해도 영속성 컨텍스트는 영속 엔티티의 동일성을 보장한다.영속성 컨텍스트는 프록시로 조회된 엔티티에 대해서 같은 엔티티를 찾는 요청이 오면 원본 엔티티가 아닌 처음 조회된 프록시를 ..
# 엔티티 비교같은 영속성 컨텍스트에서 엔티티를 조회하면 다음 코드와 같이 항상 같은 엔티티 인스턴스를 반환한다.Member member1 = em.find(Member.class, "1L");Member member2 = em.find(Member.class, "2L");assertTrue(member1 == member2); # 영속성 컨텍스트가 같을 때 엔티티 비교@Transactionalpublic class MemberServiceTest{ ... @Test public void join(){ //Given Member member = new Member("member1"); //When Long saveI..
벌크성 수정 쿼리 👇🏻👇🏻👇🏻👇🏻👇🏻update Member m set m.age = m.age - 1 스프링 데이터 JPA 에서 벌크성 수정, 삭제 쿼리는 org.springframework.data.jpa.repository.Modifying 어노테이션을 사용한다. 벌크성 쿼리를 실행하고 나서 영속성 컨텍스트를 초기화하고 싶으면 @Modifying(clearAutomatically = true) 로 설정하면 된다. 이 옵션의 기본값은 false 이다. @Modifying@Query("update Member m set m.age = m.age - 1")int addAge();@Modifying(cleatAutomatically = true)@Query("update Member m..
이메일과 이름으로 회원을 조회하려면 다음과 같은 메소드를 정의하면 된다.List findByEmailAndName (String email, String name); 메소드를 실행하면 스프링 데이터 JPA 는 메소드 이름을 분석해서 JPQL 을 생성하고 실행한다.실행된 JPQL : select m from Member m where m.email = ?1 and m.name = ?2 # JPA Query Method 표 https://docs.spring.io/spring-data/jpa/reference/jpa/query-methods.html JPA Query Methods :: Spring Data JPABy default, Spring Data JPA uses position-based par..