[Java Spring] 초대 링크 가입 로직 트러블슈팅 (3) - Redis 트랜잭션 활성화 시, 값을 조회했을 때 null이 조회되는 이슈
·
Java
배경 [Java Spring] 초대 링크를 통한 가입 로직 트러블슈팅 (2) : 예외 발생 시 데이터 롤백을 위해 Redis 트배경제가 진행했던 프로젝트에서는 초대 링크를 통해 관리하는 펫 그룹에 다른 유저를 가입시킬 수 있는 기능이 있으며, 해당 기능은 다음과 같은 요구 사항을 가지고 있습니다.초대 링크는 uuidseondays.tistory.com(위 포스팅에서 이어집니다) 제가 진행했던 프로젝트에서는 초대 링크를 통해 관리하는 펫 그룹에 다른 유저를 가입시킬 수 있는 기능이 있으며, 해당 기능은 다음과 같은 요구 사항을 가지고 있습니다.초대 링크는 uuid 값을 이용하여 생성되고 해당 uuid 값은 Redis에 저장된다.초대 링크 값을 통해 가입 요청이 들어오면, MySQL에 저장된 유저, 펫 정보..
[Java Spring] 초대 링크를 통한 가입 로직 트러블슈팅 (1) : Redis 동시성 문제 해결
·
Java
배경제가 진행했던 프로젝트에서는 초대 링크를 통해 관리하는 펫 그룹에 다른 유저를 가입시킬 수 있는 기능이 있으며, 해당 기능은 다음과 같은 요구 사항을 가지고 있습니다.초대 링크는 uuid 값을 이용하여 생성되고 해당 uuid 값은 Redis에 저장된다.초대 링크 값을 통해 가입 요청이 들어오면, Redis에 링크 uuid 값이 있는지 확인하고 가입을 진행한다.초대 링크는 1회용이다. 즉 생성된 초대 링크를 누군가 사용 완료한다면 다른 사람이 사용할 수 없게 Redis에서 해당 uuid 값이 삭제되어야 한다.조건에 따라서 하나의 초대 링크에 여러 유저의 요청이 동시에 들어오더라도, 오직 첫 번째 요청만 정상 처리되고 나머지 유저의 요청은 링크 만료 예외가 터지며 가입이 실패해야 합니다.하지만 동일한 링..
[Spring Data Redis] 불필요한 Redis 메모리 점유 현상 개선하기 : Spring Data Redis에서 TTL 미적용 문제 발생
·
Java
배경프로젝트에서 새롭게 로그인을 하는 경우 리프레시 토큰을 발급하여 Redis에 저장하도록 로직이 구현되어 있고, Redis 사용은 Spring Data Redis의 `Repository` 인터페이스를 통해 저장하고 있습니다.해당 토큰 entity의 TTL은 7일인데요. 따라서 생성된 지 7일 후면 Redis에서 토큰의 정보가 모두 사라져야 합니다. 그런데 어느 날 우연히 Redis의 sets 밑에 refresh set이 남아있는 것을 발견하게 되었는데, refresh set의 내부에는 정황상 리프레시 토큰값으로 보이는 value들이 가득했습니다.방금 확인한 Redis는 배포 이전에 로컬에서 로그인 테스트를 진행하며 사용했던 테스트 DB로, 사용하지 않은지 7일을 넘어 꽤 되었기 때문에 모든 토큰값이 지..
[Spring Data Redis] Redis repository에서 existBy로 올바르게 값이 검색되지 않는 문제 해결
·
Java
배경서버에서 refresh token을 저장하는 DB를 mySql에서 Redis로 변경하면서 기존에 Redis를 사용하고 있는 방식대로 Spring Data Redis Repository를 적용하게 되었습니다. 토큰 재발급 요청이 들어오는 경우 Redis에 해당 refresh token이 존재하는지 검증이 필요하기 때문에, 레포지토리에 다음과 같이 `existsByToken` 메서드를 정의해 두었습니다.@Repositorypublic interface RefreshTokenRepository extends KeyValueRepository { boolean existsByToken(String token);}@RedisHash(value = "refresh", timeToLive = 3600L)pu..
[Java Spring] Swagger에서 multipart/form-data 테스트 시 Content-Type 'application/octet-stream' is not supported 예외 발생
·
Java
배경진행 중인 프로젝트에서 새로운 펫의 정보를 등록하는 경우 펫의 정보와 함께 프로필 이미지를 등록할 수 있도록 하는 요건이 있었습니다.따라서 POST /pet 요청을 하는 경우 JSON 값과 이미지를 함께 담아서 보내야 했고, 이를 위해 Content-Type을 `multipart/form-data`로 지정해서 request 요청을 받도록 구현했습니다. 또 추가적으로 api 문서화를 위해 swagger에서도 해당 엔드포인트를 테스트할 수 있도록 다음과 같이 구성했습니다.문제 상황그런데 이상하게도 postman로 진행할 때는 문제가 없었는데, swagger를 통해 테스트를 진행하면 예외가 발생하면서 펫 등록이 이루어지지 않는 상황이 발생했습니다. 해결을 위해 예외 메시지를 확인해 보니 Content-Ty..
[Spring Security] anyRequest().permitAll() 설정 변경 후, login 요청 시 404 예외 발생 문제
·
Java
배경로그인 기능을 정상적으로 구현하여 적용하게 된 후, 이제 모든 api에 테스트 요청을 보낼 때 먼저 로그인을 통해 액세스 토큰을 추가하여야 하는 환경으로 변경되었습니다. 그런데 api 요청 시마다 계속 토큰을 추가하는 작업은 테스트 단계에서는 다소 번거로울 수 있었기 때문에, 테스트 기간에는 임시적으로 액세스 토큰 없이도 api 호출이 가능하게 변경을 해달라는 팀원들의 요청이 있었는데요. security 설정에서 현재는 제한된 부분들만 permit이고, 나머지 부분은 authenticated 인 상황이라 간단하게 기존 부분을 주석처리 후, anyRequest().permitAll() 를 추가하면 아무 문제 없이 로직이 잘 작동하리라고 예상했습니다.// 기존 설정http.authorizeHttpRequ..