들어가기 전 CascadeType.ALL은 생애주기를 함께 하는 엔티티를 다루는데 있어서는 좋은 도구가 될 수 있다. 그렇지만 CascadeType.ALL을 사용할 때 발생할 수 있는 문제점은 잘 파악해야 필요한 위치에 사용할 수 있게 될 것 같다. Cascade.ALL 동작 방식 CascadeType.ALL은 부모 엔티티의 영속화 상태가 변할 때, 그 변화가 자식 엔티티에도 고스란히 전파되는 것을 의미한다. 예를 들어 아래 코드에서는 다음과 같이 동작하는 것을 상상해 볼 수 있다. Team을 영속성 컨텍스트에 영속화 한다 → Team과 연관된 Member들도 모두 영속화 된다. Team이 영속성 컨텍스트에서 삭제된다 → Team과 연관된 Member들도 영속성 컨텍스트에서 삭제된다. @Entity @G..
이 글은 자바 ORM 표준 JPA 프로그래밍을 학습하며 필요한 내용을 작성한 글입니다. @Id 해당 어노테이션을 특정 필드 위에 사용하면 이 필드는 앞으로 DB에서 PK로 사용하겠다는 것을 의미한다. DB 또한 그렇게 인식을 한다. 이 때, @Id만 입력이 된다면 필드에는 개발자가 값을 직접 채번해야한다. @GeneratedValue @Id + @GenerateValue를 사용할 경우, PK를 개발자가 채번하는 것이 아니라 자동으로 DB에서 채번해주는 것을 의미한다. 따라서 채번의 부담성을 줄이기 위해 @GeneratedValue를 사용하는 것이 권장된다. @GeneratedValue 전략 public enum GenerationType { AUTO IDENTITY, SEQUENCE, TABLE, } G..
이 게시글은 자바 표준 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..