이 게시글은 자바 표준 ORM JPA 프로그래밍을 공부하고 정리한 글입니다. JPQL은 엔티티만 영속화 된다. JPQL로 DB에서 데이터를 불러온다고 해보자. 불러올 수 있는 데이터는 값타입, 엔티티 타입, 임베디드 타입 등 다양한 값이 있을 수 있다. JPQL로 불러올 수 있는 이 데이터들 중에서 '엔티티 타입'만 유일하게 영속성 컨텍스트에서 관리가 된다. 즉, 다른 스칼라 타입같은 것들은 영속화 되지 않기 때문에 쓰기 지연, 더티 체킹 등의 기능이 정상적으로 동작하지 않는다. em.find()의 동작 방식 쌩뚱 맞을 수 있지만, em.find()의 동작방식을 한번 복습해본다. 왜냐하면 em.find()와 JPQL은 다른 방식으로 동작하기 때문이다. em.find()의 동작 방식은 아래 그림에서 볼 수..
JPA의 Bulk 연산 public void updateMemberName(Long memberId) { queryFactory.update(member) .set(member.name, "memberA") .execute(); } 한번에 수많은 값을 수정하거나 삭제하고 싶을 때는 JPA가 제공하는 Bulk 연산을 사용하면 된다. 주로 다음과 같은 형태로 사용할 수 있다. JPA의 Bulk 연산 사용 시 주의할 점 JPA의 Bulk 연산은 영속성 컨텍스트를 거치지 않고 DB에 바로 반영이 된다. 일반적으로 JPQL을 사용했을 때, DB에서 먼저 엔티티를 조회하는 것을 생각하면 당연하다. 대신 Bulk 연산은 DB에 반영된 값을 다시 한번 영속성 컨텍스트에 반영해주지 않는다. 따라서 Bulk 연산을 하게 ..
이 게시글은 자바 표준 ORM JPA 프로그래밍을 공부하고 정리한 글입니다. 컬렉션 자바는 Collection이라는 자료구조를 제공한다. JPA는 이 중 Collection, List, Set, Map 컬렉션을 지원한다. JPA는 자바 Collection Type을 영속화 할 때 특별한 기능을 해준다. 그 내용은 아래에서 자세히 살펴보도록 한다. 먼저 자바의 자료구조에 대해 간단히 이해하자. 자료 구조 중복 허용 순서 보장 Collection O X(하이버네이트 가정) Set X X List O O Map X X JPA와 Collection JPA의 구현체인 하이버네이트는 엔티티를 영속 상태로 만들 때, 컬렉션 필드를 하이버네이트에서 준비한 Collection으로 한번 감싼 다음 영속화 시킨다. 즉, C..
이 글은 자바 표준 ORM JPA 프로그래밍 책을 보고 정리한 글입니다. 2차 캐시의 필요성 네트워크를 통해 DB에 접근하는 시간 비용은 어플리케이션의 내부 메모리에 접근하는 비용에 비해 수만 ~ 수십만배 이상 비싸다. 따라서 필요한 데이터를 매번 DB에서 조회하는 것보다는 어플리케이션 메모리에 캐시 후, DB 접근 횟수를 줄이면 어플리케이션의 성능을 획기적으로 개선할 수 있다고 한다. JPA의 영속성 컨텍스트 영속성 컨텍스트 내부에는 엔티티를 보관하는 1차 캐시가 있다. 그렇지만 이 1차 캐시는 영속성 컨텍스트가 존재하는 동안에만 캐시로 사용할 수 있다. 스프링의 기본적인 영속성 컨텍스트 전략은 트랜잭션이 시작할 때 영속성 컨텍스트를 만들고, 트랜잭션이 종료되면서 영속성 컨텍스트를 종료한다. OSIV를..
이 게시글은 자바 표준 ORM JPA를 공부하고 개인적으로 정리한 글입니다 트랜잭션의 성질 트랜잭션은 ACID 성질을 만족해야한다. 트랜잭션의 ACID는 아래를 이야기한다. Atomic(원자성) 트랜잭션 내의 동작은 같이 성공하거나, 같이 실패해야한다. Consistency (일관성) 트랜잭션이 성공적으로 완료되면 일관적인 DB상태를 유지한다. 예를 들면 트랜잭션이 성공하더라도, DB의 유니크 제약 조건이 지켜지는 것을 의미한다. Isolation(격리성) 트랜잭션과 트랜잭션은 서로 영향을 미치지 않아야 한다. Durability(지속성) 트랜잭션이 완료된 것은 DB에 반영되어야한다. 기본적으로 트랜잭션을 이용하면 ACD(원자성, 일관성, 지속성)은 만족한다. 그렇지만 한 가지 만족하지 못하는 것이 있다..