Fix: 학과 공지 업데이트 오류 수정, 학과 목록 조회 api 수정#310
Conversation
WalkthroughDeptInfo 기반으로 학과 정보를 전달하도록 경로를 변경하고 DTO/Result에 boolean graduateSupported 필드를 추가했다. NoticeQueryService는 DeptInfo 목록을 사용하도록 변경되었고, 다수의 Dept 스크래퍼 생성자에 LatestPageGraduateNoticeApiClient 의존성이 주입되었다. MediaActingDept 클래스가 추가되었고 관련 테스트가 추가되었다. Changes
Sequence Diagram(s)sequenceDiagram
autonumber
actor Client
participant NoticeController as NoticeController
participant NoticeQueryService as NoticeQueryService
participant DeptRegistry as DeptInfo List
participant DTO as NoticeDepartmentNameResult/Response
Client->>NoticeController: 지원 학과 목록 조회 요청
NoticeController->>NoticeQueryService: lookupSupportedDepartments()
NoticeQueryService->>DeptRegistry: deptInfoList 조회
Note right of DeptRegistry: DeptInfo {name, hostPrefix, korName, graduateSupported}
DeptRegistry-->>NoticeQueryService: List<DeptInfo>
NoticeQueryService->>DTO: NoticeDepartmentNameResult.from(DeptInfo)
DTO-->>NoticeQueryService: Result(..., graduateSupported)
NoticeQueryService-->>NoticeController: List<Result>
NoticeController-->>Client: List<Response(..., graduateSupported))
sequenceDiagram
autonumber
participant Scheduler as Updater/Scheduler
participant DeptScraper as DepartmentDept (각 Dept)
participant UGClient as LatestPageNoticeApiClient
participant GRClient as LatestPageGraduateNoticeApiClient
Scheduler->>DeptScraper: 스크랩 작업 시작
par 학부 공지(동시)
DeptScraper->>UGClient: 최신 학부 공지 요청
UGClient-->>DeptScraper: 학부 공지 데이터 반환
and 대학원 공지(동시)
DeptScraper->>GRClient: 최신 대학원 공지 요청
GRClient-->>DeptScraper: 대학원 공지 데이터 반환
end
DeptScraper-->>Scheduler: 통합된 공지 결과 반환
Possibly related PRs
Poem
Pre-merge checks and finishing touches✅ Passed checks (3 passed)
✨ Finishing touches
🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Actionable comments posted: 1
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
src/main/java/com/kustacks/kuring/worker/update/notice/DepartmentGraduationNoticeUpdater.java (1)
144-156: 파라미터 이름을graduate로 되돌려주세요.위의
saveNewNotices메서드와 동일한 이유로, 이 메서드의 파라미터 이름도graduate로 되돌려야 코드베이스 전체와 일관성을 유지할 수 있습니다.다음 diff를 적용하세요:
- private void synchronizationWithDb(List<CommonNoticeFormatDto> scrapResults, List<Integer> savedArticleIds, DepartmentName departmentNameEnum, boolean important, boolean graduated) { - List<DepartmentNotice> newNotices = noticeUpdateSupport.filteringSoonSaveDepartmentNotices(scrapResults, savedArticleIds, departmentNameEnum, important, graduated); + private void synchronizationWithDb(List<CommonNoticeFormatDto> scrapResults, List<Integer> savedArticleIds, DepartmentName departmentNameEnum, boolean important, boolean graduate) { + List<DepartmentNotice> newNotices = noticeUpdateSupport.filteringSoonSaveDepartmentNotices(scrapResults, savedArticleIds, departmentNameEnum, important, graduate); List<Integer> latestNoticeIds = noticeUpdateSupport.extractDepartmentNoticeIds(scrapResults); List<String> deletedNoticesArticleIds = noticeUpdateSupport.filteringSoonDeleteDepartmentNoticeIds(savedArticleIds, latestNoticeIds); noticeCommandPort.saveAllDepartmentNotices(newNotices); if (!deletedNoticesArticleIds.isEmpty()) { noticeCommandPort.deleteAllByIdsAndDepartment(departmentNameEnum, deletedNoticesArticleIds); } }
🧹 Nitpick comments (3)
src/main/java/com/kustacks/kuring/worker/update/staff/StaffUpdater.java (1)
68-71: 중복 키 충돌 처리가 추가되어 런타임 예외를 방지합니다.
Collectors.toMap에 병합 함수를 추가하여 중복된identifier가 발생할 때IllegalStateException을 방지합니다. 현재 구현은 첫 번째 항목을 유지하는 전략을 사용합니다.선택적으로, 단일 학과 내에서 중복이 발견되면 데이터 품질 문제를 나타낼 수 있으므로 경고 로그를 추가하는 것을 고려해보세요:
private Map<String, StaffDto> convertStaffDtoMap(List<StaffDto> scrapedStaffDtos) { return scrapedStaffDtos.stream() .collect(Collectors.toMap( StaffDto::identifier, staffDto -> staffDto, - (existing, replacement) -> existing)); + (existing, replacement) -> { + log.warn("중복된 교직원 식별자 발견: {}. 첫 번째 항목을 유지합니다.", existing.identifier()); + return existing; + })); }src/main/java/com/kustacks/kuring/user/application/port/in/dto/UserAcademicEventNotificationCommand.java (1)
3-7: 커맨드 객체의 필드 검증을 고려하세요.현재
userToken과enabled필드에 검증 어노테이션이 없습니다. 웹 계층의UserAcademicEventNotificationRequest에서enabled에 대한@NotNull검증이 있지만, 커맨드 객체 자체에도 방어적 프로그래밍 차원에서 검증을 추가하는 것을 권장합니다.다만, 애플리케이션 계층의 커맨드 객체는 웹 계층에서 이미 검증된 데이터를 전달받으므로, 현재 구조도 허용 가능합니다. 프로젝트의 검증 전략에 따라 결정하시면 됩니다.
src/test/java/com/kustacks/kuring/acceptance/UserStep.java (1)
340-347: 미사용 파라미터를 제거하거나 검증에 활용하세요.
expectedEnabled파라미터가 메서드 시그니처에는 있지만, 실제 검증 로직에서는 사용되지 않습니다.두 가지 옵션을 고려하세요:
- 파라미터가 불필요하다면 제거
- 실제로 응답에서 설정된 값을 검증해야 한다면, 검증 로직 추가
현재 응답의
data가null로 검증되고 있어, 설정 값의 실제 변경 여부를 확인할 수 없습니다. 만약 API 응답이 변경된 설정 값을 반환하도록 수정된다면, 이 파라미터를 활용한 검증이 필요할 수 있습니다.
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (56)
src/main/java/com/kustacks/kuring/auth/AuthConfig.java(2 hunks)src/main/java/com/kustacks/kuring/common/dto/ResponseCodeAndMessages.java(1 hunks)src/main/java/com/kustacks/kuring/common/featureflag/KuringFeatures.java(1 hunks)src/main/java/com/kustacks/kuring/config/FeatureFlagConfig.java(2 hunks)src/main/java/com/kustacks/kuring/notice/adapter/in/web/NoticeQueryApiV2.java(2 hunks)src/main/java/com/kustacks/kuring/notice/adapter/in/web/dto/NoticeDepartmentNameResponse.java(1 hunks)src/main/java/com/kustacks/kuring/notice/application/port/in/dto/NoticeDepartmentNameResult.java(1 hunks)src/main/java/com/kustacks/kuring/notice/application/service/NoticeQueryService.java(4 hunks)src/main/java/com/kustacks/kuring/notice/domain/DepartmentName.java(1 hunks)src/main/java/com/kustacks/kuring/user/adapter/in/web/UserCommandApiV2.java(5 hunks)src/main/java/com/kustacks/kuring/user/adapter/in/web/dto/UserAcademicEventNotificationRequest.java(1 hunks)src/main/java/com/kustacks/kuring/user/application/port/in/UserCommandUseCase.java(2 hunks)src/main/java/com/kustacks/kuring/user/application/port/in/dto/UserAcademicEventNotificationCommand.java(1 hunks)src/main/java/com/kustacks/kuring/user/application/service/UserCommandService.java(2 hunks)src/main/java/com/kustacks/kuring/user/domain/User.java(2 hunks)src/main/java/com/kustacks/kuring/worker/scrap/deptinfo/architecture/ArchitectureDept.java(3 hunks)src/main/java/com/kustacks/kuring/worker/scrap/deptinfo/art_design/IndustrialDesignDept.java(3 hunks)src/main/java/com/kustacks/kuring/worker/scrap/deptinfo/art_design/LivingDesignDept.java(3 hunks)src/main/java/com/kustacks/kuring/worker/scrap/deptinfo/art_design/MediaActingDept.java(1 hunks)src/main/java/com/kustacks/kuring/worker/scrap/deptinfo/art_design/MovingImageFilmDept.java(3 hunks)src/main/java/com/kustacks/kuring/worker/scrap/deptinfo/education/EducationalTechnologyDept.java(3 hunks)src/main/java/com/kustacks/kuring/worker/scrap/deptinfo/education/EnglishEducationDept.java(3 hunks)src/main/java/com/kustacks/kuring/worker/scrap/deptinfo/education/PhysicalEducationDept.java(3 hunks)src/main/java/com/kustacks/kuring/worker/scrap/deptinfo/engineering/BiologicalDept.java(3 hunks)src/main/java/com/kustacks/kuring/worker/scrap/deptinfo/engineering/ChemicalDivisionDept.java(3 hunks)src/main/java/com/kustacks/kuring/worker/scrap/deptinfo/engineering/CivilEnvironmentDept.java(3 hunks)src/main/java/com/kustacks/kuring/worker/scrap/deptinfo/engineering/ComputerScienceDept.java(3 hunks)src/main/java/com/kustacks/kuring/worker/scrap/deptinfo/engineering/ElectricalElectronicsDept.java(3 hunks)src/main/java/com/kustacks/kuring/worker/scrap/deptinfo/engineering/IndustrialDept.java(3 hunks)src/main/java/com/kustacks/kuring/worker/scrap/deptinfo/ku_integrated_science/BioMedicalScienceDept.java(3 hunks)src/main/java/com/kustacks/kuring/worker/scrap/deptinfo/ku_integrated_science/CosmeticsDept.java(3 hunks)src/main/java/com/kustacks/kuring/worker/scrap/deptinfo/ku_integrated_science/EnergyDept.java(3 hunks)src/main/java/com/kustacks/kuring/worker/scrap/deptinfo/liberal_art/ChineseDept.java(3 hunks)src/main/java/com/kustacks/kuring/worker/scrap/deptinfo/liberal_art/CultureContentDept.java(3 hunks)src/main/java/com/kustacks/kuring/worker/scrap/deptinfo/liberal_art/EnglishDept.java(3 hunks)src/main/java/com/kustacks/kuring/worker/scrap/deptinfo/liberal_art/GeologyDept.java(3 hunks)src/main/java/com/kustacks/kuring/worker/scrap/deptinfo/liberal_art/HistoryDept.java(3 hunks)src/main/java/com/kustacks/kuring/worker/scrap/deptinfo/liberal_art/KoreanDept.java(3 hunks)src/main/java/com/kustacks/kuring/worker/scrap/deptinfo/liberal_art/MediaCommunicationDept.java(3 hunks)src/main/java/com/kustacks/kuring/worker/scrap/deptinfo/liberal_art/PhilosophyDept.java(3 hunks)src/main/java/com/kustacks/kuring/worker/scrap/deptinfo/real_estate/RealEstateDept.java(3 hunks)src/main/java/com/kustacks/kuring/worker/scrap/deptinfo/sanghuo_biology/AnimalScienceTechnologyDept.java(3 hunks)src/main/java/com/kustacks/kuring/worker/scrap/deptinfo/sanghuo_biology/BiologicalSciencesDept.java(3 hunks)src/main/java/com/kustacks/kuring/worker/scrap/deptinfo/sanghuo_biology/FoodMarketingSafetyDept.java(3 hunks)src/main/java/com/kustacks/kuring/worker/scrap/deptinfo/science/MathematicsDept.java(3 hunks)src/main/java/com/kustacks/kuring/worker/scrap/deptinfo/science/PhysicsDept.java(3 hunks)src/main/java/com/kustacks/kuring/worker/scrap/deptinfo/social_science/InternationalTradeDept.java(3 hunks)src/main/java/com/kustacks/kuring/worker/scrap/deptinfo/social_science/PoliticalScienceDept.java(3 hunks)src/main/java/com/kustacks/kuring/worker/scrap/deptinfo/social_science/PublicAdministrationDept.java(3 hunks)src/main/java/com/kustacks/kuring/worker/update/notice/DepartmentGraduationNoticeUpdater.java(2 hunks)src/main/java/com/kustacks/kuring/worker/update/staff/StaffUpdater.java(2 hunks)src/main/resources/db/migration/V250918__Add_academic_event_notification_to_user.sql(1 hunks)src/test/java/com/kustacks/kuring/acceptance/UserAcceptanceTest.java(2 hunks)src/test/java/com/kustacks/kuring/acceptance/UserStep.java(2 hunks)src/test/java/com/kustacks/kuring/user/domain/UserTest.java(2 hunks)src/test/java/com/kustacks/kuring/worker/update/notice/DepartmentNoticeUpdaterTest.java(2 hunks)
🧰 Additional context used
🧠 Learnings (2)
📚 Learning: 2025-09-23T19:59:11.021Z
Learnt from: rlagkswn00
PR: ku-ring/ku-ring-backend-web#305
File: src/main/java/com/kustacks/kuring/user/application/service/UserCommandService.java:393-397
Timestamp: 2025-09-23T19:59:11.021Z
Learning: User 도메인 클래스에서 academicEventNotificationEnabled 필드는 선언부에서 = Boolean.TRUE로 기본값이 설정되어 있어, 신규 사용자 생성 시 자동으로 true 값을 가집니다.
Applied to files:
src/main/java/com/kustacks/kuring/user/domain/User.javasrc/main/resources/db/migration/V250918__Add_academic_event_notification_to_user.sqlsrc/main/java/com/kustacks/kuring/user/adapter/in/web/dto/UserAcademicEventNotificationRequest.java
📚 Learning: 2025-09-23T19:59:11.021Z
Learnt from: rlagkswn00
PR: ku-ring/ku-ring-backend-web#305
File: src/main/java/com/kustacks/kuring/user/application/service/UserCommandService.java:393-397
Timestamp: 2025-09-23T19:59:11.021Z
Learning: User 도메인 클래스에서 academicEventNotificationEnabled 필드는 Boolean 타입으로 선언되어 있으며, 생성자에서 명시적으로 초기화하지 않아 기본값이 null입니다. isAcademicEventNotificationEnabled() 메서드는 Boolean.TRUE.equals()를 사용하여 null일 때 false를 반환합니다.
Applied to files:
src/main/java/com/kustacks/kuring/user/domain/User.javasrc/main/java/com/kustacks/kuring/user/adapter/in/web/dto/UserAcademicEventNotificationRequest.java
🧬 Code graph analysis (1)
src/test/java/com/kustacks/kuring/acceptance/UserAcceptanceTest.java (2)
src/test/java/com/kustacks/kuring/acceptance/UserStep.java (1)
UserStep(23-349)src/test/java/com/kustacks/kuring/user/domain/UserTest.java (1)
DisplayName(16-221)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
- GitHub Check: Build and analyze
🔇 Additional comments (53)
src/main/java/com/kustacks/kuring/auth/AuthConfig.java (1)
7-12: 와일드카드 대신 명시적 import로 정리하신 점 좋습니다.
필요한 의존성만 드러나서 클래스 간 관계 파악이 더 명확해졌고, 향후 핸들러 추가/삭제 시 충돌 위험도 줄어듭니다.src/main/java/com/kustacks/kuring/worker/scrap/deptinfo/sanghuo_biology/FoodMarketingSafetyDept.java (1)
4-4: 대학원 공지 업데이트 문제를 올바르게 수정했습니다.
LatestPageGraduateNoticeApiClient의존성 주입이 정확하게 추가되었습니다. Line 33에서noticeGraduationInfo가 설정되어 있어 이 학과가 대학원 공지를 지원함을 확인할 수 있으며, 바로 다음 줄에서 필요한 클라이언트를 주입하는 것은 논리적으로 적절합니다.Also applies to: 21-22, 34-34
src/main/java/com/kustacks/kuring/worker/scrap/deptinfo/liberal_art/PhilosophyDept.java (3)
4-4: LGTM!대학원 공지 API 클라이언트 의존성 주입을 위한 필수 import가 올바르게 추가되었습니다.
18-23: LGTM!생성자에
LatestPageGraduateNoticeApiClient파라미터가 올바르게 추가되었습니다. 의존성 주입 패턴을 따르며, 대학원 공지 스크래핑 기능을 활성화하기 위한 변경사항입니다.
34-34: LGTM!주입받은
latestPageGraduateNoticeApiClient가 필드에 올바르게 할당되었습니다. 이를 통해 철학과의 대학원 공지 스크래핑이 정상적으로 동작할 수 있습니다.src/main/java/com/kustacks/kuring/worker/scrap/deptinfo/sanghuo_biology/BiologicalSciencesDept.java (2)
35-35: 필드 할당이 올바르게 구현되었습니다.
latestPageGraduateNoticeApiClient필드 할당이 다른 클라이언트 할당(26-28번 줄)과 동일한 패턴을 따르고 있으며, 대학원 공지 정보 설정(34번 줄) 이후에 적절하게 배치되었습니다.
4-4: 의존성 주입이 올바르게 적용되었습니다.
DeptInfo에 선언된latestPageGraduateNoticeApiClient를 상속받아 주입하며, 다른 부서 클래스와 일관된 패턴입니다.src/main/java/com/kustacks/kuring/notice/adapter/in/web/NoticeQueryApiV2.java (1)
11-15: LGTM! Import 명시성 개선wildcard import를 명시적 import로 변경하여 코드의 가독성과 명확성을 향상시켰습니다. Java 모범 사례에 부합하는 변경사항입니다.
Also applies to: 38-40
src/main/java/com/kustacks/kuring/notice/domain/DepartmentName.java (2)
80-80: LGTM! 누락된 학과 추가'매체연기학과' 추가는 PR 목표와 일치하며 올바르게 구현되었습니다.
88-88: EDUCATION enum korName 변경 영향 검토 요청
- 코드 내 “교육학과” 참조는 모두 제거되어 “교직과”만 사용 중입니다.
- 변경이 DB에 저장된 기존 데이터와 API 소비자 계약에 미치는 영향을 확인해 주세요.
src/main/java/com/kustacks/kuring/notice/application/service/NoticeQueryService.java (2)
21-21: LGTM! DeptInfo 기반 리팩토링
DepartmentName에서DeptInfo로의 전환은 대학원 지원 여부(graduateSupported)를 제공하기 위한 필수적인 변경입니다. 생성자 의존성 주입을 통해 적절하게 구현되었습니다.Also applies to: 42-42, 44-55, 82-82
186-191: 필터링 로직 검증 완료
스크립트 실행 결과 COMM_DESIGN이 정상적으로 제외됨을 확인했습니다.src/main/java/com/kustacks/kuring/notice/adapter/in/web/dto/NoticeDepartmentNameResponse.java (1)
8-9: LGTM! graduateSupported 필드 추가학과 목록 API 응답에
graduateSupported필드가 올바르게 추가되었습니다. 이는 PR 목표인 대학원 지원 여부 표시 기능과 일치합니다. 팩토리 메서드도 적절하게 업데이트되었습니다.Also applies to: 15-16
src/main/java/com/kustacks/kuring/notice/application/port/in/dto/NoticeDepartmentNameResult.java (1)
4-4: LGTM! DeptInfo 기반 팩토리 메서드로 전환
NoticeDepartmentNameResult가DeptInfo를 받도록 변경되어 대학원 지원 여부(graduateSupported)를deptInfo.isSupportGraduateScrap()을 통해 올바르게 판단합니다.팩토리 메서드 시그니처 변경은 breaking change이지만,
NoticeQueryService에서 이미 새로운 시그니처를 사용하도록 업데이트되었습니다.Also applies to: 9-14
src/main/java/com/kustacks/kuring/worker/scrap/deptinfo/art_design/MediaActingDept.java (1)
17-31: MediaActingDept는 대학원 공지를 지원하지 않습니다
MEDIA_ACTING에 대한isSupportGraduateScrap()오버라이드가 없으며, ContemporaryArtDept·CommunicationDesignDept·ApparelDesignDept 등 다른 ArtDesignCollege 학과들도 동일하게 3개 파라미터만 사용합니다. 변경 불필요합니다.Likely an incorrect or invalid review comment.
src/main/java/com/kustacks/kuring/worker/scrap/deptinfo/liberal_art/ChineseDept.java (1)
18-35: LGTM!대학원 공지 API 클라이언트 의존성이 올바르게 주입되었습니다. PR 목표에서 언급된 대로,
noticeGraduationInfo가 설정된 학과에LatestPageGraduateNoticeApiClient를 주입하여 대학원 공지 업데이트 오류를 수정합니다.src/main/java/com/kustacks/kuring/worker/scrap/deptinfo/art_design/LivingDesignDept.java (1)
19-36: LGTM!대학원 공지 API 클라이언트 의존성이 올바르게 주입되었습니다. 생활디자인학과의 대학원 공지 스크랩 기능이 정상적으로 작동할 수 있도록 필요한 의존성이 추가되었습니다.
src/main/java/com/kustacks/kuring/worker/scrap/deptinfo/liberal_art/CultureContentDept.java (1)
18-35: LGTM!대학원 공지 API 클라이언트 의존성이 올바르게 주입되었습니다. 문화콘텐츠학과의 대학원 공지 업데이트 기능이 정상적으로 작동하도록 수정되었습니다.
src/main/java/com/kustacks/kuring/worker/scrap/deptinfo/art_design/MovingImageFilmDept.java (1)
18-35: LGTM!대학원 공지 API 클라이언트 의존성이 올바르게 주입되었습니다. 영상영화학과의 대학원 공지 스크랩이 정상적으로 동작할 수 있도록 필요한 의존성이 추가되었습니다.
src/main/java/com/kustacks/kuring/worker/scrap/deptinfo/art_design/IndustrialDesignDept.java (1)
18-35: LGTM!대학원 공지 API 클라이언트 의존성이 올바르게 주입되었습니다. 산업디자인학과의 대학원 공지 업데이트 기능을 위한 필수 의존성이 추가되었습니다.
src/main/java/com/kustacks/kuring/worker/scrap/deptinfo/education/EducationalTechnologyDept.java (1)
18-35: LGTM!대학원 공지 API 클라이언트 의존성이 올바르게 주입되었습니다. 교육공학과의 대학원 공지 스크랩이 정상적으로 작동하도록 필요한 의존성이 추가되었습니다.
src/main/java/com/kustacks/kuring/worker/scrap/deptinfo/real_estate/RealEstateDept.java (1)
18-33: LGTM!대학원 공지 API 클라이언트 의존성이 올바르게 주입되었습니다. 부동산학과의 대학원 공지 업데이트 기능이 정상적으로 작동하도록 수정되었습니다.
src/main/java/com/kustacks/kuring/worker/scrap/deptinfo/social_science/PublicAdministrationDept.java (1)
18-35: LatestPageGraduateNoticeApiClient 미주입 학과 클래스 확인
아래 명령어로noticeGraduationInfo를 초기화하지만LatestPageGraduateNoticeApiClient의존성이 없는 클래스 목록을 확인해 주세요:rg -l "noticeGraduationInfo" --type java -g '*Dept.java' | xargs grep -L "LatestPageGraduateNoticeApiClient"src/main/java/com/kustacks/kuring/worker/scrap/deptinfo/engineering/ElectricalElectronicsDept.java (1)
4-4: LGTM! 대학원 공지 API 클라이언트 의존성 주입이 올바르게 구현되었습니다.PR 목표에서 설명한 대로, 대학원 공지를 지원하는 학과에
LatestPageGraduateNoticeApiClient의존성을 주입하여scrapGraduateAllPageHtml()메서드가 정상적으로 동작하도록 수정되었습니다.Also applies to: 21-22, 34-34
src/main/java/com/kustacks/kuring/worker/scrap/deptinfo/liberal_art/MediaCommunicationDept.java (1)
4-4: LGTM! 의존성 주입이 올바르게 적용되었습니다.다른 학과들과 동일한 패턴으로
LatestPageGraduateNoticeApiClient가 주입되어 대학원 공지 스크래핑을 지원합니다.Also applies to: 21-22, 34-34
src/main/java/com/kustacks/kuring/worker/scrap/deptinfo/engineering/ComputerScienceDept.java (1)
4-4: LGTM! 대학원 공지 클라이언트 의존성이 정상적으로 주입되었습니다.Also applies to: 21-22, 34-34
src/main/java/com/kustacks/kuring/worker/scrap/deptinfo/science/PhysicsDept.java (1)
4-4: LGTM! 의존성 주입이 올바르게 구현되었습니다.Also applies to: 20-21, 33-33
src/main/java/com/kustacks/kuring/worker/scrap/deptinfo/engineering/BiologicalDept.java (1)
4-4: LGTM! 대학원 공지 API 클라이언트가 정상적으로 주입되었습니다.Also applies to: 21-22, 34-34
src/main/java/com/kustacks/kuring/worker/scrap/deptinfo/social_science/PoliticalScienceDept.java (1)
4-4: LGTM! 의존성 주입이 일관되게 적용되었습니다.Also applies to: 21-22, 34-34
src/main/java/com/kustacks/kuring/worker/scrap/deptinfo/ku_integrated_science/BioMedicalScienceDept.java (1)
4-4: LGTM! 대학원 공지 클라이언트 의존성이 정상적으로 주입되었습니다.Also applies to: 21-22, 34-34
src/main/java/com/kustacks/kuring/worker/scrap/deptinfo/social_science/InternationalTradeDept.java (1)
4-4: LGTM! 의존성 주입이 올바르게 구현되었습니다.모든 대학원 공지 지원 학과에
LatestPageGraduateNoticeApiClient가 일관되게 주입되어 PR의 목표인 대학원 공지 업데이트 오류 수정이 완료되었습니다.Also applies to: 21-22, 34-34
src/main/java/com/kustacks/kuring/worker/scrap/deptinfo/engineering/ChemicalDivisionDept.java (1)
4-4: 대학원 공지 API 클라이언트 주입이 올바르게 추가되었습니다.화학공학부가 대학원 공지를 지원하므로 (line 33의 noticeGraduationInfo 확인), LatestPageGraduateNoticeApiClient의 주입이 필요하며 올바르게 구현되었습니다.
Also applies to: 22-22, 34-34
src/main/java/com/kustacks/kuring/worker/scrap/deptinfo/ku_integrated_science/CosmeticsDept.java (1)
4-4: 대학원 공지 API 클라이언트 주입이 올바르게 추가되었습니다.화장품공학과가 대학원 공지를 지원하므로 (line 33의 noticeGraduationInfo 확인), LatestPageGraduateNoticeApiClient의 주입이 필요하며 올바르게 구현되었습니다.
Also applies to: 22-22, 34-34
src/main/java/com/kustacks/kuring/worker/scrap/deptinfo/liberal_art/KoreanDept.java (1)
4-4: 대학원 공지 API 클라이언트 주입이 올바르게 추가되었습니다.국어국문학과가 대학원 공지를 지원하므로 (line 33의 noticeGraduationInfo 확인), LatestPageGraduateNoticeApiClient의 주입이 필요하며 올바르게 구현되었습니다.
Also applies to: 22-22, 34-34
src/main/java/com/kustacks/kuring/worker/scrap/deptinfo/liberal_art/HistoryDept.java (1)
4-4: 대학원 공지 API 클라이언트 주입이 올바르게 추가되었습니다.사학과가 대학원 공지를 지원하므로 (line 33의 noticeGraduationInfo 확인), LatestPageGraduateNoticeApiClient의 주입이 필요하며 올바르게 구현되었습니다.
Also applies to: 22-22, 34-34
src/main/java/com/kustacks/kuring/worker/scrap/deptinfo/science/MathematicsDept.java (1)
4-4: 대학원 공지 API 클라이언트 주입이 올바르게 추가되었습니다.수학과가 대학원 공지를 지원하므로 (line 33의 noticeGraduationInfo 확인), LatestPageGraduateNoticeApiClient의 주입이 필요하며 올바르게 구현되었습니다.
Also applies to: 22-22, 34-34
src/main/java/com/kustacks/kuring/worker/scrap/deptinfo/liberal_art/EnglishDept.java (1)
4-4: 대학원 공지 API 클라이언트 주입이 올바르게 추가되었습니다.영어영문학과가 대학원 공지를 지원하므로 (line 33의 noticeGraduationInfo 확인), LatestPageGraduateNoticeApiClient의 주입이 필요하며 올바르게 구현되었습니다.
Also applies to: 22-22, 34-34
src/main/java/com/kustacks/kuring/worker/scrap/deptinfo/education/PhysicalEducationDept.java (1)
4-4: 대학원 공지 API 클라이언트 주입이 모든noticeGraduationInfo보유 학과에 적용되었습니다.
누락된 클래스가 없습니다.src/main/resources/db/migration/V250918__Add_academic_event_notification_to_user.sql (1)
1-3: LGTM!마이그레이션 스크립트가 올바르게 작성되었습니다.
DEFAULT TRUE설정은 기존 사용자와 신규 사용자 모두에게 학사일정 알림이 활성화되도록 하며, 도메인 모델의 기본값과 일치합니다.src/main/java/com/kustacks/kuring/common/featureflag/KuringFeatures.java (1)
11-12: LGTM!새로운 피처 플래그가 기존 패턴을 따라 올바르게 추가되었습니다. 학사일정 알림 기능을 위한
NOTIFY_ACADEMIC_EVENT플래그가 적절하게 정의되었습니다.src/test/java/com/kustacks/kuring/worker/update/notice/DepartmentNoticeUpdaterTest.java (2)
67-67: 코드 스타일 개선for문 주변에 공백이 추가되어 가독성이 향상되었습니다.
83-97: updateAll 메서드 테스트 예상 공지 개수 확인
updateAll이 REAL_ESTATE 학과를 제외해 총 3720건으로 감소했는데, 기존 update 테스트(3780건) 대비 60건 차이가 의도된 변경인지 확인해 주세요.src/main/java/com/kustacks/kuring/user/application/service/UserCommandService.java (1)
86-90: LGTM!학사일정 알림 설정 업데이트 메서드가 기존 패턴을 따라 올바르게 구현되었습니다. 사용자 토큰으로 사용자를 찾고 도메인 메서드를 호출하여 알림 설정을 업데이트합니다.
src/test/java/com/kustacks/kuring/acceptance/UserAcceptanceTest.java (1)
508-525: LGTM!학사일정 알림 토글 인수 테스트가 올바르게 작성되었습니다. true→false, false→true 두 방향의 토글을 모두 검증하여 기능이 제대로 동작하는지 확인합니다.
src/test/java/com/kustacks/kuring/user/domain/UserTest.java (2)
12-14: 코드 스타일 개선와일드카드 import를 명시적 import로 변경하여 의존성을 명확하게 표현했습니다.
189-208: LGTM!학사일정 알림 상태 변경에 대한 도메인 로직 테스트가 올바르게 작성되었습니다. false와 true로의 전환을 모두 검증하여 도메인 메서드가 의도한 대로 동작하는지 확인합니다.
src/main/java/com/kustacks/kuring/common/dto/ResponseCodeAndMessages.java (1)
61-61: LGTM!학사일정 알림 설정 변경에 대한 응답 코드가 올바르게 추가되었습니다. HTTP 200 OK 상태 코드와 명확한 한글 메시지가 적절하게 정의되어 있습니다.
src/main/java/com/kustacks/kuring/config/FeatureFlagConfig.java (1)
37-39: RemotePropertyResolver Bean 정의 확인됨
RemotePropertyResolverConfig에서 프로덕션/로컬 환경용kuringRemotePropertyResolver와 테스트/개발 환경용mockRemotePropertyResolver빈이 정상 등록되었습니다.src/main/java/com/kustacks/kuring/user/application/port/in/UserCommandUseCase.java (1)
3-3: LGTM!새로운 use case 메서드가 적절하게 추가되었습니다. 인터페이스 설계가 명확하고 일관성 있습니다.
Also applies to: 20-20
src/main/java/com/kustacks/kuring/user/adapter/in/web/dto/UserAcademicEventNotificationRequest.java (1)
5-8: LGTM!DTO 설계가 깔끔하고 적절합니다.
@NotNull검증이 올바르게 적용되어 있습니다.src/main/java/com/kustacks/kuring/user/domain/User.java (2)
64-66: LGTM!필드 선언이 적절합니다.
nullable = false제약조건과 기본값Boolean.TRUE설정이 일관성 있게 구성되어 있습니다.Based on learnings
181-183: updateAcademicNotificationEnabled 메서드에 null 방어 로직 추가
Boolean enabled이 null일 경우 예외를 던지거나 기본값(false)으로 처리하도록 수정하세요.⛔ Skipped due to learnings
Learnt from: rlagkswn00 PR: ku-ring/ku-ring-backend-web#305 File: src/main/java/com/kustacks/kuring/user/application/service/UserCommandService.java:393-397 Timestamp: 2025-09-23T19:59:11.021Z Learning: User 도메인 클래스에서 academicEventNotificationEnabled 필드는 Boolean 타입으로 선언되어 있으며, 생성자에서 명시적으로 초기화하지 않아 기본값이 null입니다. isAcademicEventNotificationEnabled() 메서드는 Boolean.TRUE.equals()를 사용하여 null일 때 false를 반환합니다.Learnt from: rlagkswn00 PR: ku-ring/ku-ring-backend-web#305 File: src/main/java/com/kustacks/kuring/user/application/service/UserCommandService.java:393-397 Timestamp: 2025-09-23T19:59:11.021Z Learning: User 도메인 클래스에서 academicEventNotificationEnabled 필드는 선언부에서 = Boolean.TRUE로 기본값이 설정되어 있어, 신규 사용자 생성 시 자동으로 true 값을 가집니다.src/main/java/com/kustacks/kuring/user/adapter/in/web/UserCommandApiV2.java (1)
10-10: LGTM!새로운 엔드포인트 구현이 기존 패턴과 일관성 있게 작성되었습니다.
@Valid검증, 적절한 HTTP 메서드(PATCH), 그리고 명확한 API 문서화가 잘 되어 있습니다.Also applies to: 20-20, 47-47, 93-102
| private List<DepartmentNotice> saveNewNotices(List<CommonNoticeFormatDto> scrapResults, List<Integer> savedArticleIds, DepartmentName departmentNameEnum, boolean important, boolean graduated) { | ||
| List<DepartmentNotice> newNotices = noticeUpdateSupport.filteringSoonSaveDepartmentNotices(scrapResults, savedArticleIds, departmentNameEnum, important, graduated); | ||
| noticeCommandPort.saveAllDepartmentNotices(newNotices); | ||
| return newNotices; | ||
| } |
There was a problem hiding this comment.
파라미터 이름을 graduate로 되돌려주세요.
파라미터 이름을 graduate에서 graduated로 변경했지만, 이는 다음과 같은 문제가 있습니다:
- 같은 파일 내 다른 메서드들(
scrapGraduateLatestPageHtml,getGraduateDeptInfoList,isSupportGraduateScrap)은 모두graduate를 사용하여 일관성이 깨집니다. - 영어 표현에서 "graduate notice"(대학원 공지)가 올바른 표현이며, "graduated notice"는 부적절합니다.
다음 diff를 적용하여 원래의 graduate로 되돌려주세요:
- private List<DepartmentNotice> saveNewNotices(List<CommonNoticeFormatDto> scrapResults, List<Integer> savedArticleIds, DepartmentName departmentNameEnum, boolean important, boolean graduated) {
- List<DepartmentNotice> newNotices = noticeUpdateSupport.filteringSoonSaveDepartmentNotices(scrapResults, savedArticleIds, departmentNameEnum, important, graduated);
+ private List<DepartmentNotice> saveNewNotices(List<CommonNoticeFormatDto> scrapResults, List<Integer> savedArticleIds, DepartmentName departmentNameEnum, boolean important, boolean graduate) {
+ List<DepartmentNotice> newNotices = noticeUpdateSupport.filteringSoonSaveDepartmentNotices(scrapResults, savedArticleIds, departmentNameEnum, important, graduate);
noticeCommandPort.saveAllDepartmentNotices(newNotices);
return newNotices;
}📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| private List<DepartmentNotice> saveNewNotices(List<CommonNoticeFormatDto> scrapResults, List<Integer> savedArticleIds, DepartmentName departmentNameEnum, boolean important, boolean graduated) { | |
| List<DepartmentNotice> newNotices = noticeUpdateSupport.filteringSoonSaveDepartmentNotices(scrapResults, savedArticleIds, departmentNameEnum, important, graduated); | |
| noticeCommandPort.saveAllDepartmentNotices(newNotices); | |
| return newNotices; | |
| } | |
| private List<DepartmentNotice> saveNewNotices( | |
| List<CommonNoticeFormatDto> scrapResults, | |
| List<Integer> savedArticleIds, | |
| DepartmentName departmentNameEnum, | |
| boolean important, | |
| boolean graduate | |
| ) { | |
| List<DepartmentNotice> newNotices = | |
| noticeUpdateSupport.filteringSoonSaveDepartmentNotices( | |
| scrapResults, | |
| savedArticleIds, | |
| departmentNameEnum, | |
| important, | |
| graduate | |
| ); | |
| noticeCommandPort.saveAllDepartmentNotices(newNotices); | |
| return newNotices; | |
| } |
🤖 Prompt for AI Agents
In
src/main/java/com/kustacks/kuring/worker/update/notice/DepartmentGraduationNoticeUpdater.java
around lines 115 to 119, the method parameter name was changed from graduate to
graduated; change it back to graduate and update any references in this method
body and all local calls in this file to use the restored name so it matches
other methods (scrapGraduateLatestPageHtml, getGraduateDeptInfoList,
isSupportGraduateScrap) and uses the correct term "graduate" for graduate
notices.
54d46b1 to
e880cbc
Compare
zbqmgldjfh
left a comment
There was a problem hiding this comment.
좋습니다~ 한군데 정도만 import 수정해주시면 좋을것 같아요~
| private List<NoticeDepartmentNameResult> convertDepartmentNameDtos(List<DepartmentName> departmentNames) { | ||
| return departmentNames.stream() | ||
| .filter(dn -> !dn.equals(DepartmentName.COMM_DESIGN)) | ||
| private List<NoticeDepartmentNameResult> convertDepartmentNameDtos(List<DeptInfo> deptInfos) { |
There was a problem hiding this comment.
(질문) DepartmentName 에서 DeptInfo쪽으로 바뀐 이유가 졸업여부 정보 떄문인가요??
There was a problem hiding this comment.
넵 DepartmentName은 graduated 필드가 없어서 여기에 새로 추가하는거보다 원래 있던 DeptInfo의 isSupportGraduateScrap()를 쓰는게 나을 것 같아서 DeptInfo로 바꿨습니다!
| import java.util.Objects; | ||
| import java.util.Optional; | ||
| import java.util.Set; | ||
| import java.util.*; |
There was a problem hiding this comment.
여러게 import시 *로 한번에 바꿔버리는 옵션을 꺼주세요~ 팀원들 입장에서 util.*로 보이면 뭐를 가져다 쓰는지 import만 보고 확인이 어려워져요!
There was a problem hiding this comment.
Actionable comments posted: 0
🧹 Nitpick comments (1)
src/test/java/com/kustacks/kuring/acceptance/CategoryAcceptanceTest.java (1)
15-22: 명시적 import 사용으로 코드 가독성 개선와일드카드 import를 명시적 import로 변경한 것은 좋은 개선입니다. 의존성이 명확해지고 코드 가독성이 향상됩니다.
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (1)
src/test/java/com/kustacks/kuring/acceptance/CategoryAcceptanceTest.java(2 hunks)
🧰 Additional context used
🧬 Code graph analysis (1)
src/test/java/com/kustacks/kuring/acceptance/CategoryAcceptanceTest.java (1)
src/test/java/com/kustacks/kuring/acceptance/CategoryStep.java (1)
CategoryStep(14-82)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
- GitHub Check: Build and analyze
🔇 Additional comments (1)
src/test/java/com/kustacks/kuring/acceptance/CategoryAcceptanceTest.java (1)
63-63: 학과 개수 및 신규 학과 검증 필요
- 실제 시스템에 등록된 학과가 63개인지 수동 확인
- 응답에 ‘매체연기학과’가 포함되는지 테스트에 명시적으로 검증 추가 고려
|
| EDU_TECH("education_technology", "edutech", "교육공학과"), | ||
| ENGLISH_EDU("english_education", "englishedu", "영어교육과"), | ||
| EDUCATION("education", "edu", "교육학과"), | ||
| EDUCATION("education", "edu", "교직과"), |
There was a problem hiding this comment.
오잉 이거 한글명 교직과가 맞나유??
edu.konkuk.ac.kr들어가보니 "교육학과"로 나와서유!
* Feat: 컴퓨터공학부 대학원 공지 Scrap 추가 (#291) * DepartmentName에 COMPUTER_GRADUATE 추가 * ComputerScienceGraduateDept 구현 * [feat]: urlPrefix 구현 * [feat]: urlPrefix 적용 * [test]: ComputerScienceGraduateDeptTest 구현 * [refactor]: GraduateDeptInfoTest로 이동 * [feat]: isGrad 필드 추가 * [feat]: isGrad 적용 * [feat]: is_grad 필드 추가 flyway 적용 * [refactor]: getUrlPrefix -> getHostPrefix로 수정 * [refactor]: urlPrefix 삭제 * [feat]: noticeGraudationInfo 추가 * [refactor]: ComputerScienceGraduateDept 삭제 * [refactor]: isGrad 적용 * [refactor]: GraduateDeptInfoTest 개행 추가, TestFileLoader 적용 * [refactor]: isGrad -> graduate로 필드명 수정 * [refactor]: graduate 필드 Null 허용으로 수정 * [refactor]: getter 필드 위에 지정 * [refactor]: setter -> 비즈니스 함수로 수정 * [refactor]: 대학원/학사 DepartmentNoticeUpdater 분리 * [refactor]: 개행처리 * [refactor]: DepartmentNoticeScrapResult 삭제 * [refactor]: LatestPageNoticeApiClient 분리 * [refactor]: creatUrl/scrapHtml 분리 * [refactor]: graduate로 필드 수정 * [refactor]: latestPageGraduateNoticeApiClient 사용 * [refactor]: graduate -> graduated로 이름 수 * [refactor]: 일반 notice는 graduated 필드에 null로 저장 * [refactor]: getGraduated() 오타 수정 * [refactor]: deptInfo.isSupportGraduateScrap() 구현 - 대학원 과정을 지원 안하는 DeptInfo 방어 로직 * [refactor]: ? 개수 수정 * [refactor]: 일반 공지 graduated null로 반환 테스트 추가 * [refactor]: 컨트롤러 graduated 파라미터 required=false로 설정 * [refactor]: 공통 로직 getGraduateDeptInfoList 메서드 추출 * [feat]: noticeGraduationInfo 추가 * [feat]: Notice 관련 테스트에 graduated 적용 * [fix]: noticeGraduationInfo 오타 수정 * Feat/cors setting * feat(AuthConfig): CORS 설정 추가 * feat(AuthConfig): CORS 설정 추가 * feat(Report): reporterId로 필드명 변경 * feat(AdminQueryService): 조회시 Page구현체 사용하도록 변경 * Feat: 유저 학사일정 알림 설정 관련 기본 설정 추가 (#302) * feat: 학사일정 알림 ON/OFF 컬럼 추가 Flyway 쿼리문 작성 * feat: 유저 엔티티에 학사일정 알림 ON/OFF 필드 추가 * feat: 학사일정 알림 FeatureFlag 추가 * fix: 불피요 Getter 삭제 * fix: 학사일정 알림 ON/OFF 컬럼 추가 시 불필요 쿼리문 제거 * Feat: 학사일정 알림 설정 API 추가 (#303) * feat: 학사일정 알림 ON/OFF 컬럼 추가 Flyway 쿼리문 작성 * feat: 유저 엔티티에 학사일정 알림 ON/OFF 필드 추가 * feat: 학사일정 알림 FeatureFlag 추가 * fix: 불피요 Getter 삭제 * fix: 학사일정 알림 ON/OFF 컬럼 추가 시 불필요 쿼리문 제거 * feat: 학사일정 알림 토글 API 엔드포인트 및 Response Dto추가 * feat: 학사일정 알림 성공 메시지 추가 * feat: 학사일정 알림 토글 UseCase 추가 * feat: 학사일정 알림 토글 서비스 로직 추가 * feat: 학사일정 토글 도메인 테스트 추가 * feat: 학사일정 토글 인수 테스트 추가 * fix: FeatureFlagConfig Remote 설정 * fix: toggleAcademicEventNotification 메서드명 변경 -> updateUserAcademicEventNotification * fix: 불필요 반환 객체 제거(result, response) * fix: 학사일정 알림 변경 요청 시 설정값 받도록 수정 * fix: 학사일정 알림 설정 도메인 로직수정 * fix: 유저 인수테스트 및 테스트 수정 * fix: @NotNull javax -> jakarta 임포트 수정 * fix: 교직원 스크랩 DTO변환간 중복 Key 문제 해결 * fix: 불필요 로깅 삭제 * fix: 불필요 주석 삭제 * Feat: 학사일정 알림 스케쥴링 로직 추가 (#305) * version 2.15.3 (#304) * Feat: 컴퓨터공학부 대학원 공지 Scrap 추가 (#291) * DepartmentName에 COMPUTER_GRADUATE 추가 * ComputerScienceGraduateDept 구현 * [feat]: urlPrefix 구현 * [feat]: urlPrefix 적용 * [test]: ComputerScienceGraduateDeptTest 구현 * [refactor]: GraduateDeptInfoTest로 이동 * [feat]: isGrad 필드 추가 * [feat]: isGrad 적용 * [feat]: is_grad 필드 추가 flyway 적용 * [refactor]: getUrlPrefix -> getHostPrefix로 수정 * [refactor]: urlPrefix 삭제 * [feat]: noticeGraudationInfo 추가 * [refactor]: ComputerScienceGraduateDept 삭제 * [refactor]: isGrad 적용 * [refactor]: GraduateDeptInfoTest 개행 추가, TestFileLoader 적용 * [refactor]: isGrad -> graduate로 필드명 수정 * [refactor]: graduate 필드 Null 허용으로 수정 * [refactor]: getter 필드 위에 지정 * [refactor]: setter -> 비즈니스 함수로 수정 * [refactor]: 대학원/학사 DepartmentNoticeUpdater 분리 * [refactor]: 개행처리 * [refactor]: DepartmentNoticeScrapResult 삭제 * [refactor]: LatestPageNoticeApiClient 분리 * [refactor]: creatUrl/scrapHtml 분리 * [refactor]: graduate로 필드 수정 * [refactor]: latestPageGraduateNoticeApiClient 사용 * [refactor]: graduate -> graduated로 이름 수 * [refactor]: 일반 notice는 graduated 필드에 null로 저장 * [refactor]: getGraduated() 오타 수정 * [refactor]: deptInfo.isSupportGraduateScrap() 구현 - 대학원 과정을 지원 안하는 DeptInfo 방어 로직 * [refactor]: ? 개수 수정 * [refactor]: 일반 공지 graduated null로 반환 테스트 추가 * [refactor]: 컨트롤러 graduated 파라미터 required=false로 설정 * [refactor]: 공통 로직 getGraduateDeptInfoList 메서드 추출 * [feat]: noticeGraduationInfo 추가 * [feat]: Notice 관련 테스트에 graduated 적용 * [fix]: noticeGraduationInfo 오타 수정 * Feat/cors setting * feat(AuthConfig): CORS 설정 추가 * feat(AuthConfig): CORS 설정 추가 * feat(Report): reporterId로 필드명 변경 * feat(AdminQueryService): 조회시 Page구현체 사용하도록 변경 * Feat: 유저 학사일정 알림 설정 관련 기본 설정 추가 (#302) * feat: 학사일정 알림 ON/OFF 컬럼 추가 Flyway 쿼리문 작성 * feat: 유저 엔티티에 학사일정 알림 ON/OFF 필드 추가 * feat: 학사일정 알림 FeatureFlag 추가 * fix: 불피요 Getter 삭제 * fix: 학사일정 알림 ON/OFF 컬럼 추가 시 불필요 쿼리문 제거 * Feat: 학사일정 알림 설정 API 추가 (#303) * feat: 학사일정 알림 ON/OFF 컬럼 추가 Flyway 쿼리문 작성 * feat: 유저 엔티티에 학사일정 알림 ON/OFF 필드 추가 * feat: 학사일정 알림 FeatureFlag 추가 * fix: 불피요 Getter 삭제 * fix: 학사일정 알림 ON/OFF 컬럼 추가 시 불필요 쿼리문 제거 * feat: 학사일정 알림 토글 API 엔드포인트 및 Response Dto추가 * feat: 학사일정 알림 성공 메시지 추가 * feat: 학사일정 알림 토글 UseCase 추가 * feat: 학사일정 알림 토글 서비스 로직 추가 * feat: 학사일정 토글 도메인 테스트 추가 * feat: 학사일정 토글 인수 테스트 추가 * fix: FeatureFlagConfig Remote 설정 * fix: toggleAcademicEventNotification 메서드명 변경 -> updateUserAcademicEventNotification * fix: 불필요 반환 객체 제거(result, response) * fix: 학사일정 알림 변경 요청 시 설정값 받도록 수정 * fix: 학사일정 알림 설정 도메인 로직수정 * fix: 유저 인수테스트 및 테스트 수정 * fix: @NotNull javax -> jakarta 임포트 수정 * fix: 교직원 스크랩 DTO변환간 중복 Key 문제 해결 * fix: 불필요 로깅 삭제 * fix: 불필요 주석 삭제 --------- Co-authored-by: 양지윤 <[email protected]> Co-authored-by: Jiwoo Kim <[email protected]> * fix: 학사일정 스크랩 주기 원복 * feat: 최초 사용자 토큰 저장 시 학사일정 알림 구독하도록 수정 * feat: 학상일정 알림 설정 시 FCM 구독/구독해제 설정 추가 * feat: 학사일정 알림 토픽 추가 * feat: 학사일정 알림 스케쥴 로직 추가 * feat: 금일 학사일정 DB 조회 로직 구현 * feat: 학사일정 알림 전송 비지니스 로직 추가 * feat: 학사일정 알림 전송 관련 도메인 로직 추가 * feat: FeatureFlagsSupport 객체 추가 * test: IntegrationTestSupport 통합 테스트 수행 전 FeatureFlag 초기화 추가 * feat: FeatureFlagsSupport 객체 추가로 인한 불필요 Mocking 제거 * feat: User 도메인 테스트 추가 * test: AcademicEventNotificationServiceTest 추가 * test: AcademicEventNotificationSchedulerTest 추가 * fix: 메세지 리터럴 변수명 불일치 수정 * fix: 잘못된 try Catch문 삭제 * fix: Refrence Type으로 수정 * fix: Boolean 비교 equals 적용 이걸 까먹네 바본가 * fix: 기본 토픽 구독하는 메서드명 수정 * fix: 학사일정 알림 메시지 포맷 변경 * fix: 학사일정 알림 발송 간 에러 발생시 로직 수정 --------- Co-authored-by: 양지윤 <[email protected]> Co-authored-by: Jiwoo Kim <[email protected]> * Fix: 학과 공지 업데이트 오류 수정, 학과 목록 조회 api 수정 (#310) * [feat]: 학과별(학사) 전체 공지 업데이트 테스트 구현 * [refactor]: 변수 이름 graduated로 수정 * [fix]: latestPageGraduateNoticeApiClient 주입 누락 수정 * [feat]: 학과 목록 조회 - graduateSupported 추가 * [refactor]: 학과 목록 조회 - DeptInfo 주입 방식으로 수정 * [feat]: 매체연기학과 추가 구현 * [refactor]: import 수정 * [fix]: 학과 개수 변경 반영 * Feat: OCI 환경 CI/CD배포 파이프라인 추가 (#311) * feat: OCI CI/CD 워크플로우 * fix: plain 파일 제외 하도록 수정 * fix: dev 환경 ci/cd workflow 수정(decrpt 추가 및 sh 명령어 수정) (#312) * feat: decrpt secrets 실행 시 env 추가 (#313) * Feat: 학사일정 카테고리 및 알림 전송 분류 추가 (#308) * feat: 학사일정 카테고리 추가 * fix: 학사일정 카테고리 이넘화로 인한 수정 * feat: 학사일정 카테고리 분류 클래스 추가 * feat: 학사일정 알림 분류기 추가 * feat: 학사일정 제목 정규화 클래스 추가 * feat: AcademicEventConverter 내 알림 및 카테고리 분류 추가 * fix: 학사일정 카테고리 추가로 인한 테스트 변경 * fix: 학사일정 카테고리 추가로 인한 테스트 변경 * fix: 학사일정 스크랩 간 공휴일 제거로 인한 검증 횟수 변경 * test: AcademicEventCategorizerTest 추가 * test: AcademicEventNotificationClassifierTest 추가 * test: AcademicEventSummaryNormalizerTest 추가 * test: AcademicEventConverterTest 카테고리, 알림 구분 테스트 추가 * feat: 학사일정 스크랩 주기 변경(월1회 -> 주1회) * fix: 학사일정 업데이트 스케줄링 간 이벤트 건수 로그레벨 변경 * fix: 소나큐브 대응(Private Constructor) * fix: 코드래빗 대응(DisplayName 변경) * fix: 소나큐브 대응(ReDOS문제) * fix: 소나큐브 대응(ReDOS문제) * fix: 학사일정 카테고리 이름 공백 제거 * fix: 학사일정 엔티티 변환 시 Optional 반환하도록 수정 * fix: 푸시알림 메시지 생성 시 data 추가 * fix: 로그 오타 수정 * feat: Normalizer 패턴 변경(글자수 제한, Possessive Quantifiers) * fix: AcademicEventCategorizer private 생성자 추가 * Feat: 어드민 기능- 전체 사용자 토픽 구독 API 추가 (#314) * feat: User.getFcmToken getter 추가 * feat: 사용자 모든 구독 정보 가져오는 Repository Method 추가 * remove: 불필요 메서드 삭제 * remove: 모든 사용자 토픽 구독 처리 서비스 로직 추가 * remove: 모든 사용자 토픽 구독 처리 API추가 * remove: 모든 사용자 토픽 구독 처리 인수테스트 추가 * fix: 재구독 시 트랜잭션 어노테이션 제거 * fix: 재구독 성공/실패 개수 로깅 * feat: 학사일정 카테고리 컬럼 사이즈 30으로 변경 * Fix: 학사일정 알림 및 업데이트 시간 수정 (#315) * fix: 학사일정 알림 스케쥴 시간 변경(매일 아침 9시) * fix: 학사일정 업데이트 시간 수정(매주 월요일 오전 5시) * Feat: 대학원 스크랩 Feature Flag 적용 (#316) * fix: 대학원 공지사항 스크랩 피처플래그 추가 * feat: 대학원 공지사항 스크랩 피처플래그 적용 --------- Co-authored-by: 양지윤 <[email protected]> Co-authored-by: Jiwoo Kim <[email protected]>



#️⃣ 이슈
#299
📌 요약
학과(대학원) 공지 업데이트가 제대로 안되는 오류를 수정했습니다.
학과 목록 조회 api 응답에 대학원 여부도 보여주도록 수정하였습니다.
🛠️ 상세
대학원 공지를 지원하는 학과 객체에서 LatestPageGraduateNoticeApiClient 누락으로 deptInfo.scrapGraduateAllPageHtml()에서 업데이트 로직이 멈추던 문제
-> 대학원 공지 지원하는 학과 객채들에 LatestPageGraduateNoticeApiClient 주입하여 해결
학과 목록 조회 api 응답에 graduateSupported 필드 추가
-> 원래 DepartmentName 기반으로 구현돼있었는데 DepartmentName은 name, hostPrefix, korName만 갖고 있어서 NoticeQueryService에서 DeptInfo를 사용하도록 변경
-> 기존 isSupportGraduateScrap() 활용하여 대학원 공지 지원 여부 판단
'매체연기학과'가 구현 누락 돼있어서 추가하였습니다.
💬 기타
Summary by CodeRabbit