[Spring] Redis에서 RDB로 조회수 동기화하기
·
Spring Data JPA
일정 시간마다 Redis의 데이터를 RDB에 저장해 보자 📌 서론 내가 만든 요리 SNS어플인 "레시피아"에서는 유저가 레시피를 조회하면 조회수 데이터를 Redis에 계속 누적시킨다. 만약 유저가 레시피 상세보기를 하면 Redis에 저장된 누적 조회수 데이터를 호출하여 화면에서 조회수를 보여주도록 기능을 구현했다. 이렇게 RDB에서 데이터를 가져오지 않고 Redis에서 바로 조회수 데이터를 호출하게 하여 빠른 반응속도와 RDB의 부하를 줄였다. 이렇게 행복하고 편리하게 기술이 적용되었다면 참 좋겠지만 Redis는 휘발성 데이터베이스이기 때문에 문제가 발생하면 데이터가 다 날아가기 때문에 복구 전략이 엄청 중요하다. 이미 Redis에서는 자체적인 복구기능으로 aof, rdb 방식을 지원하지만 이것만으로는..
JPA N+1 문제가 발생하는 상황과 해결방법
·
Spring Data JPA
이번 포스트에서는 JPA를 사용할 때 N+1 문제가 발생하는 상황과 3가지 해결방법을 알아보자 📌 서론 JPA에서 너무 많은 SQL 쿼리를 실행하는 것은 성능 문제의 가장 일반적인 원인 중 하나다. 잘못 구현되면, 아주 간단해 보이는 쿼리조차도 데이터베이스에 수십 또는 수백 개의 SQL 쿼리를 발생시킬 수 있다. 우리는 이런 문제를 n+1 쿼리 문제라고 한다. 이번 포스트에서는 이러한 N+1 문제에 대해서 다뤄보고자 한다. 1. N+1 문제가 발생하는 상황 설명 지금부터 N+1 문제가 발생하는 상황을 가정한다. 프로젝트 세팅은 다음과 같다. SpringBoot 3.2 Lombok org.projectlombok:lombok JPA Spring Data JPA DB PostgreSQL Querydsl 5...
[SpringBoot] 3.x.x 버전에서 P6Spy 적용하기
·
Spring Data JPA
SpringBoot3.x.x 에서 JPA로그 추적을 위한 P6Spy 적용을 해보자 1. SpringBoot 프로젝트 내부에 P6spy를 적용시키는 이유 P6Spy를 사용하는 주된 이유는 스프링 부트와 JPA를 사용하는 프로젝트에서 SQL 쿼리를 정확하고 효과적으로 로깅하고 추적하기 위해서다. P6Spy는 아래의 3가지 상황에서 중요하게 사용된다. 쿼리 확인 JPA는 매우 편리하지만, 개발자가 직접 쿼리를 작성하지 않기 때문에 실제 어떤 쿼리가 실행되는지 확인하기 어렵다. P6Spy를 사용하면 이러한 쿼리를 눈으로 직접 확인할 수 있다. 특히 의도한 대로 작동하지 않을 때나 N+1 문제가 발생했는지 확인이 필요할 때 유용하다​​. 프록시를 통한 로깅 P6Spy는 기존 어플리케이션의 코드를 변경하지 않고도 ..
[Spring] Data JPA의 구조를 알아보자
·
Spring Data JPA
스프링 Data JPA의 구조를 알아보자 📌 서론 JPA를 사용하다보니 대체 어떻게 나는 내 Repository를 생성하고 JpaRepository를 상속받기만 해서 JPA의 기능을 사용할 수 있는 것인지 궁금해졌고 이에 Diagram부터 파고들어 분석을 하기 시작했다. 1. JpaRepository와 상속 관계 Repository 마커 인터페이스로서, 실제 구현이 없다. CrudRepository CRUD(Create, Read, Update, Delete) 기능을 제공한다. PagingAndSortingRepository, ListPagingAndSortingRepository 페이징 및 정렬 기능을 추가로 제공한다. ListCrudRepository List 컬렉션에 특화된 CRUD 및 페이징/정렬..
Spring JPA - 데이터 영속화란?
·
Spring Data JPA
문득 JPA를 사용하다 영속화란 단어를 계속보는데 궁금증이 들었다. 데이터 영속화가 뭔지 알아보자 1. 데이터의 영속화가 무슨 의미인가? 데이터의 영속화는 데이터를 장기적으로 보존하는 과정을 의미한다. 이는 일시적인 메모리 저장이 아닌, 데이터베이스와 같은 영구 저장 매체에 데이터를 저장하는 것을 포함한다. 이로 인해 시스템이 종료되거나 장애가 발생해도 데이터는 안전하게 보존된다. 데이터의 영속화는 데이터가 손실되지 않도록 보장하고, 데이터를 효율적으로 검색하고 처리할 수 있도록 한다. 2. 데이터 영속화의 장점 데이터의 영속화에는 다음과 같은 장점이 있다. 데이터 손실 방지: 데이터를 안정적인 저장 매체에 보존함으로써, 시스템 장애나 다른 문제로 인한 데이터 손실을 방지한다. 효율적인 검색 및 처리: ..
Spring JPA - 엔티티를 DTO로 바꿔서 사용하는 이유
·
Spring Data JPA
이번 포스트에서는 SpringBoot 프로젝트에서 왜 Entity를 DTO로 변환시켜서 사용하는지 알아보자 1. 엔티티와 DTO 엔티티(Entity): 엔티티는 데이터베이스의 테이블과 직접 매핑되는 객체로, 비즈니스 로직을 포함할 수 있다. 엔티티는 데이터베이스와의 상호작용을 위해 설계되며, 변경이 발생하면 데이터베이스 스키마에도 영향을 미칠 수 있다. DTO(Data Transfer Object): DTO는 계층간 데이터 교환을 위한 객체로, 로직을 포함하지 않고 순수한 데이터만을 가지고 있다. DTO는 특정 엔티티의 일부 데이터나 여러 엔티티의 조합된 데이터를 전달하는 데 사용될 수 있으며, 클라이언트와 서버 간의 통신에 최적화된 구조를 가진다. 2. 엔티티를 직접 사용하는 문제점 데이터 노출 문제 ..
Spring JPA - 연관관계 매핑
·
Spring Data JPA
저번 포스트에서 Entity에 대해서 알아봤으니 이번엔 연관관계에 대한 매핑을 알아보자 1. 엔티티의 연관관계 매핑이란? 엔티티의 연관관계 매핑은 객체 간의 관계를 데이터베이스 테이블에 매핑하는 작업을 의미한다. 이를 통해 객체지향적인 프로그래밍 모델을 유지하면서 데이터베이스와의 관계를 표현할 수 있다. JPA에서는 다양한 연관관계 매핑 어노테이션을 제공하여 이를 구현할 수 있다. 연관관계 매핑에는 다음과 같은 어노테이션들이 사용된다. @OneToOne: 일대일 관계를 매핑한다. 양방향 매핑이 가능하며, 대상 엔티티와 매핑할 때는 @JoinColumn 어노테이션을 사용한다. @OneToMany: 일대다 관계를 매핑한다. 단방향 매핑 또는 양방향 매핑으로 설정할 수 있다. 대상 엔티티에는 @ManyToOn..
Spring JPA - Entity
·
Spring Data JPA
이번 포스트에서는 엔티티에 대해서 알아보자 1. 엔티티(Entity) 엔티티는 JPA가 데이터베이스와 상호작용하는데 필요한 주요 객체이다. 엔티티는 실제로 데이터베이스 테이블의 하나의 레코드를 나타내는 자바 객체이다. 이 엔티티는 데이터베이스에서 정보를 읽고, 변경하고, 생성하고, 삭제하는 모든 작업에 사용된다. 2. 엔티티를 만들기 위한 규칙 클래스 상단에 @Entity 어노테이션 적기 엔티티 클래스는 @Entity라는 어노테이션을 클래스에 표시해야 한다. 이것이 없으면 JPA는 이것을 엔티티로 인식하지 못한다. 기본 키: 반드시 기본 키(@Id 어노테이션이 붙은 필드)를 가지고 있어야 한다. 기본 키는 데이터베이스 테이블에서 각 레코드를 고유하게 식별하는 데(pk로) 사용된다. 기본 생성자: JPA ..