Spring

📌 서론우리는 현재 redis에 정보를 넣어놓고 거기서 조회하고 삭제하고 저장하는 작업을 하고 있다. 그런데 동일한 프로젝트를 2개의 인스턴스로 띄우기 때문에 redis에 동시성 이슈가 생기는 것을 방지해야 했다. 여기서 동시성 이슈를 해결하기 위해 적용한 방법을 간단하게 소개해보려고 한다. 동시성 이슈 해결을 위한 Redis Lock동시성 이슈는 여러 프로세스나 스레드가 동일한 자원에 동시에 접근할 때 발생할 수 있는 문제를 의미한다. 이러한 문제를 해결하기 위해 Redis를 사용한 잠금 메커니즘을 활용할 수 있다. 동시성 이슈란?동시성 이슈는 여러 프로세스나 스레드가 동시에 같은 자원에 접근할 때 발생할 수 있는 문제를 말한다. 예를 들어, 두 개의 인스턴스가 같은 Redis 데이터베이스에 접근하여..
📌 서론그동안 Redis가 key-value를 저장하는 저장소라고 들어서 그냥 간단한 "category":1 같은 것만 저장하는 줄 알았다. 그러나 Redis에서도 key 값에 객체나 List를 넣을 수 있다는 것을 알게 되었다.실제로 프로젝트를 진행하면서 DB에서 자주 조회되는 카테고리를 레디스에 저장해야할일이 생겼다. 이 과정에서 알게된 어노테이션과 각 쓰임새를 정리해 보자. @RedisHash@RedisHash 어노테이션은 Spring Data Redis에서 사용되는 어노테이션으로, Redis에 객체를 해시 형태로 저장할 때 사용된다. 이 어노테이션은 Redis에 저장될 엔티티 클래스를 정의하는 데 사용되며, 해시 키를 지정할 수 있다. @RedisHash 어노테이션을 사용하여 Redis에서 데이..
이전 글에서 기본적인 MapStruct 라이브러리를 사용하는 방법을 알아봤다. 기본 사용법에서 더 나아가서 더 복잡한 로직을 구현할 수 있는 어노테이션도 알아보자! @AfterMapping@AfterMapping 어노테이션은 대상 타입의 객체가 매핑된 후 추가적인 커스텀 로직을 실행하고 싶을 때 사용된다. 이 어노테이션은 매핑 과정이 끝난 직후에 호출되므로, 매핑되지 않은 필드를 수동으로 설정할 수 있다. @Named@Named 어노테이션은 특정 매핑 메서드에 이름을 부여하여, 매핑 대상 필드에서 이 메서드를 지정하여 사용하고자 할 때 적용된다. 이를 통해 복잡한 매핑 로직이나, 다양한 상황에 따른 매핑 로직을 구현할 수 있다. 어노테이션 사용 예시 코드Entity (Question.java)@Gette..
MapStruct란?MapStruct는 Java 기반의 라이브러리로, 객체 간의 매핑을 손쉽게 도와주는 코드 생성기이다. 이 라이브러리는 주로 서비스 계층과 데이터 접근 계층 사이, 또는 다양한 계층 간의 데이터 전송 객체(DTO)와 도메인 또는 엔티티 객체 간의 변환 작업을 자동화하기 위해 사용된다. 개발자는 변환 로직을 직접 작성하는 대신, 인터페이스에 어노테이션을 사용하여 어떤 필드가 어떻게 매핑되어야 하는지를 선언적으로 정의한다. 그 후, MapStruct는 이 인터페이스를 기반으로 구현 클래스를 자동 생성한다. 이 과정은 프로젝트의 컴파일 시점에 이루어지므로, 런타임 시에 추가적인 성능 저하 없이 매핑 로직을 실행할 수 있다. MapStruct 동작 원리MapStruct의 핵심 동작 원리는 다음..
JPA를 사용하여 페이징 처리를 할 때 Slice와 Page 두 가지 방법이 있다. SliceJPA와 QueryDSL을 사용하여 페이징 처리를 할 때 Slice를 반환하는 방법은 전체 결과의 개수를 쿼리하지 않아도 되는 특별한 접근 방식이다. 이 방식은 페이징 처리 시 필요한 데이터의 일부만 로드하면서 다음 페이지가 존재하는지 여부만을 알려주는 방법이다. 즉, 사용자가 요청한 페이지와 그다음 페이지의 데이터만 조회하여 현재 페이지 다음에 데이터가 더 있는지 여부를 판단한다.  Slice의 동작 방식Slice는 페이징 처리된 데이터 목록과 함께 다음 페이지의 존재 여부를 알려주는 방식으로, 전체 데이터의 수를 계산하지 않기 때문에 count 쿼리를 실행할 필요가 없다. 이는 특히 대용량 데이터를 다룰 때 ..
@Builder 어노테이션Spring Boot와 Lombok 라이브러리를 활용할 때 @Builder 어노테이션은 객체 생성 과정을 간소화하고, 더 유연하고 안정적인 코드를 작성할 수 있도록 돕는다. 이 어노테이션은 크게 두 가지 방식으로 사용될 수 있다: 클래스 전체에 적용하는 방식과 클래스 내부의 특정 메서드에 적용하는 방식이다. 이 두 방식은 객체 생성의 유연성과 사용 목적에서 차이를 보인다.  클래스 전체에 @Builder 선언클래스 레벨에 @Builder를 선언하면, 해당 클래스의 모든 필드를 포함하는 빌더 클래스가 자동으로 생성된다. 이 방식은 클래스의 모든 필드를 빌더 패턴을 통해 설정할 수 있도록 하며, 불변 객체 패턴(Immutable Object Pattern)을 구현하기 위해 주로 사용..
📌 서론QueryRepository로 커스텀 레파지토리를 생성하고 @DataJpaTest로 테스트를 진행하려고 보니까 해당 Repository의 빈을 찾아오지 못하는 이슈가 발생했다. 이 이슈를 해결하면서 놓쳤던 부분을 다시한번 정리해보려고 한다. QueryDLS란?QueryDSL은 Java 어플리케이션에서 타입 안전성을 보장하는 동시에 복잡한 쿼리를 간결하게 작성할 수 있게 해주는 프레임워크다.특히, 스프링 부트와 함께 사용할 때, 데이터 접근 로직을 구현하는 방법에는 크게 두 가지 접근 방식이 있다: 기존의 custom interface 방식과 단독 빈으로 등록하는 QueryRepository 방식이다. 이 두 방식은 각각의 장단점을 가지며, 사용하는 컨텍스트에 따라 선택이 달라질 수 있다. 이번 ..
에러 발생MSSQL을 사용하면서 JPA와 QueryDSL을 활용하여 페이징 처리를 하다가 첫 페이지 조회 할때는 TOP 쿼리를 사용하여 데이터를 성공적으로 가져오지만, 두 번째 페이지부터는 OFFSET을 사용해야 하는데 이때 OFFSET이 존재하지 않는다는 에러가 발생했다.  에러 로그에러 로그는 다음과 같다. [12:27:08.181][DEBUG] org.springframework.orm.jpa.JpaTransactionManager[doCleanupAfterCompletion:648] - Closing JPA EntityManager [SessionImpl(1815722544)] after transaction [12:27:08.181][INFO ] org.springframework.test.c..
평양냉면7
'Spring' 카테고리의 글 목록