본문 바로가기

프로젝트 기록/Spring5

[Spring Data JPA] MariaDB에서의 동시성 이슈로 인한 갱신 이상 문제와 그 해결법(비관적 락, 낙관적 락) 동시성 이슈란?멀티 스레드로 동작하는 데이터베이스에서 동시에 2개 이상의 트랜잭션이 실행돼서 데이터의 정합성이 맞지 않게 되는 이슈를 의미합니다. 동시성 이슈를 확인해보자MariaDB에서 정말 동시성 이슈가 생기는지를 확인해보기 위해 Spring Boot 프로젝트 하나를 만들었습니다. 우선 이렇게 2개의 엔티티를 만들어주었는데, 각각의 용도는 이렇습니다.TestEntity: 초기에 count를 N개로 하고, 이 count를 감소시키며 갱신이상 문제가 생기는지 확인RequestRecord: 요청이 들어올 때마다 하나씩 생성해서 해당 트랜잭션이 롤백된게 아니라는 것을 증명하기 위해 사용 그리고 count 감소 API를 위한 TestController와 TestService도 만들어줬습니다. 요청이 들어오면,.. 2024. 11. 20.
[Spring / FCM] FCM 웹 푸시 알림 구현기 (서버 편) 부트캠프에서 최종 프로젝트 "동상이농"을 진행하며 FCM을 이용한 알림 기능을 맡게 되었습니다.해당 기능을 구현한 과정을 기록해보고자 합니다. 1. 비공개 키 생성프로젝트 설정 > 서비스 계정 > 자바로 들어간 후, 하단에 있는 "새 비공개 키 생성" 버튼을 눌러 비공개키를 다운 받아줍니다. 다운 받은 비공개 키는 resources로 옮겨줍니다!동상이농의 서버는 MSA 구조로 되어있는데, 멤버 모듈에서 FCM 알림을 처리할 예정이므로, 멤버 모듈의 resources에 넣어주었습니다. 2. 스프링 프로젝트에 firebase 의존성 추가build.gradle에 해당 의존성을 추가해줍니다dependencies { implementation 'com.google.firebase:firebase-admin:9... 2024. 9. 22.
[Spring / Redis] 이중화 서버에서의 웹 소켓 채팅 + SSE 알림 구현기 잊기 전에 기록하자, Redis Pub/Sub을 활용한 STOMP 채팅 + SSE 알림 약 한달간의 사이디(Si-D) 프로젝트가 끝났습니다.   사이디 프로젝트에서는 STOMP를 활용한 1대1 채팅 기능이 있었는데, 채팅이 오면 Server Sent Event 기능으로 즉시 알림을 쏴줄 수 있게 했습니다.오늘은 그 기능을 구현하는 방법과 구현하며 레디스에 대해 알게된 사실을 정리해보려고 합니다.  이중화 서버에서의 웹 소켓 통신과 SSE 알림을 처리하는 방법  일단 냅다 아키텍처 사진을 보여드린 이유는...사이디의 운영 서버는  쿠버네티스에서 파드를 2개 띄워서 두 대의 서버가 요청을 처리해주는 구조로 동작하고 있다는 것을 알려드리기 위함입니다. 그런데 Web Socket과 SSE 모두 클라이언트에 데이.. 2024. 9. 7.
[Spring / Redis] @RedisHash 어노테이션을 붙인 객체를 레디스에 저장했을때, 그 값을 확인하는 방법 redis-cli에서 내가 넣은 값을 확인하는 방법key는 @RedisHash 에 설정해놓은 value와 그 어노테이션이 붙은 클래스 중 @Id 어노테이션이 붙은 필드를 조합하여 value:Id로 설정됩니다.즉, 아래와 같은 클래스가 있고, 객체를 만들때 Id인 accessToken 필드 값을 "hello"로 설정해놨다면package com.mewsinsa.auth.jwt.redis.dto;import com.mewsinsa.member.domain.Member;import org.springframework.data.annotation.Id;import org.springframework.data.redis.core.RedisHash;@RedisHash(value = "accessToken", time.. 2024. 5. 18.
[Spring / Project] 응답 객체에서 상속 구조를 사용해보자 이번 글은 어떤 지식을 전하는 글이라기 보단, 프로젝트를 하면서 제가 놓치고 있었던 부분에 대한 회고록에 가깝습니다,,ㅎㅎ멘토님의 피드백을 받고 느끼게 된 것은 '내가 정말 자바의 상속을 이용하지 못하고 있구나'입니다.제가 자바를 좋아하는 이유는 객체지향을 잘 지원해주는 언어이기 때문이라고 생각했는데, 정작 프로젝트를 하면서 상속을 거의 이용하지 않고 있었다는 것이 부끄러워졌습니다.멘토님께서 피드백 주신 것이, 일단 응답 객체인 FailureResult, SuccessResult가 상속 구조로 변경할 수 있을 것 같으니 이 둘을 상속 구조로 바꿔보라는 것이었습니다.오늘 포스트는 이 두 객체를 상속 구조로 바꾸는 일종의 리팩토링(?) 과정에 대해 기록해보려고 합니다.원래는 어떻게 되어 있었는데?원래 코드는.. 2024. 5. 13.