Spring 6

AOP를 통한 유저 인증 정보 미리 주입하기

개요카카오 소셜 로그인을 구현하고 토큰을 발급하여, 인증 정보를 토큰으로 관리하는 프로세스를 구현했다.Authentication 객체를 통해 인증된 유저 정보를 활용할 수도 있었다.하지만 해당 방법은 사용할 수 있는 유저 정보가 제한적이고, 중복되는 코드가 많아지는 단점이 존재한다.그래서 AOP와 Authentication 객체를 활용해서 메서드 호출 전에 유저 정보를 주입해보자. 구현CurrentUserInfo 유저 정보 주입을 통해 생성되는 객체이며, 실질적으로 비즈니스 로직에서 사용되는 객체다.현재 필요한 정보인 유저 ID만 존재한다. AssignCurrentUserInfo 해당 어노테이션이 달린 메서드만 호출 전에 유저 정보 주입이 실행된다. AssignCurrentUserInfoAspect 로직..

프로젝트 2024.07.23

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

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

Spring 2024.06.21

[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