[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...
Spring Security6 - Authentication(인증)
·
Spring Security
1. 인증 관련 주요 클래스와 인터페이스 및 동작원리 Authentication: 인증 요청과 인증된 주체를 나타내는 인터페이스이다. AuthenticationManager: 실제로 인증을 처리하는 인터페이스이다. UserDetailsService: 사용자의 세부 정보를 로드하는 방법을 정의한다. PasswordEncoder: 비밀번호의 암호화 또는 해싱을 처리한다. Spring Security 6의 주요 인증 방식(Basic Authentication, Form-Based Authentication, OAuth2, JWT)은 모두 AuthenticationManager를 사용한다. AuthenticationManager는 UserDetailsService를 호출하여 사용자 정보를 로드하고, Authen..
Spring JPA - 데이터 영속화란?
·
Spring Data JPA
문득 JPA를 사용하다 영속화란 단어를 계속보는데 궁금증이 들었다. 데이터 영속화가 뭔지 알아보자 1. 데이터의 영속화가 무슨 의미인가? 데이터의 영속화는 데이터를 장기적으로 보존하는 과정을 의미한다. 이는 일시적인 메모리 저장이 아닌, 데이터베이스와 같은 영구 저장 매체에 데이터를 저장하는 것을 포함한다. 이로 인해 시스템이 종료되거나 장애가 발생해도 데이터는 안전하게 보존된다. 데이터의 영속화는 데이터가 손실되지 않도록 보장하고, 데이터를 효율적으로 검색하고 처리할 수 있도록 한다. 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 ..
스프링에서 데이터 전달의 핵심: VO와 DTO의 이해 및 활용
·
Spring 기초/Spring 기초 지식
스프링에서 Data를 전달하는 객체에는 VO, DTO가 있는데 이게 어떤것인지 알아보자 VO (Value Object)와 DTO (Data Transfer Object)는 모두 Java 및 Spring과 같은 객체 지향 프로그래밍 및 프레임워크에서 데이터를 표현하고 전달하는 데 사용되는 설계 패턴이다. 1. VO, DTO의 차이점 (불변성) 1-1. VO(Value Object)의 불변성 VO는 '불변 객체'다. 한 번 생성되면, 그 상태를 바꿀 수 없다. 작고, 속성이 정해진 객체로, 생성 시에 모든 속성이 설정되고, 이후에는 바뀌지 않는다. 불변성은 VO의 중요한 특징이다. 이건 프로그램의 복잡성을 줄여주고 안정성을 높여준다. 1-2. DTO(Data Transfer Object)의 불변성 DTO는 ..
Spring JPA [SpringBoot3.1] - Querydsl 사용
·
Spring Data JPA
이전 포스팅에서 querydsl적용을 했고 이번에는 repository를 만들어서 사용해 보겠다. 1. QuerydslConfig라는 클래스를 만들고 JPAQueryFactory Bean설정을 해준다. import com.querydsl.jpa.impl.JPAQueryFactory; import jakarta.persistence.EntityManager; import lombok.RequiredArgsConstructor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration @RequiredArgsConstructor publi..