SpringBoot/트러블 슈팅6 [Spring] JPA와 Redis 충돌 및 @RedisHash 간과한 부분 이전 게시글에서 SpringBoot에 Redis를 적용하는 방법(링크)에 대해서 정리한 적이 있었다. 이슈 링크에서 내가 해보려는 것은 기존에 적용했던 redisTemplate를 이용하는 방법이 아니라 아직 해보지 않은 @RedisHash를 이용해 별도의 클래스를 설정하고 레디스 캐시가 필요한 곳에 대해서 @Cacheable 어노테이션을 적용하는 것이다. 전자의 경우를 진행하면서 겪은 상황을 기록하고자 한다. 기존에 이 프로젝트에서는 MySQL로 로그인 시 발급받은 RefreshToken을 저장하고 있었으며 기존 코드는 아래와 같다. package com.sejong.sejongpeer.domain.auth.entity;import com.sejong.sejongpeer.domain.member.en.. 2024. 8. 13. [Spring] JPA LazyInitializationException 발생 원인 및 해결 방법 생전 처음 보는 LazyInitializationException 에러를 마주했다. 문제 상황이 에러가 발생한 상황은 아래와 같다.채팅 기능을 구현하기에 앞서 채팅 방을 생성하는 API를 작성했었다.(토큰 발급 이후에 SecurityFIlterChain에서 JwtAuthenticationFilter를 addFilterBefore에 추가해주었어야 했는데 이 작업을 하지 않고 채팅방 생성 API를 요청해서 엑세스 토큰을 헤더에 넣었음에도 403에러가 떴었다. SecurityFilterChain 요소에 대해서는 입사 전에 한번 게시글로 정리하려고 한다. 다짐!) 아래 서비스 레이어에서 isDuplicate 값을 얻기 위해 stream을 돌리기 전 loginMember에서 getParticipants()를 하.. 2024. 8. 7. [Spring] @RequestBody json DTO null 트러블 슈팅 절대 잊지 못할 또 하나의 깨달음을 오늘 얻게 되었다...(해당 pr 링크) 문제 상황postman에서 x-www-encoded contentType으로 POST method 요청 시 request DTO 양식에 맞춰주면 200 OK가 뜨면서 DB에 저장이 잘 되지만 application/json으로 요청 시 controller에서 LoggerFactory를 통해 logger.debug를 찍어보면 request 내역이 null이며 실제 @ExceptionHandler를 통해 전역 예외 처리를 통한 BAD REQUEST 오류 내역을 확인해보았을 때도 request DTO에서 @NotNull을 선언한 필드들이 다 null로 인식되면서 null일 수 없다는 에러 메세지가 떴다. 삽질 기록내 상황에서 아래와 같.. 2024. 5. 22. [Spring] @EnableJpaAuditing과 createdAt의 연결고리 진행 중인 프로젝트에서 특정 엔티티에 post api 요청을 통해 request dto의 내용이 튜플로 추가되어야하는 시간이 DB에 함께 저장되어야 하는 기능을 구현해야 했다. (updated_at도 기본적으로 있으면 좋으나 이 프로젝트에서는 created_at만 필요했다)이 과정에서 헤맨 부분과 어떻게 해결했는지에 대해 남기려고 한다. 코드는 이 PR 링크에서 확인할 수 있다. 문제 상황 : 'createdAt' cannot be null분명히! 아래와 같이 created_at에 대해 column을 정의하고 package com.whoa.whoaserver.global.common;import jakarta.persistence.Column;import jakarta.persistence.EntityL.. 2024. 5. 8. [Spring] kotlin + security + jwt 구현 과정 트러블 슈팅 백엔드 실제 개발을 처음 시작한 2024년 1월 경 spring security부터 맡게 되어서 허덕인 부분이 많았는데 그 당시 깊이있게 보지 못했던 원리에 대해서 공부(정리한 이슈 링크)하고 security 부분을 보완하고자 나의 첫 번째 개발 언어였던 애틋한ㅋㅋ kotlin으로 다시 구현해보려고 하였다. 소스 코드와 구현 과정 중 어떤 부분에서 오류가 났고 어떻게 코드를 설계했는지에 대해 배운 점을 기록하고자 한다. Security가 작동하고 있다면 SecurityConfig의 permitAll을 통해 401을 예방하자윗 문장은 내가 kotlin으로 구현한 spring security 적용 회원가입, 로그인 + jwt 과정에서 얻은 배운 점이다. 아래에서 깃헙 이슈 링크에서 적었던 절차에서 확인할 .. 2024. 4. 28. [Spring] 선착순 티켓 예매 동시성과 잠금 여부 고민 티켓 예매 상황에서 고려해야 할 사항은 크게 두 가지가 있다. - 요청 순서에 따라 티켓을 발급할 수 있는가- 준비된 수량만큼 발급할 수 있는가 엔티티에 락을 걸지 않고 동시성 문제를 해결할 수 있는 방법으로는 무엇이 있을지 실습을 통해 고민해보았다.싱글 스레드 모델을 적용하거나 메세지큐를 사용하지 않고 불변성을 이용하여 순서를 먼저 확정함으로써 특정 순서 이전의 티켓을 발급할 수 있도록 로직으로 설계한다면 잠금 없이 기존 환경 그대로 선착순 티켓 예매가 가능할 것이라는 생각이 들었다. 마치 은행에 가면 대기 번호표를 뽑듯이 티켓 발급 요청이 들어왔을 때 티켓을 순서대로 발급하고 정해진 수량만큼만 발행을 한다면 불변성을 이용해서 잠금 없이 동시성 처리가 가능하다. 아래는 소스 코드를 어떻게 설계했는지에.. 2024. 4. 16. 이전 1 다음