From 3d8c471178547322273f0450b896e3a884de0bf7 Mon Sep 17 00:00:00 2001 From: Ho Yeon CHAE Date: Mon, 9 Feb 2026 15:32:48 +0900 Subject: [PATCH 1/3] Queue : delete deprecated DB implementation classes --- .../queue/repository/QueueRepository.java | 4 - .../persistence/jpa/TokenJpaRepository.java | 43 --------- .../jpa/entities/TokenJpaEntity.java | 77 ---------------- .../jpa/impl/TokenRepositoryDbImpl.java | 92 ------------------- 4 files changed, 216 deletions(-) delete mode 100644 src/main/java/com/slam/concertreservation/domain/queue/repository/QueueRepository.java delete mode 100644 src/main/java/com/slam/concertreservation/infrastructure/persistence/jpa/TokenJpaRepository.java delete mode 100644 src/main/java/com/slam/concertreservation/infrastructure/persistence/jpa/entities/TokenJpaEntity.java delete mode 100644 src/main/java/com/slam/concertreservation/infrastructure/persistence/jpa/impl/TokenRepositoryDbImpl.java diff --git a/src/main/java/com/slam/concertreservation/domain/queue/repository/QueueRepository.java b/src/main/java/com/slam/concertreservation/domain/queue/repository/QueueRepository.java deleted file mode 100644 index 1b1d979..0000000 --- a/src/main/java/com/slam/concertreservation/domain/queue/repository/QueueRepository.java +++ /dev/null @@ -1,4 +0,0 @@ -package com.slam.concertreservation.domain.queue.repository; - -public interface QueueRepository { -} diff --git a/src/main/java/com/slam/concertreservation/infrastructure/persistence/jpa/TokenJpaRepository.java b/src/main/java/com/slam/concertreservation/infrastructure/persistence/jpa/TokenJpaRepository.java deleted file mode 100644 index 9165bde..0000000 --- a/src/main/java/com/slam/concertreservation/infrastructure/persistence/jpa/TokenJpaRepository.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.slam.concertreservation.infrastructure.persistence.jpa; - -import com.slam.concertreservation.infrastructure.persistence.jpa.entities.TokenJpaEntity; -import java.time.LocalDateTime; -import java.util.List; -import java.util.Optional; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.Query; -import org.springframework.data.repository.query.Param; - -public interface TokenJpaRepository extends JpaRepository { - - @Query("SELECT t FROM TokenJpaEntity t WHERE t.concertScheduleId = :concertScheduleId AND t.id = :tokenId") - Optional findTokenJpaEntityByConcertScheduleIdAndId( - @Param("concertScheduleId") Long concertScheduleId, - @Param("tokenId") Long tokenId); - - List findByConcertScheduleId(Long concertScheduleId); - - @Query("SELECT t FROM TokenJpaEntity t WHERE t.concertScheduleId = :concertScheduleId " - + "AND t.status = :status " - + "ORDER BY t.id" - + " ASC LIMIT :k") - List findTopKByConcertScheduleIdAndStatus(@Param("concertScheduleId") Long concertScheduleId, - @Param("status") String status, @Param("k") int k); - - @Query("SELECT COUNT(t) FROM TokenJpaEntity t WHERE t.concertScheduleId = :concertScheduleId AND t.status = :status") - int countTokensByConcertScheduleIdAndStatus(@Param("concertScheduleId") Long concertScheduleId, - @Param("status") String status); - - @Query("SELECT COUNT(t) FROM TokenJpaEntity t WHERE t.concertScheduleId = :concertScheduleId AND t.id < :tokenId AND t.status = 'WAIT' ORDER BY t.id ASC") - int countRemainingByConcertScheduleIdAndTokenId(@Param("concertScheduleId") Long concertScheduleId, - @Param("tokenId") Long tokenId); - - @Query("SELECT t FROM TokenJpaEntity t WHERE t.expiredAt < :now AND t.status = 'ACTIVE'") - List findActivatedTokensToBeExpired(@Param("now") LocalDateTime now); - - @Query("SELECT t FROM TokenJpaEntity t WHERE t.expiredAt < :now AND t.status = 'WAIT'") - List findWaitingTokensToBeExpired(@Param("now") LocalDateTime now); - - @Query("SELECT COUNT(t) FROM TokenJpaEntity t WHERE t.concertScheduleId = :concertScheduleId AND t.status = 'WAIT'") - int countCurrentlyWaitingTokens(@Param("concertScheduleId") Long concertScheduleId); -} diff --git a/src/main/java/com/slam/concertreservation/infrastructure/persistence/jpa/entities/TokenJpaEntity.java b/src/main/java/com/slam/concertreservation/infrastructure/persistence/jpa/entities/TokenJpaEntity.java deleted file mode 100644 index c5abf0b..0000000 --- a/src/main/java/com/slam/concertreservation/infrastructure/persistence/jpa/entities/TokenJpaEntity.java +++ /dev/null @@ -1,77 +0,0 @@ -package com.slam.concertreservation.infrastructure.persistence.jpa.entities; - -import com.slam.concertreservation.domain.queue.model.Token; -import jakarta.persistence.Entity; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.GenerationType; -import jakarta.persistence.Id; -import jakarta.persistence.IdClass; -import jakarta.persistence.Table; -import java.io.Serializable; -import java.time.LocalDateTime; -import java.util.List; -import lombok.AllArgsConstructor; -import lombok.EqualsAndHashCode; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; - -@Entity -@Table(name = "`QUEUE`") -@Getter -public class TokenJpaEntity extends BaseJpaEntity { - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - private Long concertScheduleId; - private Long userId; - private String status; // WAIT, ACTIVE, EXPIRED - private LocalDateTime expiredAt; - - public static TokenJpaEntity fromDomain(Token domainModel) { - TokenJpaEntity entity = new TokenJpaEntity(); - entity.id = (domainModel.getId() == null) ? null : Long.parseLong(domainModel.getId()); - entity.userId = domainModel.getUserId(); - entity.concertScheduleId = domainModel.getConcertScheduleId(); - entity.status = domainModel.getStatus().name(); - entity.expiredAt = domainModel.getExpiredAt(); - - return entity; - } - - public Token toDomain() { - return Token.create( - Long.toString(this.id), - this.userId, - this.concertScheduleId, - this.status, - this.getCreated_at(), - this.expiredAt); - } - - /** - * Domain Model 의 변경사항을 Entity 에 반영. - *
- *
- * - 수정이라는 상황의 특성 상, '이미 한 번 저장되었음'을 의미. 따라서, ID필드에 대한 Update 는 제외하는 것이 안전하고 - * 타당함. - * - * @param domainModel - * @return - */ - public TokenJpaEntity updateFromDomain(Token domainModel) { - this.userId = domainModel.getUserId(); - this.concertScheduleId = domainModel.getConcertScheduleId(); - this.status = domainModel.getStatus().name(); - this.expiredAt = domainModel.getExpiredAt(); - - return this; - } - - public static List createTokenJpaEntitiesFromDomain(List domainModels) { - return domainModels.stream() - .map(TokenJpaEntity::fromDomain) - .toList(); - } -} diff --git a/src/main/java/com/slam/concertreservation/infrastructure/persistence/jpa/impl/TokenRepositoryDbImpl.java b/src/main/java/com/slam/concertreservation/infrastructure/persistence/jpa/impl/TokenRepositoryDbImpl.java deleted file mode 100644 index 0946d41..0000000 --- a/src/main/java/com/slam/concertreservation/infrastructure/persistence/jpa/impl/TokenRepositoryDbImpl.java +++ /dev/null @@ -1,92 +0,0 @@ -package com.slam.concertreservation.infrastructure.persistence.jpa.impl; - -import com.slam.concertreservation.domain.queue.model.Token; -import com.slam.concertreservation.domain.queue.model.TokenStatus; -import com.slam.concertreservation.domain.queue.repository.TokenRepository; -import com.slam.concertreservation.infrastructure.persistence.jpa.TokenJpaRepository; -import com.slam.concertreservation.infrastructure.persistence.jpa.entities.TokenJpaEntity; -import java.time.LocalDateTime; -import java.util.List; -import java.util.Optional; -import lombok.RequiredArgsConstructor; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.stereotype.Repository; - -@ConditionalOnProperty(name = "app.queue.provider", havingValue = "DB", matchIfMissing = true) -@Repository -@RequiredArgsConstructor -public class TokenRepositoryDbImpl implements TokenRepository { - private final TokenJpaRepository tokenJpaRepository; - - @Override - public Token save(Token token) { - return tokenJpaRepository.save(TokenJpaEntity.fromDomain(token)) - .toDomain(); - } - - @Override - public List saveAll(List tokens) { - return tokenJpaRepository.saveAll(TokenJpaEntity.createTokenJpaEntitiesFromDomain(tokens)) - .stream() - .map(TokenJpaEntity::toDomain) - .toList(); - } - - @Override - public Optional findTokenWithIdAndConcertScheduleId(Long concertScheduleId, String tokenId) { - return tokenJpaRepository.findTokenJpaEntityByConcertScheduleIdAndId(concertScheduleId, Long.parseLong(tokenId)) - .map(TokenJpaEntity::toDomain); - } - - @Override - public List findByConcertScheduleId(Long concertScheduleId) { - return tokenJpaRepository.findByConcertScheduleId(concertScheduleId) - .stream() - .map(TokenJpaEntity::toDomain) - .toList(); - } - - @Override - public List findNextKTokensToBeActivated(Long concertScheduleId, int k) { - return tokenJpaRepository.findTopKByConcertScheduleIdAndStatus(concertScheduleId, TokenStatus.WAIT.name(), k) - .stream() - .map(TokenJpaEntity::toDomain) - .toList(); - } - - @Override - public int countCurrentlyActiveTokens(Long concertScheduleId) { - return tokenJpaRepository.countTokensByConcertScheduleIdAndStatus(concertScheduleId, TokenStatus.ACTIVE.name()); - } - - @Override - public int countRemaining(Long concertScheduleId, String tokenId) { - return tokenJpaRepository.countRemainingByConcertScheduleIdAndTokenId(concertScheduleId, - Long.parseLong(tokenId)); - } - - @Override - public List findActivatedTokensToBeExpired(Long concertScheduleId) { - return tokenJpaRepository.findActivatedTokensToBeExpired(LocalDateTime.now()) - .stream() - .map(TokenJpaEntity::toDomain) - .toList(); - } - - @Override - public List findWaitingTokensToBeExpired() { - return tokenJpaRepository.findWaitingTokensToBeExpired(LocalDateTime.now()) - .stream() - .map(TokenJpaEntity::toDomain) - .toList(); - } - - @Override - public int countCurrentlyWaitingTokens(Long concertScheduleId) { - return tokenJpaRepository.countTokensByConcertScheduleIdAndStatus(concertScheduleId, TokenStatus.WAIT.name()); - } - - @Override - public void setQueueExpiration(Long concertScheduleId, long ttlSeconds) { - } -} From 22e23f78c5f9c2613915413394e011b047934889 Mon Sep 17 00:00:00 2001 From: Ho Yeon CHAE Date: Mon, 9 Feb 2026 15:32:52 +0900 Subject: [PATCH 2/3] Queue : update application configuration and set Redis as default --- .../persistence/redis/impl/TokenRepositoryRedisImpl.java | 3 +-- src/main/resources/application.yml | 2 -- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/src/main/java/com/slam/concertreservation/infrastructure/persistence/redis/impl/TokenRepositoryRedisImpl.java b/src/main/java/com/slam/concertreservation/infrastructure/persistence/redis/impl/TokenRepositoryRedisImpl.java index 20727f1..35e7da5 100644 --- a/src/main/java/com/slam/concertreservation/infrastructure/persistence/redis/impl/TokenRepositoryRedisImpl.java +++ b/src/main/java/com/slam/concertreservation/infrastructure/persistence/redis/impl/TokenRepositoryRedisImpl.java @@ -13,7 +13,7 @@ import java.util.Set; import java.util.UUID; import java.util.concurrent.TimeUnit; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; + import org.springframework.data.redis.core.Cursor; import org.springframework.data.redis.core.HashOperations; import org.springframework.data.redis.core.RedisTemplate; @@ -24,7 +24,6 @@ import org.springframework.stereotype.Repository; @Repository -@ConditionalOnProperty(name = "app.queue.provider", havingValue = "REDIS", matchIfMissing = false) public class TokenRepositoryRedisImpl implements TokenRepository { private static final String TOKEN_HASH_STORAGE_NAME = "tokenHashStorage"; // 토큰 저장소(Map) 이름 diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 7f7f5b0..762c0d1 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -34,8 +34,6 @@ management: #### 대기열 구현체 설정 : Default - DB app: queue: - provider: "REDIS" - policy: max-concurrent-user: 50 max-concurrent-user-threshold: 1.2 From e7e832f654736308a9661ef207970d9f1c03f1a5 Mon Sep 17 00:00:00 2001 From: Ho Yeon CHAE Date: Mon, 9 Feb 2026 15:32:56 +0900 Subject: [PATCH 3/3] Queue : update test configuration --- src/test/resources/application-test.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/src/test/resources/application-test.yml b/src/test/resources/application-test.yml index c8e3fe6..b783976 100644 --- a/src/test/resources/application-test.yml +++ b/src/test/resources/application-test.yml @@ -30,7 +30,6 @@ server: #### 대기열 구현체 설정 : Default - DB app: queue: - provider: "REDIS" policy: max-concurrent-user-threshold: 1.0 max-concurrent-user: 2