전체 글

1. 테스트 1 : 동시에 여러 신청을 승인해도 정원을 초과하지 않는다첫 번째 테스트는 가장 중요한 테스트다.@Testvoid 동시에_여러_신청을_승인해도_정원을_초과하지_않는다() throws Exception { // given String moimCode = code("MOIM", 1); String leaderMemberCode = code("LEADER", 1); int maxParticipants = 5; int leaderCount = 1; int expectedApplicantApprovals = maxParticipants - leaderCount; int requestCount = 30; saveMoimWithLeader(moimCode, le..
1. 테스트 목표동시에 여러 신청을 승인해도 정원을 초과하지 않는다.- Moim row lock test같은 신청을 동시에 두 번 승인해도 중복 승인되지 않는다.- MoimMemberMapping row lock test* Moim row lock test - 정원 초과 방지 검증정원 5명PENDING 신청자 30명동시에 approve 요청최종 APPROVED count는 5명을 넘으면 안 됨 * MoimMemberMapping row lock test - 같은 신청 건 중복 처리 방지 검증같은 신청 건에 대해 approve 요청 2개를 동시에 실행성공은 1번만 되어야 함나머지 1번은 이미 처리된 신청 예외가 발생해야 함 1-1. H2가 아닌 PostgreSQL Testcontainers를 사용한 이유..
0. 구현 목표동시에 여러 신청을 승인해도 모임 정원을 초과하지 않게 한다.같은 신청 건이 동시에 승인/거절 처리되어 상태가 꼬이지 않게 한다.이를 위해 두 종류의 row lock을 사용했다.Moim row lock→ 같은 모임의 정원 초과를 막기 위한 락MoimMemberMapping row lock→ 같은 신청 건의 중복 처리나 승인/거절 충돌을 막기 위한 락여기서 사용한 락 방식은 JPA의 PESSIMISTIC_WRITE 다.한 트랜잭션이 모임 데이터를 수정하는 동안 같은 데이터를 다른 트랜잭션이 동시에 수정하지 못하게 막는 방식이다. 현재 도메인 구조 다시 보기* Moim Entity@Entity@Table(name = "tbl_moim_master")public class Moim { @I..
1. apply()는 실제 참여자를 늘리는 메서드가 아니다validateCapacity(moim);validateCapacity()는 현재 APPROVED 상태의 참여자 수를 세고, 그 수가 모임의 최대 정원보다 크거나 같으면 예외를 던진다.현재 모임 엔티티에는 최대 참여 인원을 의미하는 maxParticipants 필드가 있고, 신청 서비스에서는 이 값을 기준으로 정원 초과 여부를 판단한다.다만 apply()에서는 신청 당시의 정원을 확인하고 정원이 차지 않았으면 신청을 할 수 있을 뿐, 실제 참여자를 늘리는 메서드가 아니다. 2. 팝파라치 모임 서비스는 승인제다* 팝파라치 모임 신청 흐름사용자 신청→ PENDING 상태의 신청 내역 생성→ 모임장이 승인→ APPROVED 상태로 변경→ 실제 참여자..
./gradlew :popparazzi-domain:test --tests "com.spoons.popparazzi.moim.service.MoimApplyServiceConcurrencyTest" --no-daemonDocker를 설치한 뒤, 테스트 실행 과정에서 몇 가지 오류가 연쇄적으로 발생했다. 이번 글에서는 해당 오류를 어떻게 확인하고 해결했는지 정리해보려고 한다. 1. IllegalStateException at DockerClientProviderStrategy 오류IllegalStateException at DockerClientProviderStrategyDocker Desktop을 설치했고, 터미널에서 docker ps 명령어도 정상적으로 동작했다.그런데 Testcontainers는 ..
1. Docker 설치 여부 확인docker info터미널에서 위와 같이 입력한다.docker info zsh: command not found: docker위와 같은 메세지가 나온다면 Docker가 설치되지 않은 상태다. 2. Docker 설치해당 포스팅은 Homebrew가 깔려 있음을 전제한다. * Homebrew 설치 참고https://asoong.tistory.com/337 [Mac] Homebrew설치 및 Redis 설치하기0. 시작 전 확인Redis를 설치하기 전에 Homebrew가 필요하다. Homebrew는 Mac에서 패키지를 설치할 수 있는 패키지 매니저다.아래 명령어로 설치 여부를 먼저 확인한다.brew --versionzsh: command not found: brewasoong.t..
* 2026.05.13 수정 완0. 들어가며인덱스 적용으로 평균 응답시간은 4,946ms → 3,988ms로 개선되었지만, 여전히 매 요청마다 DB 조회가 발생하는 구조였다.특히 인덱스 적용 후에도 Max 응답시간은 8,587ms로 높게 나타났다.이번 포스팅에서는 Redis 캐싱을 적용하고, 아래 3단계 성능 비교를 정리한다.신규 복합 인덱스 미적용 + Redis OFF신규 복합 인덱스 적용 + Redis OFF신규 복합 인덱스 적용 + Redis ON 1. Redis 설정1-1. build.gradle// Redisimplementation 'org.springframework.boot:spring-boot-starter-data-redis'implementation 'org.springframewo..
* 2026.05.13 수정 완0. 들어가며Before 테스트에서 신규 복합 인덱스 없이 500,000건 데이터를 대상으로 HOT 모임 조회 API를 테스트한 결과, 평균 응답시간은 4,946ms로 측정되었다.이번 포스팅에서는 복합 인덱스를 설계하고 적용한 뒤, Before와 After 결과를 비교해본다.테스트 조건은 동일하게 유지했다.가상 사용자 수: 100명Ramp-up Period: 60초Loop Count: 30총 요청 수: 3,000건Redis 캐시: OFFHikariCP maximum-pool-size: 5 1. 적용한 인덱스CREATE INDEX IF NOT EXISTS idx_like_mapping_type_regdt_targetON public.tbl_like_mapping (lm_typ..
아숭
슬기로운 개발생활