본문 바로가기

Spring

(5)
[Spring Data JPA] MariaDB에서의 동시성 이슈로 인한 갱신 이상 문제와 그 해결법(비관적 락, 낙관적 락) 동시성 이슈란?멀티 스레드로 동작하는 데이터베이스에서 동시에 2개 이상의 트랜잭션이 실행돼서 데이터의 정합성이 맞지 않게 되는 이슈를 의미합니다. 동시성 이슈를 확인해보자MariaDB에서 정말 동시성 이슈가 생기는지를 확인해보기 위해 Spring Boot 프로젝트 하나를 만들었습니다. 우선 이렇게 2개의 엔티티를 만들어주었는데, 각각의 용도는 이렇습니다.TestEntity: 초기에 count를 N개로 하고, 이 count를 감소시키며 갱신이상 문제가 생기는지 확인RequestRecord: 요청이 들어올 때마다 하나씩 생성해서 해당 트랜잭션이 롤백된게 아니라는 것을 증명하기 위해 사용 그리고 count 감소 API를 위한 TestController와 TestService도 만들어줬습니다. 요청이 들어오면,..
[MSA / Spring Cloud] Spring Cloud MSA 프로젝트에서 CORS 설정에 대해 (feat. 403 error) 부트캠프 프로젝트의 "동상이농"에서 Spring Cloud 프레임워크를 이용하여 MSA 프로젝트 세팅을 맡았는데요제가 MSA 세팅을 하며 CORS 설정에 대해 놓쳤던 부분과 새롭게 알게된 것에 대해 포스팅해보려고 합니다. 동상이농의 MSA 아키텍처동상이농 프로젝트는 아래와 같은 MSA 구조를 가지고 있습니다.8081 포트를 사용하고 있는 vue 프로젝트가 8080 포트를 사용하고 있는 API Gateway에게 요청을 보내면API Gateway는 서비스 디스커버리 역할을 하는 Eureka 서버를 통해 각 모듈의 IP, Port 정보를 알아내고 적절한 곳으로 라우팅하는 것이죠.(API gateway와 Eureka를 제외한 서버들은 유동포트를 쓰고 있기 때문에, Eureka를 통해 IP, Port를 알아내는 ..
[Spring Cloud] MSA 구조에서 요청이 처리되지 않는 문제 (Suppressed: reactor.core.publisher.FluxOnAssembly$OnAssemblyException) 동상이농 프론트 개발이 시작됐습니다. 제가 axios 인터셉터 세팅을 맡았는데요.인터셉터 코드를 추가하고, 제대로 동작하는지 보기 위해서 아래와 같이 서버에 간단한 요청을 보냈는데 응답이 오지 않았습니다..  API Gateway의 로그를 확인해보니 다음과 같은 에러메시지가 찍혀있었습니다. 2024-09-28T12:02:38.403+09:00 ERROR 80418 --- [api-gateway] [ctor-http-nio-2] a.w.r.e.AbstractErrorWebExceptionHandler : [d48b9c9b-243] 500 Server Error for HTTP GET "/member-service/member/healthcheck"io.netty.channel.ConnectTimeoutE..
[Spring / FCM] FCM 웹 푸시 알림 구현기 (서버 편) 부트캠프에서 최종 프로젝트 "동상이농"을 진행하며 FCM을 이용한 알림 기능을 맡게 되었습니다.해당 기능을 구현한 과정을 기록해보고자 합니다. 1. 비공개 키 생성프로젝트 설정 > 서비스 계정 > 자바로 들어간 후, 하단에 있는 "새 비공개 키 생성" 버튼을 눌러 비공개키를 다운 받아줍니다. 다운 받은 비공개 키는 resources로 옮겨줍니다!동상이농의 서버는 MSA 구조로 되어있는데, 멤버 모듈에서 FCM 알림을 처리할 예정이므로, 멤버 모듈의 resources에 넣어주었습니다. 2. 스프링 프로젝트에 firebase 의존성 추가build.gradle에 해당 의존성을 추가해줍니다dependencies { implementation 'com.google.firebase:firebase-admin:9...
[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..