📌 서론우리는 현재 redis에 정보를 넣어놓고 거기서 조회하고 삭제하고 저장하는 작업을 하고 있다. 그런데 동일한 프로젝트를 2개의 인스턴스로 띄우기 때문에 redis에 동시성 이슈가 생기는 것을 방지해야 했다. 여기서 동시성 이슈를 해결하기 위해 적용한 방법을 간단하게 소개해보려고 한다. 동시성 이슈 해결을 위한 Redis Lock동시성 이슈는 여러 프로세스나 스레드가 동일한 자원에 동시에 접근할 때 발생할 수 있는 문제를 의미한다. 이러한 문제를 해결하기 위해 Redis를 사용한 잠금 메커니즘을 활용할 수 있다. 동시성 이슈란?동시성 이슈는 여러 프로세스나 스레드가 동시에 같은 자원에 접근할 때 발생할 수 있는 문제를 말한다. 예를 들어, 두 개의 인스턴스가 같은 Redis 데이터베이스에 접근하여..
Spring/Spring Boot
📌 서론그동안 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의 핵심 동작 원리는 다음..
@Builder 어노테이션Spring Boot와 Lombok 라이브러리를 활용할 때 @Builder 어노테이션은 객체 생성 과정을 간소화하고, 더 유연하고 안정적인 코드를 작성할 수 있도록 돕는다. 이 어노테이션은 크게 두 가지 방식으로 사용될 수 있다: 클래스 전체에 적용하는 방식과 클래스 내부의 특정 메서드에 적용하는 방식이다. 이 두 방식은 객체 생성의 유연성과 사용 목적에서 차이를 보인다. 클래스 전체에 @Builder 선언클래스 레벨에 @Builder를 선언하면, 해당 클래스의 모든 필드를 포함하는 빌더 클래스가 자동으로 생성된다. 이 방식은 클래스의 모든 필드를 빌더 패턴을 통해 설정할 수 있도록 하며, 불변 객체 패턴(Immutable Object Pattern)을 구현하기 위해 주로 사용..
RequestDto에서 MultipartFile 필드 사용 방법: 객체 바인딩 방법부터 테스트 코드까지 📌 서론 기존에 RequestDto로 사용하던 dto에 MultipartFile 필드를 추가해줘야 할 일이 있었다. RequestDto에 MultipartFile 필드를 추가해 주면서 기존에 사용하던 방식과 다르게 사용해야 하는 부분들이 여러 개 있어서 그 점에 대해서 설명해보려고 한다. 특히, @RequestBody 대신 @ModelAttribute 어노테이션을 사용해야 하는 이유와 RequestDto에 Setter 메서드가 필요한 이유, 그리고 테스트 코드의 수정에 초점을 맞춰 설명하겠다. 1. 컨트롤러 어노테이션: @RequestBody에서 @ModelAttribute로 전환 기존에 컨트롤러에서 ..
스프링 부트 3에 레디스 적용하기 📌 서론 스프링 부트 3을 사용하여 Redis를 통한 데이터 처리에 관한 내용을 설명해 보겠다. 1. Redis 의존성 추가 먼저, build.gradle에 Redis 의존성을 추가한다. 이것은 Spring Boot 프로젝트에 Redis 기능을 통합하는 첫 단계이다. // redis implementation 'org.springframework.boot:spring-boot-starter-data-redis' 2. Redis 설정 application.yml에서 Redis 서버의 연결 정보를 설정한다. 여기에는 호스트, 포트, 비밀번호, 사용할 데이터베이스 번호 등이 포함된다. spring: redis: host: localhost port: 6379 password:..
스프링 부트 3.1.2 버전에서 AWS SNS 클라이언트 여러 개 사용하기 📌 서론 기존에 이미 프로젝트에서 서울 리전에 SNS, SQS를 사용하기 위한 SnsClient가 빈으로 등록되어 있던 상황이다. 그런데 회원가입을 할 때 사용자가 입력한 휴대폰 번호로 문자를 보내는 기능이 추가되었다. 이 기능을 개발하기 위해 AWS SNS 기능 중 SMS 문자 메시지를 보내는 서비스를 이용하기로 했다. 그러나 AWS 서울 리전에는 SMS를 보내는 기능이 없기 때문에 도쿄 리전에서 SMS를 보내는 기능을 사용했다. 그리고 스프링 부트에 도쿄 리전에서 SMS 전송을 위한 SNS 클라이언트를 생성하려다 보니 동일한 SnsClient 가 두 개 생겨버리는 문제가 발생했다. 🔻 AWS SNS, SnsClient가 무엇인..