From edc1264c5255edd1e33230e7e1171d76e10af1fd Mon Sep 17 00:00:00 2001 From: xihxxn Date: Sun, 7 Jun 2026 12:17:40 +0900 Subject: [PATCH 01/10] =?UTF-8?q?[Fix]=20role=EC=9D=84=20=EC=BB=B4?= =?UTF-8?q?=ED=8F=AC=EB=84=8C=ED=8A=B8=20=ED=95=A8=EC=88=98=20=EB=82=B4=20?= =?UTF-8?q?=EC=A7=81=EC=A0=91=20=EC=9D=BD=EA=B8=B0=EB=A1=9C=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD=ED=95=98=EC=97=AC=20=EB=A0=8C=EB=8D=94=EB=A7=81=20?= =?UTF-8?q?=EC=8B=9C=20=EA=B6=8C=ED=95=9C=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/pages/curriculum/CurriculumPage.js | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/frontend/src/pages/curriculum/CurriculumPage.js b/frontend/src/pages/curriculum/CurriculumPage.js index a1a7e8c..79a15a1 100644 --- a/frontend/src/pages/curriculum/CurriculumPage.js +++ b/frontend/src/pages/curriculum/CurriculumPage.js @@ -318,17 +318,12 @@ function SessionForm({ day, week, onClose, onSave }) { // ── 메인 컴포넌트 ───────────────────────────────────── function CurriculumPage() { - const [role, setRole] = useState(null); + const role = localStorage.getItem('role') || 'MEMBER'; const [days, setDays] = useState([]); const [showForm, setShowForm] = useState(false); const [editDay, setEditDay] = useState(null); const [createWeek, setCreateWeek] = useState(null); - useEffect(() => { - setRole(localStorage.getItem('role') || 'MEMBER'); - }, []); - - // if (role === null) return null; const fetchDays = async () => { try { From 98a547c3b1cf231d4230bf567822b9b7c001bf48 Mon Sep 17 00:00:00 2001 From: xihxxn Date: Sun, 7 Jun 2026 12:21:33 +0900 Subject: [PATCH 02/10] =?UTF-8?q?=20[Revert]=20role=20=EC=83=81=ED=83=9C?= =?UTF-8?q?=20=EA=B4=80=EB=A6=AC=20=EC=9B=90=EC=83=81=EB=B3=B5=EA=B5=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/pages/curriculum/CurriculumPage.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/frontend/src/pages/curriculum/CurriculumPage.js b/frontend/src/pages/curriculum/CurriculumPage.js index 79a15a1..14782a4 100644 --- a/frontend/src/pages/curriculum/CurriculumPage.js +++ b/frontend/src/pages/curriculum/CurriculumPage.js @@ -6,6 +6,8 @@ import AmImg from '../../assets/images/am.png'; import PmImg from '../../assets/images/pm.png'; import Toggle1 from '../../assets/images/icon_togle1.svg'; +const role = localStorage.getItem('role') || 'MEMBER'; + const DAY_LABEL = { SUNDAY: '일요일', MONDAY: '월요일', TUESDAY: '화요일', WEDNESDAY: '수요일', THURSDAY: '목요일', FRIDAY: '금요일', SATURDAY: '토요일' }; const STATUS_OPTIONS = ['BEFORE_SESSION', 'IN_SESSION', 'AFTER_SESSION']; const STATUS_LABEL = { BEFORE_SESSION: '세션 전', IN_SESSION: '세션 중', AFTER_SESSION: '세션 후' }; @@ -318,7 +320,6 @@ function SessionForm({ day, week, onClose, onSave }) { // ── 메인 컴포넌트 ───────────────────────────────────── function CurriculumPage() { - const role = localStorage.getItem('role') || 'MEMBER'; const [days, setDays] = useState([]); const [showForm, setShowForm] = useState(false); const [editDay, setEditDay] = useState(null); From fe26a8a287c081be006f7a65b031e334d51454cf Mon Sep 17 00:00:00 2001 From: xihxxn Date: Sun, 7 Jun 2026 12:24:16 +0900 Subject: [PATCH 03/10] =?UTF-8?q?[Fix]=20role=EC=9D=84=20=EC=BB=B4?= =?UTF-8?q?=ED=8F=AC=EB=84=8C=ED=8A=B8=20=ED=95=A8=EC=88=98=20=EB=82=B4?= =?UTF-8?q?=EC=97=90=EC=84=9C=20=EC=9D=BD=EB=8F=84=EB=A1=9D=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=ED=95=98=EC=97=AC=20=EC=B2=AB=20=EB=A0=8C=EB=8D=94?= =?UTF-8?q?=EB=A7=81=20=EC=8B=9C=20=EA=B6=8C=ED=95=9C=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/pages/curriculum/CurriculumPage.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/frontend/src/pages/curriculum/CurriculumPage.js b/frontend/src/pages/curriculum/CurriculumPage.js index 14782a4..79a15a1 100644 --- a/frontend/src/pages/curriculum/CurriculumPage.js +++ b/frontend/src/pages/curriculum/CurriculumPage.js @@ -6,8 +6,6 @@ import AmImg from '../../assets/images/am.png'; import PmImg from '../../assets/images/pm.png'; import Toggle1 from '../../assets/images/icon_togle1.svg'; -const role = localStorage.getItem('role') || 'MEMBER'; - const DAY_LABEL = { SUNDAY: '일요일', MONDAY: '월요일', TUESDAY: '화요일', WEDNESDAY: '수요일', THURSDAY: '목요일', FRIDAY: '금요일', SATURDAY: '토요일' }; const STATUS_OPTIONS = ['BEFORE_SESSION', 'IN_SESSION', 'AFTER_SESSION']; const STATUS_LABEL = { BEFORE_SESSION: '세션 전', IN_SESSION: '세션 중', AFTER_SESSION: '세션 후' }; @@ -320,6 +318,7 @@ function SessionForm({ day, week, onClose, onSave }) { // ── 메인 컴포넌트 ───────────────────────────────────── function CurriculumPage() { + const role = localStorage.getItem('role') || 'MEMBER'; const [days, setDays] = useState([]); const [showForm, setShowForm] = useState(false); const [editDay, setEditDay] = useState(null); From cb01b76abd4c2ff23dfa3750d98c363d678c913c Mon Sep 17 00:00:00 2001 From: xihxxn Date: Sun, 7 Jun 2026 18:49:59 +0900 Subject: [PATCH 04/10] =?UTF-8?q?[Fix]=20HikariCP=20=EC=BB=A4=EB=84=A5?= =?UTF-8?q?=EC=85=98=20=ED=92=80=20=EA=B3=A0=EA=B0=88=20=EB=B0=A9=EC=A7=80?= =?UTF-8?q?=20=EC=84=A4=EC=A0=95=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/src/main/resources/application.yml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/backend/src/main/resources/application.yml b/backend/src/main/resources/application.yml index a83439d..b0e4826 100644 --- a/backend/src/main/resources/application.yml +++ b/backend/src/main/resources/application.yml @@ -6,6 +6,12 @@ spring: username: ${RDS_USERNAME} password: ${RDS_PASSWORD} driver-class-name: org.postgresql.Driver + hikari: + maximum-pool-size: 10 + connection-timeout: 30000 + idle-timeout: 600000 + max-lifetime: 1800000 + leak-detection-threshold: 5000 flyway: # repair-on-migrate: true @@ -15,6 +21,7 @@ spring: hibernate: ddl-auto: validate show-sql: true + open-in-view: false properties: hibernate: format_sql: true From bd832d468d21c386b05d48941844095c16336a5e Mon Sep 17 00:00:00 2001 From: xihxxn Date: Sun, 7 Jun 2026 18:54:04 +0900 Subject: [PATCH 05/10] =?UTF-8?q?[Fix]=20=EC=B6=9C=EC=84=9D=20=EC=BD=94?= =?UTF-8?q?=EB=93=9C=20=EB=A7=8C=EB=A3=8C=20=EC=8B=9C=20=EB=B3=B4=EC=A6=9D?= =?UTF-8?q?=EA=B8=88=20=EC=9E=AC=EA=B3=84=EC=82=B0=20N*3=20=EC=BF=BC?= =?UTF-8?q?=EB=A6=AC=20=E2=86=92=20=EB=B0=B0=EC=B9=98=20=EC=B2=98=EB=A6=AC?= =?UTF-8?q?=EB=A1=9C=20=EA=B0=9C=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../repository/AttendanceRepository.java | 3 ++ .../attendance/service/AttendanceService.java | 28 +++++++++---------- .../deposit/repository/DepositRepository.java | 2 ++ .../deposit/service/DepositService.java | 23 +++++++++++++++ 4 files changed, 41 insertions(+), 15 deletions(-) diff --git a/backend/src/main/java/com/example/Piroin/project/domain/attendance/repository/AttendanceRepository.java b/backend/src/main/java/com/example/Piroin/project/domain/attendance/repository/AttendanceRepository.java index 5839457..86aeb01 100644 --- a/backend/src/main/java/com/example/Piroin/project/domain/attendance/repository/AttendanceRepository.java +++ b/backend/src/main/java/com/example/Piroin/project/domain/attendance/repository/AttendanceRepository.java @@ -55,6 +55,9 @@ Optional findByUserIdAndAttendanceCodeId( List findByAttendanceCodeId(Integer id); + @Query("SELECT a.user.id, COUNT(a) FROM Attendance a WHERE a.user.id IN :userIds AND a.status = false GROUP BY a.user.id") + List countFailedAttendanceByUserIds(@Param("userIds") List userIds); + // 특정 날짜에 발급된 출석 코드의 개수를 세는 메서드 //long countByAttendanceDate(String attendanceDate); diff --git a/backend/src/main/java/com/example/Piroin/project/domain/attendance/service/AttendanceService.java b/backend/src/main/java/com/example/Piroin/project/domain/attendance/service/AttendanceService.java index 2840c00..8150bc5 100644 --- a/backend/src/main/java/com/example/Piroin/project/domain/attendance/service/AttendanceService.java +++ b/backend/src/main/java/com/example/Piroin/project/domain/attendance/service/AttendanceService.java @@ -64,22 +64,18 @@ public AttendanceCode generateCodeAndCreateAttendances(LocalDate date) { // [수 throw new IllegalStateException("하루에 최대 3회까지만 출석 코드를 생성할 수 있습니다."); } - // 1-3) 기존 활성화된 코드들 만료 처리 + // 1-3) 기존 활성화된 코드들 만료 처리 + 보증금 일괄 재계산 List activeCodes = attendanceCodeRepository.findByIsExpiredFalse(); for (AttendanceCode activeCode : activeCodes) { activeCode.expire(); } - for (AttendanceCode activeCode : activeCodes) { - activeCode.expire(); - - List attendances = - attendanceRepository.findByAttendanceCodeId(activeCode.getId()); - - for (Attendance attendance : attendances) { - depositService.recalculateDeposit(attendance.getUser().getId()); - } - } + List userIdsToRecalculate = activeCodes.stream() + .flatMap(activeCode -> attendanceRepository.findByAttendanceCodeId(activeCode.getId()).stream()) + .map(attendance -> attendance.getUser().getId()) + .distinct() + .toList(); + depositService.recalculateDepositBatch(userIdsToRecalculate); // 1-4) 4자리 랜덤 코드 생성 및 차수(Order) 계산 @@ -208,10 +204,12 @@ public String expireActiveAttendanceCode() { List absents = attendanceRepository.findByAttendanceCodeIdAndStatusFalse(attendanceCodeId); - // 4. 결석자 대상 보증금 재계산 (User ID 타입 Integer 반영) - for (Attendance attendance : absents) { - depositService.recalculateDeposit(attendance.getUser().getId()); - } + // 4. 결석자 대상 보증금 일괄 재계산 + List absentUserIds = absents.stream() + .map(attendance -> attendance.getUser().getId()) + .distinct() + .toList(); + depositService.recalculateDepositBatch(absentUserIds); return "출석 코드가 성공적으로 만료되었습니다."; } diff --git a/backend/src/main/java/com/example/Piroin/project/domain/deposit/repository/DepositRepository.java b/backend/src/main/java/com/example/Piroin/project/domain/deposit/repository/DepositRepository.java index f3836bc..ed5f1d5 100644 --- a/backend/src/main/java/com/example/Piroin/project/domain/deposit/repository/DepositRepository.java +++ b/backend/src/main/java/com/example/Piroin/project/domain/deposit/repository/DepositRepository.java @@ -4,6 +4,7 @@ import com.example.Piroin.project.domain.user.entity.User; import org.springframework.data.jpa.repository.JpaRepository; +import java.util.List; import java.util.Optional; public interface DepositRepository extends JpaRepository { @@ -11,4 +12,5 @@ public interface DepositRepository extends JpaRepository { Optional findByUserId(Long userId); + List findByUserIdIn(List userIds); } diff --git a/backend/src/main/java/com/example/Piroin/project/domain/deposit/service/DepositService.java b/backend/src/main/java/com/example/Piroin/project/domain/deposit/service/DepositService.java index de461cd..47e2e09 100644 --- a/backend/src/main/java/com/example/Piroin/project/domain/deposit/service/DepositService.java +++ b/backend/src/main/java/com/example/Piroin/project/domain/deposit/service/DepositService.java @@ -15,6 +15,10 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + @Service @RequiredArgsConstructor public class DepositService { @@ -40,6 +44,25 @@ public void recalculateDeposit(Long userId) { deposit.updateAttendanceAmount(descentAttendance); } + // 1-1. 여러 유저 보증금 일괄 재계산 (N*3 쿼리 → 3 쿼리) + @Transactional + public void recalculateDepositBatch(List userIds) { + if (userIds.isEmpty()) return; + + List deposits = depositRepository.findByUserIdIn(userIds); + Map failCountMap = attendanceRepository.countFailedAttendanceByUserIds(userIds) + .stream() + .collect(Collectors.toMap( + row -> (Long) row[0], + row -> ((Long) row[1]).intValue() + )); + + for (Deposit deposit : deposits) { + int failCount = failCountMap.getOrDefault(deposit.getUser().getId(), 0); + deposit.updateAttendanceAmount(failCount * ATTENDANCE_PENALTY); + } + } + // 2. 보증금 조회 로직 public DepositResponse getMyDeposit(Long userId) { From be6e638943e7c62be5edd3284785f5445b805a59 Mon Sep 17 00:00:00 2001 From: xihxxn Date: Sun, 7 Jun 2026 18:58:35 +0900 Subject: [PATCH 06/10] =?UTF-8?q?[Fix]=20AssignmentService=20=ED=81=B4?= =?UTF-8?q?=EB=9E=98=EC=8A=A4=20=EB=A0=88=EB=B2=A8=20@Transactional=20?= =?UTF-8?q?=EC=A0=9C=EA=B1=B0=20=EB=B0=8F=20=EB=A9=94=EC=84=9C=EB=93=9C?= =?UTF-8?q?=EB=B3=84=20readOnly=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../project/domain/assignment/service/AssignmentService.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/backend/src/main/java/com/example/Piroin/project/domain/assignment/service/AssignmentService.java b/backend/src/main/java/com/example/Piroin/project/domain/assignment/service/AssignmentService.java index 73fe0c5..54505dd 100644 --- a/backend/src/main/java/com/example/Piroin/project/domain/assignment/service/AssignmentService.java +++ b/backend/src/main/java/com/example/Piroin/project/domain/assignment/service/AssignmentService.java @@ -34,7 +34,6 @@ @Service @RequiredArgsConstructor -@Transactional public class AssignmentService { private final AssignmentRepository assignmentRepository; @@ -163,6 +162,7 @@ public ModifyAssignmentResponse modifyAssignment( } // 3. 과제 삭제 + @Transactional public DeleteAssignmentResponse deleteAssignment(Integer assignmentId) { Assignment assignment = assignmentRepository.findById(assignmentId) @@ -182,6 +182,7 @@ public DeleteAssignmentResponse deleteAssignment(Integer assignmentId) { } // 4-1. 나의 과제 조회 (부원) + @Transactional(readOnly = true) public GetMyAssignmentsResponse getMyAssignments( Long userId, String week From 7509dd61e738472c351d121ccc009b1324aa6410 Mon Sep 17 00:00:00 2001 From: xihxxn Date: Sun, 7 Jun 2026 19:01:07 +0900 Subject: [PATCH 07/10] =?UTF-8?q?[Fix]=20SSE=20=ED=83=80=EC=9E=84=EC=95=84?= =?UTF-8?q?=EC=9B=83=201=EC=8B=9C=EA=B0=84=20=E2=86=92=203=EB=B6=84?= =?UTF-8?q?=EC=9C=BC=EB=A1=9C=20=EC=B6=95=EC=86=8C=ED=95=98=EC=97=AC=20Tom?= =?UTF-8?q?cat=20=EC=8A=A4=EB=A0=88=EB=93=9C=20=EB=82=AD=EB=B9=84=20?= =?UTF-8?q?=EB=B0=A9=EC=A7=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../project/domain/question/service/QuestionEventService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/src/main/java/com/example/Piroin/project/domain/question/service/QuestionEventService.java b/backend/src/main/java/com/example/Piroin/project/domain/question/service/QuestionEventService.java index 2ba72d2..e304fd3 100644 --- a/backend/src/main/java/com/example/Piroin/project/domain/question/service/QuestionEventService.java +++ b/backend/src/main/java/com/example/Piroin/project/domain/question/service/QuestionEventService.java @@ -12,7 +12,7 @@ @Service public class QuestionEventService { - private static final long SSE_TIMEOUT_MILLIS = 60L * 60L * 1000L; + private static final long SSE_TIMEOUT_MILLIS = 3L * 60L * 1000L; // sessionId별로 현재 질문방을 보고 있는 SSE 연결들을 보관한다. private final Map> sessionEmitters = new ConcurrentHashMap<>(); From 4b2e2d924ddeef9ed6b170ab35a4cca1756c1746 Mon Sep 17 00:00:00 2001 From: xihxxn Date: Sun, 7 Jun 2026 19:03:51 +0900 Subject: [PATCH 08/10] =?UTF-8?q?[Fix]=20AdminUserService=20=EA=B3=BC?= =?UTF-8?q?=EC=A0=9C/=EC=B6=9C=EC=84=9D=20=EC=88=98=EC=A0=95=20=EC=8B=9C?= =?UTF-8?q?=20=EB=A3=A8=ED=94=84=20=EB=82=B4=20=EA=B0=9C=EB=B3=84=20?= =?UTF-8?q?=EC=A1=B0=ED=9A=8C=20=E2=86=92=20=EB=B0=B0=EC=B9=98=20=EC=A1=B0?= =?UTF-8?q?=ED=9A=8C=EB=A1=9C=20=EA=B0=9C=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/user/service/AdminUserService.java | 38 ++++++++++--------- 1 file changed, 21 insertions(+), 17 deletions(-) diff --git a/backend/src/main/java/com/example/Piroin/project/domain/user/service/AdminUserService.java b/backend/src/main/java/com/example/Piroin/project/domain/user/service/AdminUserService.java index 4e923a8..5450cf1 100644 --- a/backend/src/main/java/com/example/Piroin/project/domain/user/service/AdminUserService.java +++ b/backend/src/main/java/com/example/Piroin/project/domain/user/service/AdminUserService.java @@ -23,6 +23,9 @@ import org.springframework.transaction.annotation.Transactional; import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.stream.Collectors; @Service @RequiredArgsConstructor @@ -76,17 +79,17 @@ public UpdateStudentStatusResponse updateStudentWeekStatus( .orElseThrow(() -> new RuntimeException("사용자가 존재하지 않습니다.")); if (request.getAssignments() != null) { - for (UpdateStudentStatusRequest.AssignmentStatusRequest dto - : request.getAssignments()) { + List itemIds = request.getAssignments().stream() + .map(UpdateStudentStatusRequest.AssignmentStatusRequest::getAssignmentItemId) + .toList(); - // 해당 assignmentItem 존재하지 않을 때 - AssignmentItem assignmentItem = - assignmentItemRepository.findById(dto.getAssignmentItemId()) - .orElseThrow(() -> - new RuntimeException("과제 정보가 존재하지 않습니다.") - ); + Map itemMap = assignmentItemRepository.findAllById(itemIds).stream() + .collect(Collectors.toMap(AssignmentItem::getId, item -> item)); + + for (UpdateStudentStatusRequest.AssignmentStatusRequest dto : request.getAssignments()) { + AssignmentItem assignmentItem = Optional.ofNullable(itemMap.get(dto.getAssignmentItemId())) + .orElseThrow(() -> new RuntimeException("과제 정보가 존재하지 않습니다.")); - // assignmentItem가 userId의 과제가 아닐 경우 if (!assignmentItem.getUser().getId().equals(userId)) { throw new RuntimeException("해당 유저의 과제가 아닙니다."); } @@ -98,16 +101,17 @@ public UpdateStudentStatusResponse updateStudentWeekStatus( } if (request.getAttendances() != null) { - for (UpdateStudentStatusRequest.AttendanceStatusRequest dto - : request.getAttendances()) { + List attendanceIds = request.getAttendances().stream() + .map(dto -> dto.getAttendanceId().longValue()) + .toList(); + + Map attendanceMap = attendanceRepository.findAllById(attendanceIds).stream() + .collect(Collectors.toMap(Attendance::getId, a -> a)); - Attendance attendance = - attendanceRepository.findById(dto.getAttendanceId()) - .orElseThrow(() -> - new RuntimeException("출석 정보가 존재하지 않습니다.") - ); + for (UpdateStudentStatusRequest.AttendanceStatusRequest dto : request.getAttendances()) { + Attendance attendance = Optional.ofNullable(attendanceMap.get(dto.getAttendanceId().longValue())) + .orElseThrow(() -> new RuntimeException("출석 정보가 존재하지 않습니다.")); - // assignmentId가 userId의 것이 아닐 때 if (!attendance.getUser().getId().equals(userId)) { throw new RuntimeException("해당 유저의 출석이 아닙니다."); } From 1a487e645e4f40f1d8509bec716511dffd9f77d6 Mon Sep 17 00:00:00 2001 From: xihxxn Date: Sun, 7 Jun 2026 19:32:20 +0900 Subject: [PATCH 09/10] =?UTF-8?q?[Fix]=20AdminUserService=20=EC=B6=9C?= =?UTF-8?q?=EC=84=9D=20ID=20=ED=83=80=EC=9E=85=20Long=20=E2=86=92=20Intege?= =?UTF-8?q?r=20=EB=B6=88=EC=9D=BC=EC=B9=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../project/domain/user/service/AdminUserService.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/backend/src/main/java/com/example/Piroin/project/domain/user/service/AdminUserService.java b/backend/src/main/java/com/example/Piroin/project/domain/user/service/AdminUserService.java index 5450cf1..9d23d27 100644 --- a/backend/src/main/java/com/example/Piroin/project/domain/user/service/AdminUserService.java +++ b/backend/src/main/java/com/example/Piroin/project/domain/user/service/AdminUserService.java @@ -101,15 +101,15 @@ public UpdateStudentStatusResponse updateStudentWeekStatus( } if (request.getAttendances() != null) { - List attendanceIds = request.getAttendances().stream() - .map(dto -> dto.getAttendanceId().longValue()) + List attendanceIds = request.getAttendances().stream() + .map(UpdateStudentStatusRequest.AttendanceStatusRequest::getAttendanceId) .toList(); - Map attendanceMap = attendanceRepository.findAllById(attendanceIds).stream() + Map attendanceMap = attendanceRepository.findAllById(attendanceIds).stream() .collect(Collectors.toMap(Attendance::getId, a -> a)); for (UpdateStudentStatusRequest.AttendanceStatusRequest dto : request.getAttendances()) { - Attendance attendance = Optional.ofNullable(attendanceMap.get(dto.getAttendanceId().longValue())) + Attendance attendance = Optional.ofNullable(attendanceMap.get(dto.getAttendanceId())) .orElseThrow(() -> new RuntimeException("출석 정보가 존재하지 않습니다.")); if (!attendance.getUser().getId().equals(userId)) { From c6c348886fcbc532ea75d3ba6474b845d9333f1b Mon Sep 17 00:00:00 2001 From: xihxxn Date: Sun, 7 Jun 2026 19:39:45 +0900 Subject: [PATCH 10/10] =?UTF-8?q?[Fix]=20AdminUserService=20=EC=B6=9C?= =?UTF-8?q?=EC=84=9D=20ID=20=ED=83=80=EC=9E=85=20=EB=B6=88=EC=9D=BC?= =?UTF-8?q?=EC=B9=98=20=EC=88=98=EC=A0=95=20-=20findAllById=20Long,=20map?= =?UTF-8?q?=20=ED=82=A4=20Integer?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Piroin/project/domain/user/service/AdminUserService.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/backend/src/main/java/com/example/Piroin/project/domain/user/service/AdminUserService.java b/backend/src/main/java/com/example/Piroin/project/domain/user/service/AdminUserService.java index 9d23d27..28ed7a3 100644 --- a/backend/src/main/java/com/example/Piroin/project/domain/user/service/AdminUserService.java +++ b/backend/src/main/java/com/example/Piroin/project/domain/user/service/AdminUserService.java @@ -101,8 +101,8 @@ public UpdateStudentStatusResponse updateStudentWeekStatus( } if (request.getAttendances() != null) { - List attendanceIds = request.getAttendances().stream() - .map(UpdateStudentStatusRequest.AttendanceStatusRequest::getAttendanceId) + List attendanceIds = request.getAttendances().stream() + .map(dto -> dto.getAttendanceId().longValue()) .toList(); Map attendanceMap = attendanceRepository.findAllById(attendanceIds).stream()