Spring 6

STOMP로 소켓 방식 채팅 구현 + Rate Limiter, Token Bucket으로 API 처리율 제한하기

소켓 프로그래밍으로 채팅 애플리케이션을 구현해보자.그리고 Rate Limiter와 Token Bucket 방식의 API 처리율 제한기를 적용해보자. ⚡️ 채팅 애플리케이션 일단 STOMP는 텍스트 기반의 메시징 프로토콜로, 주로 메시지 브로커와 클라이언트 간의 통신을 위해 사용된다.메시지의 송수신을 담당하며, 클라이언트가 구독한 주제에 대해 응답을 받을 수 있도록 해준다.웹 애플리케이션에서 채팅, 실시간 업데이트, 알림 등을 구현할 때 많이 사용된다.  해당 그림을 살펴보면 발행-구독 매커니즘으로 특정 주제에 메시지를 보내면, 해당 주제를 구독하고 있는 subscriber 모두에게 메시지가 전달되는 구조다.  💫 애플리케이션 구조 해당 채팅 애플리케이션은 크게 두 가지의 Controller가 존재한다...

Spring 2024.06.21

Redis Sorted Sets으로 인기 검색어 구현하기

# Event프로젝트의 요구사항 중 검색칸을 눌렀을 때, 인기 검색어 보여줘야 했다. 처음에는 ElasticSearch를 이용해서 구현하고 싶었지만 알아야 할 내용이 너무 많았다.그래서 일단 MVP 구현을 위해 차선책으로 Redis의 Sorted Sets을 사용했다. 왜 차선책인가 ?DB보다는 Redis가 더 좋을 것이라는 것은 자명하다.만약 검색어를 DB에서 쿼리로 가져온다면 하드디스크 기반의 저장 공간에 접근해야 한다.하지만 Redis는 In-Memory DB이기 때문에 더 빠를 수밖에 없다. 또한 Sorted Sets을 통해 요청 검색어의 점수를 1씩 증가시킨다.조회할 때는 점수 Top-10을 반환한다. # Implementation@Configuration@RequiredArgsConstructo..

Spring 2024.04.09

[Spring] could not initialize proxy [...] - no Session 오류

#1. Event @DisplayName("사용자가 리뷰 좋아요를 누른다.") @Test void likeReview() { //given User user = userRepository.save(createUser("1")); Book book = bookRepository.save(createBook()); Review review = reviewRepository.save(createReview(user, book)); //when reviewLikeService.createReviewLike(user.getId(), review.getId()); //then List reviewLike = reviewLikeRepository.findAll(); assertThat(reviewLike).hasSi..

Spring 2024.04.02

QueryDSL 동적 정렬 쿼리 OrderSpecifier 구현하기

#1. Event#2. Feature@Repositorypublic interface ReviewRepository extends JpaRepository, ReviewRepositoryCustom { // 내용 생략 ...}@RequiredArgsConstructorpublic class ReviewRepositoryImpl implements ReviewRepositoryCustom { private final JPAQueryFactory queryFactory; // 내용 생략 ... } 상세한 구현을 위해 Custom, Impl 클래스를 생성했고 필요한 상속 관계를 추가했다.Impl은 QueryDSL로 구현하기 때문에 JPAQueryFactory가 필요하다. public e..

Spring 2024.03.28

Spring Security 없이 소셜 로그인 구현하기

들어가기 전 ✔ 기록을 통한 리마인드를 위해 남기는 글입니다. 기존 프로젝트에 구현하는 것이기 때문에 모든 코드보다는 추가되는 코드 위주로 다루겠습니다. 🤔 Spring Security 없이 소셜 로그인을 구현하는 이유 처음에는 시큐리티에 내장된 OAuth 2.0을 통해 구현하려고 했습니다. 하지만 구현을 하다 보니 커스터마이징에 한계가 존재했고, 스프링 시큐리티에 대한 의존성이 높았습니다. 그래서 직접 소셜 서버와 통신해서 코드와 토큰을 발급받는 로직을 구현하는 것으로 결정했습니다. 🐘 build.gradle // (1) implementation 'org.springframework.boot:spring-boot-starter-webflux' // (2) annotationProcessor "org...

Spring 2024.03.17