- 트랜잭션(Transaction) 분리하기2025-02-11 15:41:21프로젝트 리팩토링을 진행하다가 트랜잭션의 관리가 미흡하다고 생각되서 정리하게 되었다. 보통 트랜잭션 단위는 일반적으로 짧게 가져가는 것이 이상적이다. 그 이유에 대해 살펴보고, 어떻게 구성해야 하는지 고민해 보겠다. @Transactional 남용의 문제점@Transactional 어노테이션은 Spring Boot 를 쓰는 사람들은 다들 너무나도 편리하다는 생각을 할 것이다.매번 트랜잭션의 시작과 종료를 코드로 명시하지 않아도, Spring AOP를 통해 간단하게 어노테이션으로 트랜잭션 범위를 설정한다.공통적인 횡단 관심사를 해결하는 Spring AOP의 대표적인 사례라고 볼 수 있다.더보기횡단 관심사(Aspect-Oriented Programming, AOP)는 프로그래밍에서 자주 등장하는 개념이다. ..
- [트러블 슈팅] 갑자기 사라진 Redis2025-02-03 12:06:04기존에 잘 동작하던 개발 서버에서 Redis와 관련된 API 들이 동작하지 않는 것을 확인하게 되었다.오류를 확인해보니 Redis 오류인 것을 확인하였다.2025-02-03T01:31:34.427Z ERROR 1 --- [Eighteen_BE] [http-nio-8080-exec-22] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed: org.springframework.data.redis.RedisConnectionFailureException: Unabl..
- [트러블 슈팅] FCM 오류 해결(2024.11.29)2025-02-02 21:37:19현재 fcm 연결 후 로컬 환경에서 제대로 동작되는지 확인을 했고, 알림이 제대로 전송되는 것을 확인했다.이제 배포서버에 적용하기 전 개발서버에서 테스트를 해보려 하는데This browser doesn't support the APIs required to use the Firebase SDK 에러가 발생 뭐가 문제인지 모르겠어서 여러 정보들을 찾아보니 FCM이 적용 안되는 브라우저일 경우 해당 오류가 뜰 수 있다는 것을 찾았다. 하지만 그 원인은 사파리 같은 브라우저에 해당되기 때문에 현재 크롬을 쓰고이는 우리에게는 의미가 없었다. 해당 오류에 대한 정보가 없어서 FCM 공식 홈페이지 를 찾아본 결과 다음과 같은 정보를 알게 되었다. localhost 또는 https에서만 지원된다는 것을 알게 되었..
- [트러블 슈팅] 배포 서버 CI 자동화 적용 이후 오류 발생2025-01-22 14:07:50배포 서버 CI 자동화 적용 이후 오류가 발생했다.AWS EC2 에서 docker에 올라온 log를 확인해보니 IncorrectResultSizeDataAccessException 이 발생한 것을 확인위의 오류 내용을 보면 쿼리 결과값이 유니크하지 않아서 발생했고, 2개의 결과를 반환했다고 되어있다.이 오류는 JPA 레포지토리에서 save 메서드를 통해 데이터 저장을 하면서 발생한 예외이다. 저장하고자 하는 데이터가 db에 이미 존재를 하고 Unique 값을 포함한 데이터인데 데이터 중복이 발생하여 예외가 발생했다. IncorrectResultSizeDataAccessException 에러는 데이터 조회 시 발생하는 에러인데 왜 저장할 때 문제냐고 한다면 // 테스터 생성 코드Member memberA ..
- 뱃지 시스템 적용2025-01-15 22:42:58뱃지 종류다양한 업적들이 추가되도 문제되지 않게 확장성을 고려해 만드려고 한다.첫 발자국앱에 최초 가입 시 얻을 수 있는 뱃지이다.완벽한 첫 인상프로필 사진, 개인 정보, 자문자답 모두 입력 시 얻을 수 있는 뱃지이다.첫 인사첫 채팅 메시지를 보내면 얻을 수 있는 뱃지이다.하트 전도사다른 사람의 프로필에 좋아요 50번 이상 누르면 얻을 수 있는 뱃지이다.첫 승리토너먼트에서 첫 승리 시 얻을 수 있는 뱃지이다.새싹(10개) - 유명인(100개)자신의 좋아요 수 10개 달성하면 얻을 수 있는 뱃지이다.요구사항업적을 달성하면 뱃지를 받을 수 있다.- 달성하는 순간 받아진다.업적을 달성하면 보상을 받을 수도 있다.- 보상은 아직 미정마이페이지에서 나의 뱃지의 개수를 볼 수 있고, 클릭 시 최대 9개의 뱃지가 보..
- [트러블 슈팅] 알림 내역 조회 문제2025-01-13 22:43:51문제상황알림 내역은 회원이 읽지 않은 복습 알림을 쌓아두는 기능이다.알림 내역을 확인하려 하니까 404 에러가 발생하는 문제가 생겼다. 아래 코드 부분에서 에러가 발생한 것이다.api를 호출하면서 404에러가 발생할 문제가 무엇인지 확인해보자..// 알림 조회 API 호출const getNotifications = async () => { try { const response = await axiosInstance.get('/v1/api/notification/own/unchecked'); setNotifications(response.data.data); } catch (error) { console.error("알림을 가져오는 중 오류 발생:", err..
- [트러블슈팅] 랜덤 Pagination 너무 쉽게 봤다.2025-01-09 23:44:38처음 페이지로 회원을 나눌 때 회원을 전체 조회 후 Shuffle을 한 뒤에 해당 리스트를 페이징하는 방법을 생각했었다.하지만 페이지네이션 특성 상 api를 호출할 때마다 다음 페이지를 요청해야하는데 이때 기준이 되는 회원 리스트는 DB에 저장되어 있는데 회원 테이블을 기준으로 하게 된다. 그렇기 때문에 기존에 생각했던 방식은 회원 전체 조회 후 랜덤하게 섞은 리스트를 계속 유지시켜야지만 구현이 가능한 것이다.이 방식은 회원이 많아지면 많아질 수록 api를 호출할 때마다 부담이 된다고 판단하여 다른 방안을 찾아봤다.대책 1. 페이지 마다 랜덤하게 섞기public List getUserProfilePage(Pageable pageable){ Slice users = userService.findPag..
- [트러블 슈팅] 회원 상세 조회 문제 발생(2025.01.06)2025-01-07 17:17:04회원 상세 조회 api 호출 시 다음과 같은 에러 발생org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.st.eighteen_be.user.domain.UserInfo.userQuestions: could not initialize proxy - no Session 에러 내용을 살펴보면 org.hibernate.LazyInitializationException은 Hibernate에서 발생하는 이벤트이다.이 오류는 영속성 컨텍스트가 종료되어 버려서, 지연 로딩을 할 수 없어서 발생하는 오류이다. JPA에서 지연로딩을 하려면 항상 영속성 컨텍스트가 있어야 한다. 보통 트랜잭션 밖에서 조..