java 55

[Spring Boot] RestClient 와 HTTPInterface 로 통신하기

코드는 Github 에 있습니다.RestClient Spring Boot 3.2.x Release 된 서비스입니다.RestClient 는 외부 서비스와 통신을 제공해주며, 기존의 WebClient 의 WebFlux에 대한 의존성에 대한 아쉬운점을 보안하여 나온 서비스 입니다.지금까지 제가 아는 Spring 에서 제공해주는 HTTP 호출 도구는 아래의 흐름을 가집니다.RestTemplate (2009. Spring 3.0 - Deprecated)WebClient (2017. spring 5.0에 도입)RestClient (2024.10. spring 6.1, spring boot 3.2)Spring 을 제외하고, HTTP 통신 라이브러리들은 아래와 같습니다.Apache HttpClient (2009)Net..

Spring/Spring Boot 2025.03.07

동시성 제어 문제에 대한 고찰 (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

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

개발자의 다이어그램 익숙해지기

3주만에 쓰는 글입니다 ㅎㅎ요즘 글쓰는게 조금씩 부담감이 커져, 점점 안쓰게되는데.. 다시 가벼운 마음으로 가볍게 가볍게 포스팅을 이어나가볼까 합니당  최근 스터디로 [육각형 개발자 - 최범균] 책을 읽고있는데, 코드 이해를 위한 도구 중 하나로 "다이어그램"이 나와 이에 대해 스터디 팀원들과 이야기를 해보았습니다.책의 요지는 다음과 같았습니다.서비스는 사회 환경의 변화에 맞춰 함께 변화되어야한다.그러기위해서는 코드비용(코드를 변경하는데 드는 인건비)이 적어야한다.개발자가 코드를 변경할때는 [(1)코드 이해], [(2) 코드 수정] 이 2가지 단계를 거친다.이 중 "코드를 이해하는 시간"을 줄이기 위해서는 2가지 역량이 요구된다.코드를 제대로 이해할 수 있는 역량이해하기 쉬운 코드를 작성하는 역량이 중 ..

[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..

[Spring] 테스트 환경 격리 시키기 - 각 테스트마다 DB 분리하기 (@Transactional 을 사용하면 안되는 이유)

🔥현재 NEXT STEP 에서 진행하는 ATDD 강의를 수강하고 있습니다. 강의에서 예전부터 고민하던 통합테스트 환경에서 데이터베이스를 격리하는 방법에 대해 알게되어 기록을 남겨보고자 합니다. [예전에 시도해봤던 방법] 통합테스트 환경에서 시도한건 아니지만 단위테스트에서 JPA 에 의존하는 Repository 를 온전히 격리해 어떤상황에서든 성공하는 단위테스 환경을 구축하고자 했던적이 있습니다. 👉 service 단위 테스트 하기 - DB 와 독립된 테스트 환경 구축 (service unit test) 하지만 1. 단위테스트 환경에서는 사실상 Mocking 을 하는것보다 큰 장점이 없었고 2. 필요로하는 Repsitory 기능을 매번 정의해주어야해서 많이 번거로웠습니다. 👏🏻 그치만 통합테스트 환경에서는..