From a9d0169ced05fd2c479fe2c6fd70b4235a2d8191 Mon Sep 17 00:00:00 2001 From: eeeeeaaan Date: Mon, 22 Sep 2025 22:44:10 +0900 Subject: [PATCH 1/3] =?UTF-8?q?[fix/#143]=20usage=20=EC=B6=94=EA=B0=80=20?= =?UTF-8?q?=EC=A3=BC=EC=84=9D=20=ED=95=B4=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/CertificationServiceImpl.java | 2 +- .../service/PartnershipServiceImpl.java | 17 ++++++++--------- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/assu/server/domain/certification/service/CertificationServiceImpl.java b/src/main/java/com/assu/server/domain/certification/service/CertificationServiceImpl.java index 79f6526..65f9244 100644 --- a/src/main/java/com/assu/server/domain/certification/service/CertificationServiceImpl.java +++ b/src/main/java/com/assu/server/domain/certification/service/CertificationServiceImpl.java @@ -71,7 +71,7 @@ public CertificationResponseDTO.getSessionIdResponse getSessionId( sessionManager.openSession(sessionId); // 세션 생성 직후 만료 시간을 5분으로 설정 - timeoutManager.scheduleTimeout(sessionId, Duration.ofMinutes(100));// TODO: 나중에 5분으로 변경 + timeoutManager.scheduleTimeout(sessionId, Duration.ofMinutes(10));// TODO: 나중에 5분으로 변경 // 세션 여는 대표자는 제일 먼저 인증 sessionManager.addUserToSession(sessionId, userId); diff --git a/src/main/java/com/assu/server/domain/partnership/service/PartnershipServiceImpl.java b/src/main/java/com/assu/server/domain/partnership/service/PartnershipServiceImpl.java index a7c936a..f4e0a21 100644 --- a/src/main/java/com/assu/server/domain/partnership/service/PartnershipServiceImpl.java +++ b/src/main/java/com/assu/server/domain/partnership/service/PartnershipServiceImpl.java @@ -91,15 +91,14 @@ public void recordPartnershipUsage(PartnershipRequestDTO.finalRequest dto, Membe () -> new GeneralException(ErrorStatus.NO_SUCH_STORE) ); Partner partner = store.getPartner(); - System.out.println("✨partnerId✨ = "+partner.getId()); - // if (partner != null) { - // Long partnerId = partner.getId(); - // System.out.println("알림 요청이 들어갑니다."); - // notificationService.sendOrder(partnerId, 0L, dto.getTableNumber(), dto.getPartnershipContent()); - // partnershipUsageRepository.saveAll(usages); - // } else { - // throw new GeneralException(ErrorStatus.NO_SUCH_PARTNER); - // } + if (partner != null) { + Long partnerId = partner.getId(); + System.out.println("알림 요청이 들어갑니다."); + notificationService.sendOrder(partnerId, 0L, dto.getTableNumber(), dto.getPartnershipContent()); + partnershipUsageRepository.saveAll(usages); + } else { + throw new GeneralException(ErrorStatus.NO_SUCH_PARTNER); + } } From f9b59b6c61a899252bf39a0dfc0c4f4c516d8b4a Mon Sep 17 00:00:00 2001 From: eeeeeaaan Date: Tue, 23 Sep 2025 10:17:30 +0900 Subject: [PATCH 2/3] =?UTF-8?q?[fix/#143]=20usage=20=EC=B6=94=EA=B0=80=20?= =?UTF-8?q?=EC=A3=BC=EC=84=9D=20=ED=95=B4=EC=A0=9C=20=EC=8A=A4=ED=85=9C?= =?UTF-8?q?=ED=94=84=20=EC=A4=91=EB=B3=B5=EC=B2=98=EB=A6=AC=20=ED=95=B4?= =?UTF-8?q?=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/PartnershipServiceImpl.java | 102 ++++++++++++------ 1 file changed, 68 insertions(+), 34 deletions(-) diff --git a/src/main/java/com/assu/server/domain/partnership/service/PartnershipServiceImpl.java b/src/main/java/com/assu/server/domain/partnership/service/PartnershipServiceImpl.java index f4e0a21..be75e23 100644 --- a/src/main/java/com/assu/server/domain/partnership/service/PartnershipServiceImpl.java +++ b/src/main/java/com/assu/server/domain/partnership/service/PartnershipServiceImpl.java @@ -59,47 +59,81 @@ public class PartnershipServiceImpl implements PartnershipService { @Override @Transactional - public void recordPartnershipUsage(PartnershipRequestDTO.finalRequest dto, Member member){ - - Student requestStudent = studentRepository.findById(member.getId()).orElseThrow( - () -> new GeneralException(ErrorStatus.NO_SUCH_STUDENT) // 혹은 적절한 예외 처리 - ); - - List usages = new ArrayList<>(); - + public void recordPartnershipUsage(PartnershipRequestDTO.finalRequest dto, Member member) { + // 1. 제휴 내용(PaperContent) 조회 PaperContent content = contentRepository.findById(dto.getContentId()).orElseThrow( () -> new GeneralException(ErrorStatus.NO_SUCH_CONTENT) ); Long paperId = content.getPaper().getId(); - // 1) 요청한 member 본인 - usages.add(PartnershipConverter.toPartnershipUsage(dto, requestStudent, paperId)); - requestStudent.setStamp(); - System.out.println("update 된 stamp : "+requestStudent.getStamp()); - - List userIds = Optional.ofNullable(dto.getUserIds()).orElse(Collections.emptyList()); - // 2) dto의 userIds에 있는 다른 사용자들 - for (Long userId : userIds) { - if(userId != member.getId()){ - Student student = studentRepository.getReferenceById(userId); - usages.add(PartnershipConverter.toPartnershipUsage(dto, student, paperId)); + + // 2. 중복을 허용하지 않는 Set을 사용하여 모든 사용자 ID를 수집 + Set uniqueUserIds = new HashSet<>(); + // 요청자 본인 ID 추가 + uniqueUserIds.add(member.getId()); + // DTO에 포함된 사용자 ID들 추가 (null일 경우 무시) + if (dto.getUserIds() != null) { + uniqueUserIds.addAll(dto.getUserIds()); + } + + // 3. 모든 학생 정보를 DB에서 한 번의 쿼리로 조회 (N+1 문제 해결) + List studentsToUpdate = studentRepository.findAllById(uniqueUserIds); + + // 4. 조회된 학생들에 대해 PartnershipUsage 생성 및 스탬프 업데이트 + List usages = studentsToUpdate.stream() + .map(student -> { student.setStamp(); - } + System.out.println("스탬프 업데이트 - 학생 ID: " + student.getId() + ", 현재 스탬프: " + student.getStamp()); + return PartnershipConverter.toPartnershipUsage(dto, student, paperId); + }) + .collect(Collectors.toList()); - } + // 5. 생성된 모든 Usage 기록을 한 번에 저장 + partnershipUsageRepository.saveAll(usages); - Store store = storeRepository.findById(dto.getStoreId()).orElseThrow( - () -> new GeneralException(ErrorStatus.NO_SUCH_STORE) - ); - Partner partner = store.getPartner(); - if (partner != null) { - Long partnerId = partner.getId(); - System.out.println("알림 요청이 들어갑니다."); - notificationService.sendOrder(partnerId, 0L, dto.getTableNumber(), dto.getPartnershipContent()); - partnershipUsageRepository.saveAll(usages); - } else { - throw new GeneralException(ErrorStatus.NO_SUCH_PARTNER); - } - } + // @Transactional 환경에서는 studentsToUpdate의 변경 사항(스탬프)이 자동으로 DB에 반영됩니다. + } + // public void recordPartnershipUsage(PartnershipRequestDTO.finalRequest dto, Member member){ + // + // Student requestStudent = studentRepository.findById(member.getId()).orElseThrow( + // () -> new GeneralException(ErrorStatus.NO_SUCH_STUDENT) // 혹은 적절한 예외 처리 + // ); + // + // List usages = new ArrayList<>(); + // + // PaperContent content = contentRepository.findById(dto.getContentId()).orElseThrow( + // () -> new GeneralException(ErrorStatus.NO_SUCH_CONTENT) + // ); + // Long paperId = content.getPaper().getId(); + // // 1) 요청한 member 본인 + // usages.add(PartnershipConverter.toPartnershipUsage(dto, requestStudent, paperId)); + // requestStudent.setStamp(); + // System.out.println("update 된 stamp : "+requestStudent.getStamp()); + // + // List userIds = Optional.ofNullable(dto.getUserIds()).orElse(Collections.emptyList()); + // // 2) dto의 userIds에 있는 다른 사용자들 + // for (Long userId : userIds) { + // if(userId != member.getId()){ + // Student student = studentRepository.getReferenceById(userId); + // usages.add(PartnershipConverter.toPartnershipUsage(dto, student, paperId)); + // student.setStamp(); + // } + // + // } + // partnershipUsageRepository.saveAll(usages); + // + // // Store store = storeRepository.findById(dto.getStoreId()).orElseThrow( + // // () -> new GeneralException(ErrorStatus.NO_SUCH_STORE) + // // ); + // // Partner partner = store.getPartner(); + // // if (partner != null) { + // // Long partnerId = partner.getId(); + // // System.out.println("알림 요청이 들어갑니다."); + // // notificationService.sendOrder(partnerId, 0L, dto.getTableNumber(), dto.getPartnershipContent()); + // // + // // } else { + // // throw new GeneralException(ErrorStatus.NO_SUCH_PARTNER); + // // } + // } From b23d69d3882b9ca786f9b0ebf62174f73b78d6d3 Mon Sep 17 00:00:00 2001 From: eeeeeaaan Date: Tue, 23 Sep 2025 10:27:12 +0900 Subject: [PATCH 3/3] =?UTF-8?q?[fix/#143]=20=EB=A1=9C=EA=B7=B8=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/partnership/service/PartnershipServiceImpl.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/com/assu/server/domain/partnership/service/PartnershipServiceImpl.java b/src/main/java/com/assu/server/domain/partnership/service/PartnershipServiceImpl.java index be75e23..8418f44 100644 --- a/src/main/java/com/assu/server/domain/partnership/service/PartnershipServiceImpl.java +++ b/src/main/java/com/assu/server/domain/partnership/service/PartnershipServiceImpl.java @@ -82,7 +82,6 @@ public void recordPartnershipUsage(PartnershipRequestDTO.finalRequest dto, Membe List usages = studentsToUpdate.stream() .map(student -> { student.setStamp(); - System.out.println("스탬프 업데이트 - 학생 ID: " + student.getId() + ", 현재 스탬프: " + student.getStamp()); return PartnershipConverter.toPartnershipUsage(dto, student, paperId); }) .collect(Collectors.toList());