Spring 98

Spring Boot WebClient Mocking 하기

상당히 오랜만에 글을 쓰네영반성하고 열심히 재밌게 다시 써보겠습니다 야호코드는 깃허브에 있습니다. 새로운 회사로 이직한지 1달이 되었습니다.여느 회사나 마찬가지로 제가 모르는 코드를 수정해야하기 때문에 테스트 코드는 저에게 필수적인데요.오늘은 Spring Boot WebFlux 와 함께 나온 WebClient 를 Mocking 하는 방법에 대해 기록해보고자 합니다. [목차]WebClient 를 Mocking 하려는 이유WebClient Mocking 방법1. WebClient를 Mocking 하려는 이유사실 WebClient 자체를 Mocking 하는 상황이 좋은 상황은 아니라고 생각합니다.코드단에서 더 좋은 방향은 WebClient 를 사용하는 부분을 추상화하고 호출부에서 추상화하는(or 책임을 가지는..

[Spring Boot] 다중 인스턴스에서 스케줄링 중복 실행 제어 하기 (@Scheduled Lock - shed lock)

다중 인스턴스 환경에서 스케줄링 중복 실행을 제어하는 @ShedLock 에 대해 정리하는 글입니다.코드는 깃허브에 있습니다. Spring 에서는 정해진 시간마다 지정한 메소드가 실행되도록 스케줄링 기능을 지원하는 @Scheduled 어노테이션이 존재합니다.이 스케줄링 기능을 Spring 에서 구현하였을 때, 단일 인스턴스 (1개 서버) 배포환경에서는 신경써줘야할게 없지만 다중 인스턴스 (n 개의 서버, scale-out) 배포 환경일 경우n 개의 인스턴스 환경에 배포되어있는 n 개의 프로그램이 특정 시간에 n 번의 스케줄링을 체크하여n 번의 기능을 수행합니다.즉, 중복이 일어날 수 있습니다.이러한 문제점을 해결하기 위해서는 아래와 같은 처리를 해주어야합니다.1번만 작업을 해도 된다.혹은 특정 스레드에서 ..

Spring/Spring Boot 2024.10.10

동시성 제어 문제에 대한 고찰 (With. Spring, JAVA, MySQL, Redis, Kafka)

Spring 3.0, JAVA 17, MySQL 환경에서 문제를 풀어갑니다.코드는 ⚙️깃허브에 있습니다.동시 다발적인 호출에도 정확한 차감이 이뤄지도록 구현이 되어야 합니다.얼마전 받았던 기업과제의 요구사항 이었습니다.요점은 동시성 문제의 백엔드 관점에서의 해결인데, 동시성 문제를 직접 다뤄본 경험은 처음이라 공부를 조금 더 해보고자 합니다.이전에 정리했던 [🚀 재고시스템으로 알아보는 동시성이슈 해결방법] 과 겹치는 내용이 존재합니다. ✨ 이번 포스팅에서 공부해 볼 주제들 입니다.동시성 문제란 무엇인가동시성 문제를 해결하기 위해서는 무엇이 필요한가동시성 문제의 해결 방법들Thread Access LocksynchronizedRedis + kafkaDB Lock비관적 락낙관적 락네임드 락분산락 (Redi..

Spring/Spring Boot 2024.08.30

Repository는 어느 모듈에 위치해야할까? (DIP. 고수준모듈, 저수준 모듈)

레이어드 아키텍쳐를 사용하는 단일 모듈 서비스를 멀티모듈로 나누는 과정에서,,, 시작된  Repository 는 과연 어디 모듈에 위치해야하는 가에 대한 주저리주저리 고민 정리 글입니다.코드 예시는 깃허브에 있습니다. 우선 다른 레퍼런스들을 보며, 현재 상황에 맞게 구성해본 구조는 아래와 같습니다,,이런 설계에서 Repository 는 core:domain 모듈에 들어가야하는가 core:Infra 에 들어가야하는가에 대한 매우 심도깊은 고민을 하고있습니다..ㅎ  [궁금한 것]고수준 모듈은 뭐고 저수준모듈은 무엇인가.왜 고수준 모듈이 저수준 모듈의 의존성을 가지면 안되는가그래서 Repository 는 어떤 모듈에 위치해야하는가 ~~ 에 대해 정리해봅니다! 1. 고수준 모듈과 저수준 모듈의 정의는 무엇일까?..

Spring/Spring Boot 2024.07.09

Spring Boot 에서 Redis Cache 사용하기

이번 포스팅에서는 이전 포스팅에서 못 다한 Spring Redis Cache 를 사용해보고자 합니다.코드는 Github 에 있습니다.💡Redis 묶음Redis 란 (특징, 주의점, 동작 구조)Spring 에서 Redis 사용하기 (설정, In-memory DB, Transaction)✔️ Spring Boot 에서 Redis Cache 사용하기  [목차]Cache ManagerRedis Cacheconfig@Cachable@CachEvictCache hits 모니터링 종류Spring Cache AbstractionSpring 에서는 캐시 기능 자체에 대해서 특정 기술에 종속되지 않게 추상화를 제공합니다.AOP 를 이용한 어노테이션을 활용하여 특정 기술에 종속되지 않고, 애플리케이션에 캐싱 기능을 부여할..

Spring/Spring Boot 2024.07.02

Spring 에서 Redis 사용하기 (설정, In-memory DB, Transaction)

본 포스팅은 다음과 같은 환경 아래에서 진행합니다. JDK 17, Spring Boot 3.x, Gradle 💡Redis 묶음Redis 란 (특징, 주의점, 동작 구조)✔️ Spring 에서 Redis 사용하기 (설정, In-memory DB, Transaction)Spring Boot 에서 Redis Cache 사용하기 이번 포스팅에서는 Spring 에서 제공하는 Spring Data Redis 를 사용하여 Redis 를 이용하는 방법에 대해 기록하고자 합니다.대부분의 내용이 Spring Data Redis 공식문서 내용 정리입니다. [목차]의존성추가Redis 연결Redis ConnectionRedisTemplateRedisTemplateStringRedisTemplateRedis Repository..

Spring/Spring Boot 2024.07.01

@Transactional 동작과정 살펴보기 (with. Spring AOP)

이번 포스팅에서는 Spring 에서 제공해주는 @Transactional 어노테이션의 동작과정에 대한 공부한 것을 기록합니다. @Transactional 은 Spring 에서 제공해주는 어노테이션입니다.@Transactional이 제공하는 기능은  해당 어노테이션이 붙은 시점의 작업단위를 하나의 트랜잭션 단위로 묶어 관리할 수 있도록 합니다.어노테이션은 단지 주석일 뿐이고, 실제로 런타임 시에 어떠한 일이 일어나 해당 어노테이션이 우리가 원하는 기능을 제공해주는지 일련의 과정을 살펴보고자 합니다. Spring 에서 어노테이션을 처리하는 방법이 몆가지 있다고 하는데, 이번 포스팅에서는 @Transactional 이 목표이기 때문에 해당 내용은 넘어가겠습니다.@Transactional 은 AOP 기반으로 처..

Spring/Spring Boot 2024.06.16

Spring Rest Docs Enum class 문서화 하기

개발환경 : Java 17, Spring 3 현재 사이드 프로젝트에서 Rest Docs + Swagger UI 를 사용 중 입니다. (참고 → restdocs + swagger ui 같이사용하기) 보통 상태나 선택 특정 목록같은 딱딱 선택지가 정해져있는 상태값은 Enum 으로 관리하는 걸 선호하는 편인데, 이게 RestDocs 를 사용하지만, Open API 를 사용하여 바로 Swagger UI 에 적용되는 json 파일을 자동적으로 만들어주다보니, Enum 클래스에 대한 문서 지원이 되지않아 (찾지못해) 신경이 좀 쓰였습니다. 그래서 이번 글에서는 Rest Docs 와 Open API를 이용한 Swagger UI 적용환경에서 ENUM 클래스를 어느정도 문서화하기 편한 상태로 만든 방법에 대해 공유하고자..

Spring/Spring Boot 2024.03.19

[Spring] FCM 푸시 알림 연동하기 (AOS, IOS)

오늘은 현재 진행중인 '채팅 서비스' 사이드 프로젝트에 적용할 목적으로 💡 Spring 기반의 Server 에서 푸시알림을 전송하는 방법에 대해 공부해보고자 합니다. 우리가 흔히 아는 어플리케이션 Push 기능을 쉽게 구현하기 위해서 시중에 나와있는 서드파티 솔루션들을 이용할 수 있는데 가볍게 찾아보았을때 가장 많이 나오는 솔루션을 2가지로 추릴 수 있었습니다. Amozon SNS (Simple Notification Service) FCM (Firebase Cloud Messaging) 위의 2가지 솔루션 모두 믿음직스러운(?) 대기업에서 제공하는 기술이지만 FCM 이 조금 더 적용하기 쉬워보였고 (공식문서가 잘나와있음) 또, '무.료.' 라는 점 (아마존은 알림 1백만 개당 0.50 USD) 안드로이..

Spring/Spring Boot 2024.01.07

[Spring] Embedded MongoDB! 통합테스트를 위한 인메모리 몽고디비 설정하기

현재 mongodb와 mysql 을 함께 사용하고있는 프로젝트에서 통합테스트를 위해 mongodb 도 h2 같은 in-memory db로 사용할 수 있는게 없을까 찾아보다가 알게된 방법에 대해 정리하는 글 입니다. 공식적으로 Spring Document 에 언급된 in memory 방식의 nosql db 를 사용할 수 있는 방버을 찾지못해 오픈소스 라이브러리를 사용하였습니다. 참고해주세요! ✔️ Spring Boot 환경에서 Embedded MongoDB 를 사용하는 3가지 방법 1) de.flapdoodle.embed.mongo.spring embeded mongodb 라고 검색하면 가장 많이 나오는 오픈소스 라이브러인 것 같습니다. 나온지 10년 가까이된 것 같고, 지금까지도 활발하게 contribu..