diff --git a/src/main/java/com/practice/course_registration/domain/subject/service/CourseEnrollmentService.java b/src/main/java/com/practice/course_registration/domain/subject/service/CourseEnrollmentService.java deleted file mode 100644 index 5702d7e..0000000 --- a/src/main/java/com/practice/course_registration/domain/subject/service/CourseEnrollmentService.java +++ /dev/null @@ -1,107 +0,0 @@ -package com.practice.course_registration.domain.subject.service; - -import com.practice.course_registration.domain.member.domain.Member; -import com.practice.course_registration.domain.member.repository.MemberRepository; -import com.practice.course_registration.domain.subject.domain.MemberSubject; -import com.practice.course_registration.domain.subject.domain.Subject; -import com.practice.course_registration.domain.subject.repository.MemberSubjectRepository; -import com.practice.course_registration.domain.subject.repository.SubjectRepository; -import com.practice.course_registration.global.apiPayload.code.status.ErrorStatus; -import com.practice.course_registration.global.apiPayload.exception.handler.ErrorHandler; -import com.practice.course_registration.global.redis.repository.LuaRepository; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.List; - -@Service -@RequiredArgsConstructor -@Slf4j -public class CourseEnrollmentService { - - private final MemberRepository memberRepository; - private final SubjectRepository subjectRepository; - private final MemberSubjectRepository memberSubjectRepository; - private final LuaRepository luaRepository; // holdKey 삭제용 - private static final int MAX_SCORE = 10; - - // 반드시 public이어야 다른 클래스에서 호출 가능 - @Transactional - public void processEnrollment(Long subjectId, Long memberId) { - // 멤버 찾기 - Member member = findMemberById(memberId); - - // 해당 과목 찾기 - Subject subject = findSubjectById(subjectId); - - if (memberSubjectRepository.findByMemberIdAndSubjectId(memberId, subjectId).isPresent()) { - throw new ErrorHandler(ErrorStatus.ALREADY_APPLY_SUBJECT); - } - - if (member.getRegisteredScore() + subject.getScore() > MAX_SCORE) { - throw new ErrorHandler(ErrorStatus.OVER_SOCRE_POSSIBLE); - } - - // 연관관계 탐색 대신 memberId로 신청 내역 조회 후 과목을 id로 조회 - List enrolledSubjectIds = memberSubjectRepository.findAllByMemberId(memberId).stream() - .map(MemberSubject::getSubjectId) - .toList(); - List enrolledSubjects = subjectRepository.findAllById(enrolledSubjectIds); - - int isSameCode = enrolledSubjects.stream() - .filter(subj -> - subj.getCode().equals(subject.getCode()) - ) - .toList() - .size() - ; - - if (isSameCode != 0) { - log.error("이미 신청한 과목"); - throw new ErrorHandler(ErrorStatus.ALREADY_APPLY_SUBJECT); - } - - boolean conflict = enrolledSubjects.stream() - .filter(subj -> - subj.getSubjectDay() == subject.getSubjectDay() - ) - .anyMatch(subj -> subj.conflictCheck(subject)) - ; - - if (conflict) { - log.error("시간 충돌"); - throw new ErrorHandler(ErrorStatus.CONFLICT_COURSE_TIME); - } - - int result = subjectRepository.workerIncreaseRegistered(subject.getId()); - - if (result != 1) { - log.error("DB 정합성 문제 발생: result=" + result); - throw new ErrorHandler(ErrorStatus.ENROLL_FAILED); - } - - // 신청학점 추가 - member.addScore(subject.getScore()); - - // 저장 - MemberSubject memberSubject = MemberSubject.builder() - .memberId(memberId) - .subjectId(subject.getId()) - .build(); - - memberSubjectRepository.save(memberSubject); - - // redis hold key 삭제 - luaRepository.deleteHoldKeyOnly(subject.getId(), memberId); - } - - private Member findMemberById(Long memberId) { - return memberRepository.findById(memberId).orElseThrow(() -> new ErrorHandler(ErrorStatus.MEMBER_NOT_FOUND)); - } - - private Subject findSubjectById(Long subject) { - return subjectRepository.findById(subject).orElseThrow(() -> new ErrorHandler(ErrorStatus.SUBJECT_NOT_FOUND)); - } -} \ No newline at end of file diff --git a/src/main/java/com/practice/course_registration/global/redis/service/IdempotencyService.java b/src/main/java/com/practice/course_registration/global/redis/service/IdempotencyService.java index 36a853d..fb97f13 100644 --- a/src/main/java/com/practice/course_registration/global/redis/service/IdempotencyService.java +++ b/src/main/java/com/practice/course_registration/global/redis/service/IdempotencyService.java @@ -3,7 +3,6 @@ import com.practice.course_registration.global.redis.utils.RedisKeyUtils; import java.time.Duration; import lombok.RequiredArgsConstructor; -import org.springframework.boot.autoconfigure.cache.CacheProperties.Redis; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.stereotype.Service; @@ -20,7 +19,6 @@ public class IdempotencyService { public boolean rateLimitAllow(Long memberId, int limit, Duration ttl) { String key = RedisKeyUtils.rateLimitKey(memberId); Long cnt = stringRedisTemplate.opsForValue().increment(key); - System.out.println("cnt : " + cnt); // 첫 요청인 경우 -> TTL 1로 세팅 if (cnt != null && cnt == 1L) { stringRedisTemplate.expire(key, ttl); diff --git a/src/main/java/com/practice/course_registration/global/redis/service/PublishIssueTokenScheduler.java b/src/main/java/com/practice/course_registration/global/redis/service/PublishIssueTokenScheduler.java index 56459e2..6703322 100644 --- a/src/main/java/com/practice/course_registration/global/redis/service/PublishIssueTokenScheduler.java +++ b/src/main/java/com/practice/course_registration/global/redis/service/PublishIssueTokenScheduler.java @@ -21,7 +21,7 @@ public void issue() { try { long cnt = luaRepository.publishIssueTokens(PERMITS_PER_TICKS, TOKEN_TTL); if (cnt > 0) { - log.info("토큰 발급 성공: count={}, sample={}", cnt); + log.info("토큰 발급 성공: count={}", cnt); } } catch (Exception e) { log.error("토큰 발급 실패", e); diff --git a/src/main/java/com/practice/course_registration/global/redis/service/WaitQueueService.java b/src/main/java/com/practice/course_registration/global/redis/service/WaitQueueService.java index 40c9300..876a11a 100644 --- a/src/main/java/com/practice/course_registration/global/redis/service/WaitQueueService.java +++ b/src/main/java/com/practice/course_registration/global/redis/service/WaitQueueService.java @@ -1,7 +1,6 @@ package com.practice.course_registration.global.redis.service; import com.practice.course_registration.global.redis.utils.RedisKeyUtils; -import java.time.Duration; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.data.redis.core.StringRedisTemplate;