Redis-MySQL 정합성 보장: 고민, 측정, 그리고 선택
·
SPRING
들어가며: 축제 현장의 실시간 대기열, 한 명도 놓칠 수 없다Festin은 대학 축제 부스의 대기열을 실시간으로 관리하는 시스템입니다. 사용자들은 모바일로 대기 등록을 하고, 부스 운영자는 "다음 사람 호출" 버튼으로 순서대로 손님을 받습니다.성능과 이력 관리를 위해 다음과 같은 아키텍처를 선택했습니다.왜 이렇게 설계했을까?대기 등록 시점: Redis만 사용1. 부스 정보 조회 (Redis) 2. Lua Script로 원자적 등록 처리: 중복 체크 + enqueue + 활성 부스 추가를 단일 원자 연산으로 3. 결과 반환 4. MySQL 저장 없음이유:성능: 1,000 TPS 목표 - MySQL 트랜잭션은 병목실시간성: Redis는 메모리 기반, 응답 속도 원자성 보장: Lua ..
[Spring] JPA save(), saveAll(), deleteAll(), deleteAllInBatch(), @Query 비교
·
SPRING
01. 들어가기전프로젝트를 하면서, 엔티티의 갯수가 많아지고, 여러 부분을 저장하거나 삭제하는 로직을 구현하는데!이때 여러 jpa 쿼리메소드가 성능차이가 나는건 알고있었지만, 이유를 정확하게 몰랐다! 까보면서 알아보쟈 !02.save()03.saveAll()둘다 @Transactional 적용되어있음save(): 1건 마다 save()함수 호출saveAll(): 1건 마다 인스턴스 내부의 save()함수 호출→ saveAll()이 성능이 더 좋은데, 이유가 뭐냐?@TransactionalAOP 프록시 기반으로 외부 Bean 객체가 있고, 이 객체의 함수를 호출해 Intercept가 되어 트랜잭션으로 묶이게 됨Bean 객체 내부에서 내부함수 호출 시 @Transcational 적용Xsave() 호출 시,상..
[Spring] gradle로 멀티모듈설계 해보기
·
SPRING
01. 들어가기 전,현재 하고있는 프로젝트는 처음에는 하나의 모듈의 모든 기능을 작성 하고 있었습니다!보시면 domain, global 로 나누고, 도메인 주도 기반으로 해서 구현하고 있는 과정인데용위를 보시면, 도메인 별로 batch, controller, dto, .. 요렇게 나눠져 있었던 구조였습니당..! 서버 인스턴스 하나만으로 시작할 때는 서비스의 복잡도가 상대적으로 낮고 유지보수도 간편한데,, ! 트래픽이 증가하거나 작업 부하가 늘어나게 된다면? 나중을 위해 지금이 멀티모듈로 구조를 바꿔야 하는 적절한 시기라고 생각했습니당 저희는 ASG와 로드밸런싱 구성을도입을 했는데요, 이런식으로 API 서버는 사용자 요청에 실시간으로 대응을 해야하기 때문에 ASG를 통해 트랙픽에 맞춰 하는 것이 바람직하..