SubscriptionManager.java
package com.newbit.subscription.service;
import org.springframework.stereotype.Component;
import com.newbit.subscription.dto.response.SubscriptionResponse;
import com.newbit.subscription.entity.Subscription;
import com.newbit.subscription.entity.SubscriptionId;
import com.newbit.subscription.repository.SubscriptionRepository;
import jakarta.persistence.EntityManager;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@Component
@RequiredArgsConstructor
public class SubscriptionManager {
private final SubscriptionRepository subscriptionRepository;
private final EntityManager entityManager;
public SubscriptionResponse cancelSubscription(Subscription subscription) {
SubscriptionId subscriptionId = new SubscriptionId(subscription.getUserId(), subscription.getSeriesId());
SubscriptionResponse response = SubscriptionResponse.canceledSubscription(
subscription.getSeriesId(), subscription.getUserId());
subscriptionRepository.deleteById(subscriptionId);
entityManager.flush();
log.info("시리즈 구독 취소 (삭제): seriesId={}, userId={}",
subscription.getSeriesId(), subscription.getUserId());
verifySubscriptionState(subscription.getUserId(), subscription.getSeriesId(), false, "구독 삭제 후에도 여전히 존재함");
return response;
}
public SubscriptionResponse createNewSubscription(Long userId, Long seriesId) {
Subscription newSubscription = Subscription.builder()
.seriesId(seriesId)
.userId(userId)
.build();
Subscription savedSubscription = subscriptionRepository.save(newSubscription);
entityManager.flush();
log.info("시리즈 새 구독: seriesId={}, userId={}", seriesId, userId);
verifySubscriptionState(userId, seriesId, true, "구독 저장 후에도 조회되지 않음");
return SubscriptionResponse.from(savedSubscription);
}
private void verifySubscriptionState(Long userId, Long seriesId, boolean expectedState, String errorMessage) {
boolean currentState = subscriptionRepository.existsByUserIdAndSeriesId(userId, seriesId);
if (currentState != expectedState) {
log.warn("{}: seriesId={}, userId={}", errorMessage, seriesId, userId);
}
}
}