Spring/JPA 10

[Spring/JPA] JPA Auditing

JPA Auditing INSERT, UPDATE, DELETE 의 SQL 를 추적하여, 영속 상태인 엔티티의 엔티티 버전 관리와 관련된 이벤트들을 추적 및 로깅하는 기능이다. 순수 JPA 에는 Auditing (추적)할 수 없다. (javax(현재는 jakarta)에 직접적으로 명시되어있지 않다.) 하지만 엔티티 라이프 사이클을 사용하여 구현할 수 있다. (엔티티 라이프 사이클은 다음 포스트에서 자세히 다루겠다.) @PrePersist, @PreUpdate, @PreRemove @Entity @Getter @Builder @AllArgsConstructor @NoArgsConstructor(access = AccessLevel.PROTECTED) public class Member { @Id @Gene..

Spring/JPA 2023.02.17

[Spring/JPA] 엔티티의 생명주기

엔티티 상태 JPA Entity 에는 다음과 같은 4가지 종류의 상태가 존재한다. 비영속 (new/transient) 영속성 컨텍스트와 전혀 관게가 없는 상태 영속 (managed) 영속성 컨텍스트에 저장된 상태 (관리되는 상태) 준영속 (detached) 영속성 컨텍스트에 저장되었다가 분리된 상태 삭제 (removed) 삭제된 상태 생명주기는 다음 그림과 같다. 비영속 순수한 객체 상태이며, 아직 영속성 컨텍스트에 저장되지 않은 상태이다. 영속성 컨테스트나 데이터베이스와 상관없는 상태이다. // 객체를 생성한 상태 (비영속) Member member = new Member(); member.setUsername("clover"); EntityManager#persist 를 호출하기 전 상태이다. 영속 ..

Spring/JPA 2023.02.16

[Spring/JPA] EntityGraph

EntityGraph 란? 연관관계가 있는 엔티티를 조회할 경우, 지연로딩으로 설정되어 있다면 연관관계에서 종속된 엔티티는 쿼리 실행 시, select 쿼리 대신 proxy 객체를 만들어 엔티티가 적용시킨다. 그 후, 해당 proxy 객체가 호출될 때마다 select 쿼리가 전송된다. @EntityGraph 는 연관관계가 지연로딩으로 되어있을 때 fetch 조인을 사용하여 여러 번의 쿼리를 한 번에 해결할 수 있는 점에서 fetch-join 을 어노테이션을 통해 사용할 수 있도록 한 기능이다. (fetch-join은 일반 join 과 달리 연관 엔티티도 함께 영속 상태가 된다는 점이 있다.) 예를 들어 다음과 같은 엔티티들과 연관관계가 있다고 가정해 보자. @Entity @Getter @Builder @..

Spring/JPA 2023.02.15

[Spring/JPA] 벌크 연산(Bulk Operation)과 EntityGraph

벌크 연산에 대해 설명하기 전에 DB 에 Member 라는 테이블이 있고, 구독 가입비(subscription_fee)와 등급(rate) 라는 칼럼이 존재하며, 구독 가입비 칼럼은 월 당 발생하는 정기 구독 가입비, 등급 칼럼은 그 회원의 등급을 나타나며, 이는 구독 가입비에 영향을 미친다고 가정해 보자. (등급은 일반(COMMON), 프리미엄(PREMIUM) 둘 뿐이다.) 등급이 일반(COMMON)인 모든 Member 의 subscription_fee 를 10% 만큼 인상한다면 다음과 같은 SQL문을 짤 수 있다. UPDATE MEMBER SET SUBSCRIPTION_FEE = SUBSCRIPTION_FEE * 1.1 WHERE RATE = "COMMON"; 이제 JPA 의 관점에서 생각해 보자. 아..

Spring/JPA 2023.02.13

[Spring/JPA] JPA 연관관계

※ 해당 글은 Spring Data JPA 를 기준으로 삽질을 하여, 결과물을 도출해 내어 작성하는 글입니다. dependency 버전에 따라 결과가 다를 수 있음을 알립니다. application properties (yml)은 다음과 같이 설정한 상태로 진행 spring: jpa: show-sql: true database: mysql generate-ddl: true hibernate: ddl-auto: update naming: implicit-strategy: org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy database-platform: org.hibernate.dialect.MySQL8Dialect dataso..

Spring/JPA 2023.02.13

[Spring/JPA] JPA(Hibernate 구현체) DDL 전략

※ 본 글은 저자 김영한 개발자의 "자바 ORM 표준 JPA 프로그래밍"의 내용을 요약하였습니다. ※ 구현체의 ddl auto 속성을 사용하여 JPA의 데이터베이스 별로 DDL를 생성하는 데, 이는 데이터베이스 방언에 따라 변한다 Hibernate ddl auto 속성은 다음과 같다. Hibernate DDL auto 속성 create: 기존 테이블을 삭제하고 새로 생성한다. Drop → Create create-drop: create 속성에 추가로 애플리케이션을 종료할 때 Drop(DDL 제거)한다. update: 데이터베이스 테이블과 엔티티 매핑정보를 비교해서 변경사항만 수정한다. (ALTER) validate: 데이터베이스 테이블과 엔티티 매핑정보를 비교해서 차이가 있다면 경고를 남기고 애플리케이션..

Spring/JPA 2022.06.17

[Spring/JPA] EntityManager, EntityManagerFactory

※ 본 글은 저자 김영한 개발자의 "자바 ORM 표준 JPA 프로그래밍"의 내용을 요약하였습니다. ※ 엔티티 매니저는 영속성 컨텍스트라는 곳에서 엔티티들을 관리하는 클래스이며, 엔티티 매니저 팩토리는 위 엔티티 매니저들을 생성하는 엔티티 매니저 공장이라고 생각하면 된다. 데이터베이스를 하나만 사용하는 경우, 보통 EntityManagerFactory를 하나만 생성한다. 엔티티 매니저 팩토리는 생성할 때마다 같은 persistence-unit name으로 지정해서 생성하더라도 계속 새로운 엔티티를 생성하므로 싱글톤, 의존성 주입과 같은 방식으로 개발을 해야한다. EntityManagerFactory emf = Persistence.createEntityManagerFactory("jpabook"); MET..

Spring/JPA 2022.06.03

[Spring/JPA] JPA 객체 매핑

※ 본 글은 저자 김영한 개발자의 "자바 ORM 표준 JPA 프로그래밍"의 내용을 요약하였습니다. ※ 기존 테이블을 생성하기 위해서는 DDL을 사용하여 다음과 같은 방식으로 테이블을 생성했어야 했으며, 예외란 존재하지 않았다. 개발자가 직접 DDL를 작성했어야 했다. CREATE TABLE MEMBER ( ID VARCHAR(255) NOT NULL, NAME VARCHAR(255), AGE INTEGER, PRIMARY KEY (ID) ); 하지만 JPA(=자바 진영 ORM)의 등장으로 위 테이블을 매핑하여 객체지향적인 방식으로 구현이 가능하다. 매핑을 하기에 앞서 우선 자바 코드로 객체화시켜보면 다음과 같다. public class Member { private String id; private St..

Spring/JPA 2022.05.27

[Spring/JPA] JPA 소개

※ 본 글은 저자 김영한 개발자의 "자바 ORM 표준 JPA 프로그래밍"의 내용을 요약하였습니다. ※ 과거 엔터프라이즈 자바 빈즈(이하 EJB)라는 기술 표준이 있었는 데, 그 안에도 엔티티 빈이라는 ORM 기술이 있었다. 하지만, 너무 복잡하고 J2EE 애플리케이션 서버에서만 동작하였기에 오픈소스 ORM 프레임워크, Hibernate(하이버네이트)가 등장하였다. 하이버네이트는 EJB의 ORM에 비해 가볍고, 기술 성숙도가 높으며, J2EE 애플리케이션 서버없이도 동작하였기에 결국, EJB 3.0에서 하이버네이트를 기반으로 새로운 자바 ORM 기술 표준을 만들었는 데, 바로 JPA이다. JPA를 사용하는 이유는 다음과 같으며, 이유의 9할은 JPA의 등장배경과 관련이 깊다. 생산성: JCP(자바 컬렉션 ..

Spring/JPA 2022.05.25

[Spring/JPA] JPA의 등장배경

※ 본 글은 저자 김영한 개발자의 "자바 ORM 표준 JPA 프로그래밍"의 내용을 요약하였습니다. ※ JPA 이전에는 JDBC와 mybatis를 사용하여 데이터베이스를 사용하여 개발하는 데 다음과 같은 문제점들이 존재했었다. 패러다임 불일치: 객체와 관계형 데이터베이스는 서로 지향하는 목적이 다르다. 단순 반복 작업: 단순한 작업인 CRUD를 진행할 때마다 쿼리를 반복적으로 작성해주어야 한다. 유지보수의 어려움: 요구사항의 변동으로 인해 칼럼이 추가 혹은 삭제, 변경 등이 되었을 때, 유연하지 못하다. Query 의존도가 높음: 3번과 마찬가지로 요구사항의 변동이 있어 복잡한 쿼리를 수정해야 하는 경우, 전체를 수정하거나 등의 문제로 객체 매핑하는 데 어려움이 있었다. 이 외에도 문제는 여러 존재한다. ..

Spring/JPA 2022.05.18