목록Project/UniP (7)
빙응의 공부 블로그

📝배경파티 프로젝트 UniP 진행 중에 파티에 대한 인원 수를 갱신하는 과정에서 동시성 문제가 발생했습니다. 📌문제 설명여러 사용자가 동시에 파티에 가입을 하여 파티 인원을 갱신 과정에서 트랜잭션 교착 상태(DeadLock)가 발생했습니다.교착 상태가 발생하여 한 명의 사용자를 제외한 나머지 사용자가 파티에 가입이 안된 것을 발견했습니다.Failed to join party: could not execute statement [Deadlock found when trying to get lock; try restarting transaction] 그래서 다시 간단하게 테스트를 진행했습니다. @Test void testConcurrencyOnJoinParty() throws In..

MySQL에 대해 심층적으로 공부하였으니 한번 적용해봅시다. 📝배경 졸업 작품 프로젝트 개발을 한 후 Real MySQL 8.0을 읽게 되었습니다. 배운 것을 적용해보겠습니다.! [UniP]무한 페이징 기능 구현 및 성능 개선하기 [UniP]무한 페이징 기능 구현 및 성능 개선하기이 글은 무한 페이징에 대해 다루겠습니다.📝배경 이번 졸업 작품 프로젝트에서 메인서버를 맡아 개발하게 되었습니다.그 중 핵심 기능은 파티를 무한 페이지으로 가져오는 요구사항이 있어quddnd.tistory.com저는 이 포스팅에서 무한 페이징 구현을 위해서 인덱스를 만들었습니다. @Table( indexes = { @Index(name = "idx_party_category_status", columnLi..

이 글은 무한 페이징에 대해 다루겠습니다.📝배경 이번 졸업 작품 프로젝트에서 메인서버를 맡아 개발하게 되었습니다.그 중 핵심 기능은 파티를 무한 페이지으로 가져오는 요구사항이 있어 작성하게 되었습니다. 무한 페이징은 정확히 SQL의 페이징 기능을 이용해서 구현하고 무한 스크롤 페이징은 프론트엔드 단에서 구연합니다. 그렇기에 백엔드인 저는 페이징 기능만 구하면 되지만 여러가지 생각을 해보아야만 합니다.인덱스를 이용한 쿼리 튜닝 OFFSET 구조에 대한 생각 📝 인덱스를 이용한 쿼리 튜닝페이징을 구연하기 전에 페이징 처리에 필요한 테이블에 대한 인덱스를 먼저 구현해주어야 합니다.그 이유는 쿼리 성능 최적화와 효율적인 데이터 조회를 위해서입니다. 페이징에서 인덱스를 사용해야하는 자세한 이유는 다음과 같..

이 글은 비동기 처리에 대해 다루겠습니다.📝배경이번에 졸업 작품 프로젝트에서 메인서버를 맡아 개발하게 되었습니다. 그래서 메일 인증을 위해 Redis와 메일을 보내는 로직을 만들었습니다. 그런데 유독 혼자만 API 응답 속도가 느린 것을 확인했습니다. 해당 로직은 이메일 기반으로 인증 코드를 보내는 로직입니다. 오직 이메일을 보내는 것만으로 무려 3.51초가 나온 것을 알 수 있었습니다. 해당 로직이 3.51초가 걸린 것인데... 어느 부분이 문제인지 한번 전부 시간 체크를 해보겠습니다. /* 이메일 작성 및 인증 코드 저장 */ public void sendVerificationEmail(String email) { if(emailBlackListRepository.exi..

이번 게시글은 조회 최적화와 QueryDSL을 다루겠습니다. 📝배경이번에 졸업 작품 프로젝트에서 메인서버를 맡아 개발하게 되었습니다. 파티를 만들어서 그안에 코스를 보고 대학생들이 자연스럽게 약속하는 앱을 만드는 과정인데 해당 과정에서 중요하게 본 점은 조회 쿼리에 대한 효율입니다. 그래서 김영한의 스프링에서 학습한 내용을 기반으로 QueryDSL을 사용하여 조회 최적화를 시도해 보았습니다 . QueryDSL을 사용하여 조건에 따른 동적 쿼리를 유연하게 처리할 수 있었습니다.해당 슬라이드에서 설명하는 것처럼 파티는 식사, 음주, 종합으로 나누어 조회합니다. 이 과정을 쉽게 하기 위해 동적 쿼리 추가가 쉬운 QueryDSL을 사용했습니다. QueryDSL에 대해 자세히 알고 싶으면 전에 공부했던 포스팅..

이번 게시글은 Redis와 RefreshToken에 대해 다루겠습니다. 📝배경이번에 졸업 작품 프로젝트에서 메인서버를 맡아 개발하게 되었습니다. 그래서 로그인을 개발하게 되어 두개의 토큰 방식(Access, Refresh)를 구현하였고 Refresh는 따로 데이터베이스에 저장하여 관리하게 되었다. 여기서 데이터베이스에 Refresh Token을 관리하는 이유를 간략히 적어보자면... 보안성 강화 : 데이터베이스를 화이트 리스트로 사용하여 변조, 탈취된 Refresh Token에 대한 대응성 확보가 가능합니다. 추적 및 접근 제어 : 로그아웃하거나 비정상적인 상황이 발생했을 때 데이터베이스 Refresh Token을 제거하여 추적이 가능합니다.📝 왜 Redis인가? Redis를 사용하는 이유는 주로..