JPA
[JPA] Fetch Join의 양면성
[JPA] Fetch Join의 양면성
2024.05.28들어가기 전저는 Fetch Join이 장점만 존재한다고 생각을 하였었습니다. 그런데 모든 기술에는 장점만 존재하지 않다는 것을 다시 한번 깨닫게 되었습니다.그래서 이번 포스팅에서는 N+1 문제를 해결하기 위해 사용하는 Fetch Join의 양면성에 대해서 다뤄보겠습니다. N+1이 무엇인지 정확하게 모르시는 분은 아래 포스팅을 읽고 이번 포스팅을 읽으시는 것을 추천드리겠습니다. https://hoestory.tistory.com/45 [JPA] N+1 원인 및 해결방법들어가기 전 이번 글에서는 N+1이 무엇이고 발생 원인과 N+1을 방지하기 위한 임시방편, 해결방법에 대해 알아보겠습니다. 그리고 예시로 Person, House 엔티티가 있습니다. Person(N) : House(1) 관계로 이hoestor..
[JPA] 2차 캐시란?
[JPA] 2차 캐시란?
2024.01.16들어가기 전 이번 포스팅에서는 JPA의 1차 캐시가 아닌 2차 캐시에 대해 알아보겠습니다. 필자는 지금까지 JPA의 2차 캐시에 대한 존재를 모르고 개발을 하고 있었습니다. 최근에 2차 캐시라는 단어를 우연히 듣게 되어 이렇게 블로그를 쓰게 되었습니다. 일단 2차 캐시에 대해 알아보기 전에 1차 캐시에 대해 알아볼 것이고 캐시라는 단어가 생소한 분들께서는 아래 포스팅을 읽고 이번 포스팅을 보면 좋을 거 같습니다. https://hoestory.tistory.com/46 [Redis] Redis 개념 및 특징 들어가기 전 Redis는 Cache와 연관이 되어 있어 Cache에 대해 먼저 알아보고 Redis의 개념과 특징에 대해 알아보겠습니다. Cache란? 자주 사용하는 데이터를 메모리에 미리 복사해 놓는..
[JPA] JdbcTemplate과 JPA 데이터 Insert 속도 비교
[JPA] JdbcTemplate과 JPA 데이터 Insert 속도 비교
2023.06.09들어가기 전 업무를 보다가 대용량 데이터를 저장해야 되는 상황에 맞닥뜨렸습니다. 그래서 평소처럼 JPA를 이용하여 데이터를 넣으려고 했는데 저장속도가 너무 느려 JdbcTemplate을 이용하여 bulkInsert를 하였습니다. 해당 포스팅에서는 JdbcTemplate과 JPA를 이용하여 예시로 50만 건의 데이터가 저장되는 속도를 비교하고 JdbcTemplate보다 Jpa가 데이터 저장속도가 느린 이유에 대해 알아보겠습니다. JPA를 이용하여 데이터 저장 JPA에서는 save, saveAll을 이용하여 데이터를 저장할 수 있습니다. 그래서 save와 saveAll 저장속도를 먼저 비교해 보겠습니다. 1. Save 1) 코드 @SpringBootTest public class BlogContents { ..
[JPA] Cascade 옵션 종류 및 예제
[JPA] Cascade 옵션 종류 및 예제
2023.04.12Cascade란? Cascde는 영속성 전이라고 합니다. Cascade 옵션을 정의한 엔티티가 영속화되면 연관된 엔티티도 영속화되고 삭제되면 삭제되는 것 속성입니다. @ManyToOne, @OneToMany 등 연관관계를 설정하는 부분에 옵션으로 정의되어 있습니다. 주의 : 엔티티를 영속화할 때 연관된 엔티티도 같이 영속화한다는 편리함만 제공할 뿐 연관관계를 설정하는 어노테이션과는 관련이 없습니다. Cascade 종류 ALL PERSIST REMOVE MERGE REFRESH DETACH Cascade옵션 중 ALL, PERSIST, REMOVE, MERGE, DETACH에 대해서만 예제를 다루고 REFRESH에 대해서는 개념만 알아보겠습니다. 예제 공통 코드 // Image 엔티티 @Entity cla..
[JPA] Kotlin을 이용하여 Soft Delete 구현
[JPA] Kotlin을 이용하여 Soft Delete 구현
2023.03.04들어가기 전 Soft Delete와 Hard Delete에 대해 설명하고 Kotlin을 이용하여 JPA에서 지원해 주는 Auditing과 JpaRepository를 이용하여 Soft Delete를 구현하는 예제에 대해 알아보겠습니다. Hard Delete란? DB에 저장되어 있는 데이터를 물리적으로 삭제하는 것을 의미합니다. JPA에서 제공하는 메서드 deleteById, delete, deleteAll 등을 이용하거나 DML 중 하나인 delete 쿼리를 이용해서 물리적으로 데이터를 삭제할 수 있습니다. Soft Delete란? Hard Delete와 달리 DB에 저장되어 있는 데이터를 물리적이 아닌 논리적으로 삭제하는 것을 의미합니다. 논리적으로 삭제한다는 것은 테이블 컬럼 중 하나를 해당 데이터가 ..
[JPA] N+1 원인 및 해결방법
[JPA] N+1 원인 및 해결방법
2023.01.18들어가기 전 이번 글에서는 N+1이 무엇이고 발생 원인과 N+1을 방지하기 위한 임시방편, 해결방법에 대해 알아보겠습니다. 그리고 예시로 Person, House 엔티티가 있습니다. Person(N) : House(1) 관계로 이루어져 있습니다. 즉 Person이 해당 예시에서 연관관계 주인입니다. @Entity @Getter @Setter public class House { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; private String address; } @Entity @Getter @Setter public class Person { @Id @GeneratedValue..
[Querydsl] 스프링 부트에서 Querydsl 설정
[Querydsl] 스프링 부트에서 Querydsl 설정
2022.06.14들어가기 전 스프링 부트 2.6 이상 버전에서는 2.6 이하 버전에서 설정한 부분에 조금 추가를 하셔야 정상적으로 동작합니다. 필자는 스프링 부트 버전 2.7 Gradle 버전 7.4.1을 기준으로 설정을 하였습니다. 스프링 부트 2.6 이하 버전 먼저 스프링 부트 2.6이하 버전에서 querydsl 설정을 알아보겠습니다. build.gradle plugins { // querydsl 추가 id "com.ewerk.gradle.plugins.querydsl" version "1.0.10" } dependencies { implementation 'com.querydsl:querydsl-jpa' } //querydsl 추가 def querydslDir = "$buildDir/generated/queryds..
[JPA] 프록시, 즉시 로딩, 지연 로딩
[JPA] 프록시, 즉시 로딩, 지연 로딩
2022.01.30프록시 연관된 객체를 자유롭게 탐색하기 위해 사용하는 기술입니다. 엔티티를 조회할 때 연관된 엔티티들이 항상 같이 조회되는 것은 아닙니다. 엔티티가 실제 사용될 때까지 데이터베이스 조회를 지연하는 방법을 지연 로딩이라고 하는데 지연 로딩 기능을 사용하려면 실제 엔티티 객체 대신에 데이터베이스 조회를 지연할 수 있는 가짜 객체가 필요한데 그것을 프록시 객체라고 합니다. 프록시를 사용하면 연관된 객체를 처음부터 데이터베이스에서 조회하는 것이 아니라 실제 사용하는 시점에서 데이터 베이스를 조회할 수 있습니다. ※ 공통 예제 코드 ※ @Entity @Getter @Setter public class Member { @Id @GeneratedValue private Long id; private String na..
[JPA] 단방향, 양방향, 연관관계 주인
[JPA] 단방향, 양방향, 연관관계 주인
2022.01.26단방향, 양방향 테이블은 외래키 하나로 양방향 쿼리가 가능해서 방향이라는 개념이 없습니다. 객체는 참조용 필드를 가지고 있는 객체만 연관된 객체를 조회할 수 있습니다. 단방향 : 객체 관계에서 한쪽만 참조하는 것을 말합니다. 양방향 : 객체 관계에서 양쪽이 서로 참조하는 것을 말합니다. 연관관계 주인 데이터베이스는 외래키 하나로 두 개의 테이블을 연관관계를 맺습니다. 데이터베이스는 연관관계를 관리하는 지점은 외래키 하나인 반면에 엔티티를 양방향으로 매핑하면 두 개의 객체는 서로 참조를 해서 객체의 연관관계를 관리하는 지점은 2개가 됩니다. 연관관계 주인은 두 객체의 연관관계 중 하나를 정해서 데이터베이스의 외래키를 관리하는 것입니다. 연관관계 주인은 @JoinColumn(name = "참조하는 테이블 기..
[JPA] 엔티티 매핑
[JPA] 엔티티 매핑
2022.01.25JPA에서 사용하는 엔티티 매핑에 대해 알아보겠습니다. 객체와 테이블 매핑 기본키 매핑 필드와 컬럼 매핑 객체와 테이블 매핑 @Entity @Table @Entity 테이블과 매핑할 클래스에 @Entity를 붙입니다. @Entity 속성 속성 기능 기본값 name JPA에서 사용할 엔티티 이름을 지정하고 같은 엔티티 클래스가 있다면 이름을 지정해서 충돌하지 않도록 해야합니다. 설정하지 않으면 클래스 이름 그대로 사용합니다. @Entity public class Jpa { } @Entity(name = "Member") public class Member{ } @Entity 적용 시 주의 사항 접근 지정자가 public 또는 protected인 기본 생성자가 필수입니다. final 클래스, enum, in..
[JPA]영속성 컨텍스트란?
[JPA]영속성 컨텍스트란?
2022.01.191. 영속성 컨텍스트란? 영속성 컨텍스트는 JPA에서 가장 중요한 용어입니다. 영속성 컨텍스트는 엔티티를 영구 저장하는 환경이라는 뜻입니다. 엔티티 매니저 팩토리로 생성한 엔티티 매니저로 엔티티를 저장하거나 조회하면 엔티티 매니저는 영속성 컨텍스트에 엔티티를 보관하고 관리합니다. 2. EntityManagerFactory, EntityManager, EntityTransaction EntityManagerFactory 엔티티 매니저 팩토리는 이름 그대로 엔티티 매니저 공장을 뜻합니다. 엔티티 매니저 팩토리는 많이 생성하면 안 되고 애플리케이션 전체에서 공유하도록 설계되어야 합니다. 이유는 엔티티 매니저 팩토리는 생성하는데 비용이 매우 크기 때문에 많이 생성되면 안 됩니다. 여러 스레드가 동시에 접근해도 ..