-
Notifications
You must be signed in to change notification settings - Fork 1
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[IDLE-400] 채용 공고 지원자 발생 시, 센터 관리자에게 알림을 발송한다. #183
Conversation
Walkthrough이 변경 사항은 Changes
Possibly related PRs
Suggested labels
Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media? 🪧 TipsChatThere are 3 ways to chat with CodeRabbit:
Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments. CodeRabbit Commands (Invoked using PR comments)
Other keywords and placeholders
Documentation and Community
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 11
🧹 Outside diff range and nitpick comments (12)
idle-infrastructure/fcm/src/main/kotlin/com/swm/idle/infrastructure/fcm/common/enums/DestinationType.kt (1)
1-5
: LGTM! 열거형 클래스가 잘 구현되었습니다.이
DestinationType
열거형 클래스는 PR의 목적에 잘 부합하며, 알림 대상 유형을 명확하게 정의하고 있습니다. 코드 구조와 명명 규칙이 Kotlin의 모범 사례를 따르고 있어 좋습니다.향후 확장성을 고려하여, 다음과 같은 제안을 드립니다:
- 주석을 추가하여 각 열거형 상수의 의미를 명확히 설명하는 것이 좋습니다.
- 앞으로 다른 대상 유형이 추가될 가능성이 있다면, 그에 대비하여 설계를 고려해 보시기 바랍니다.
예를 들어:
enum class DestinationType { /** * 지원자에게 보내는 알림을 나타냅니다. */ APPLICANTS, // 향후 추가될 수 있는 다른 대상 유형들: // RECRUITERS, // ADMINS, // etc. }이렇게 하면 코드의 가독성과 유지보수성이 향상될 것입니다.
idle-domain/src/main/kotlin/com/swm/idle/domain/user/common/enum/GenderType.kt (1)
7-8
: enum 상수 정의가 적절합니다. 국제화 고려해보세요.
MAN
과WOMAN
enum 상수에 대한 한국어 문자열 값 할당이 올바르게 이루어졌습니다. 이는 한국어 컨텍스트에서 사용하기에 적합합니다.향후 국제화를 고려한다면, 이러한 문자열을 리소스 파일로 분리하여 관리하는 것이 좋을 수 있습니다. 예를 들어:
enum class GenderType(val key: String) { MAN("gender.man"), WOMAN("gender.woman"); fun getLocalizedValue(context: Context): String { return context.getString(context.resources.getIdentifier(key, "string", context.packageName)) } }이렇게 하면 다국어 지원을 쉽게 추가할 수 있습니다.
idle-application/src/main/kotlin/com/swm/idle/application/applys/domain/CarerApplyEventPublisher.kt (2)
7-10
: 클래스 정의와 생성자가 잘 구현되었습니다.
@Service
어노테이션의 사용과 의존성 주입이 올바르게 구현되었습니다. 클래스 이름이 그 목적을 잘 설명하고 있습니다.클래스에 KDoc 주석을 추가하여 문서화를 개선하는 것이 좋겠습니다. 예를 들어:
/** * 간병인 지원 이벤트를 발행하는 서비스 클래스입니다. * * @property eventPublisher 애플리케이션 이벤트를 발행하기 위한 Spring의 ApplicationEventPublisher */ @Service class CarerApplyEventPublisher( private val eventPublisher: ApplicationEventPublisher, ) { // ... }
12-14
:publish
메서드가 간결하게 구현되었습니다.메서드의 구현이 명확하고 목적에 부합합니다. 다만, 다음 사항들을 고려해 보시기 바랍니다:
- 에러 처리: 이벤트 발행 중 발생할 수 있는 예외를 처리하는 로직을 추가하는 것이 좋겠습니다.
- 로깅: 디버깅과 모니터링을 위해 이벤트 발행 전후에 로그를 추가하는 것을 고려해 보세요.
- KDoc 주석: 메서드에 대한 문서화를 위해 KDoc 주석을 추가하는 것이 좋겠습니다.
예시 구현:
/** * 주어진 ApplyEvent를 발행합니다. * * @param applyEvent 발행할 지원 이벤트 * @throws RuntimeException 이벤트 발행 중 오류가 발생한 경우 */ fun publish(applyEvent: ApplyEvent) { try { logger.info("Publishing ApplyEvent: $applyEvent") eventPublisher.publishEvent(applyEvent) logger.info("Successfully published ApplyEvent: $applyEvent") } catch (e: Exception) { logger.error("Failed to publish ApplyEvent: $applyEvent", e) throw RuntimeException("Failed to publish ApplyEvent", e) } }이 구현은 에러 처리, 로깅, 그리고 문서화를 포함하고 있습니다. 프로젝트의 요구사항에 따라 적절히 수정하여 사용하시기 바랍니다.
idle-domain/src/main/kotlin/com/swm/idle/domain/notification/repository/DeviceTokenJpaRepository.kt (1)
15-16
: 변경 사항이 적절해 보입니다. 코드 일관성을 위한 작은 제안이 있습니다.새로운
findByUserId
메서드는 PR의 목적에 잘 부합하며, JPA 명명 규칙을 따르고 있습니다. 반환 타입이 nullable인 것도 적절합니다.코드 일관성을 위해 다음과 같이 빈 줄을 제거하는 것이 어떨까요?
fun findByUserId(userId: UUID): DeviceToken? -
idle-infrastructure/fcm/src/main/kotlin/com/swm/idle/infrastructure/fcm/applys/listener/CarerApplyEventListener.kt (1)
1-20
: 전반적으로 잘 구현된 이벤트 리스너입니다.이 클래스는 PR 목표에서 언급된 이벤트 기반 아키텍처를 잘 구현하고 있습니다. Spring 모범 사례를 따르고 있으며, 이벤트 리스너와 이벤트 처리 서비스 간의 명확한 관심사 분리를 확립하고 있어 모듈성과 유지보수성을 높이고 있습니다.
클래스에 대한 간단한 문서화(KDoc)를 추가하면 더욱 좋을 것 같습니다. 예를 들어:
/** * 케어기버 지원 이벤트를 수신하고 처리하는 리스너입니다. * 이 리스너는 ApplyEvent를 수신하여 CarerApplyEventService를 통해 알림을 발송합니다. */ @Component class CarerApplyEventListener( private val carerApplyEventService: CarerApplyEventService, ) { // ... 기존 코드 ... }이렇게 하면 클래스의 목적과 동작을 더 명확히 이해할 수 있습니다.
idle-domain/src/main/kotlin/com/swm/idle/domain/applys/event/ApplyEvent.kt (1)
7-11
: 클래스와 속성에 대한 KDoc 문서화가 필요합니다.
ApplyEvent
데이터 클래스의 구조는 잘 되어 있습니다. 하지만 클래스와 각 속성의 목적을 설명하는 KDoc 문서화가 없습니다. 코드의 가독성과 유지보수성을 높이기 위해 다음과 같이 문서화를 추가하는 것이 좋겠습니다:/** * 채용 공고 지원 이벤트를 나타내는 데이터 클래스입니다. * * @property deviceToken 알림을 보낼 디바이스 토큰 * @property jobPosting 지원한 채용 공고 * @property carer 지원한 케어러(지원자) */ data class ApplyEvent( val deviceToken: DeviceToken, val jobPosting: JobPosting, val carer: Carer, )idle-application/src/main/kotlin/com/swm/idle/application/notification/domain/DeviceTokenService.kt (1)
20-22
: 새로운 메서드가 잘 구현되었습니다.
findByUserId
메서드가 기존 코드 스타일과 일관성 있게 잘 구현되었습니다. 읽기 전용 작업이므로@Transactional
어노테이션이 없는 것도 적절합니다.코드의 일관성을 위해 다음과 같이 메서드 선언을 한 줄로 작성하는 것을 고려해 보세요:
- fun findByUserId(userId: UUID): DeviceToken? { - return deviceTokenJpaRepository.findByUserId(userId) - } + fun findByUserId(userId: UUID): DeviceToken? = deviceTokenJpaRepository.findByUserId(userId)이렇게 하면 다른 간단한 메서드들과 스타일이 일치하게 됩니다.
idle-application/src/main/kotlin/com/swm/idle/application/applys/domain/CarerApplyService.kt (1)
Line range hint
18-26
: 변경 사항이 PR 목표와 일치합니다.
create
메서드의 변경 사항이 PR의 목표와 잘 일치합니다.Applys
객체를 반환하도록 수정한 것은 좋은 개선입니다. 이를 통해 생성된 지원 정보를 즉시 사용할 수 있어, 이벤트 기반 아키텍처에서 알림 발송 등의 후속 처리에 유용할 것입니다.다음 사항들을 고려해 보시는 것은 어떨까요?
입력 유효성 검사:
jobPostingId
,carerId
,applyMethodType
의 유효성을 검사하는 로직을 추가하는 것이 좋을 것 같습니다.예외 처리: 데이터베이스 저장 중 발생할 수 있는 예외를 처리하는 로직을 추가하면 좋을 것 같습니다.
로깅: 중요한 작업이므로 로깅을 추가하는 것이 유용할 수 있습니다.
이러한 개선 사항들을 적용한 예시 코드는 다음과 같습니다:
fun create( jobPostingId: UUID, carerId: UUID, applyMethodType: ApplyMethodType, ): Applys { require(jobPostingId != UUID(0, 0)) { "Invalid jobPostingId" } require(carerId != UUID(0, 0)) { "Invalid carerId" } logger.info("Creating new application for jobPosting: $jobPostingId, carer: $carerId") return try { carerApplyJpaRepository.save( Applys( jobPostingId = jobPostingId, carerId = carerId, applyMethodType = applyMethodType, ) ).also { logger.info("Successfully created application with id: ${it.id}") } } catch (e: Exception) { logger.error("Failed to create application", e) throw ApplicationCreationException("Failed to create application", e) } }이 변경 사항들에 대해 어떻게 생각하시나요?
idle-application/src/main/kotlin/com/swm/idle/application/applys/facade/CarerApplyFacadeService.kt (3)
22-25
: [제안] 생성자 주입 종속성의 정렬생성자 주입 시 종속성들을 가독성을 높이기 위해 알파벳 순서로 정렬하거나 관련된 서비스끼리 그룹화하는 것을 고려해보세요.
28-29
: [제안] 로거 선언 위치 조정
logger
선언을 클래스의 다른 필드와 함께 상단으로 이동하면 코드의 일관성을 높일 수 있습니다.
43-43
: [니트픽] 코드 들여쓰기 수정
carerId = carer.id,
의 들여쓰기가 다른 인자들과 일치하지 않습니다. 코드 스타일의 일관성을 위해 들여쓰기를 조정해주세요.
📜 Review details
Configuration used: .coderabbit.yaml
Review profile: CHILL
📒 Files selected for processing (14)
- idle-application/src/main/kotlin/com/swm/idle/application/applys/domain/CarerApplyEventPublisher.kt (1 hunks)
- idle-application/src/main/kotlin/com/swm/idle/application/applys/domain/CarerApplyService.kt (1 hunks)
- idle-application/src/main/kotlin/com/swm/idle/application/applys/facade/CarerApplyFacadeService.kt (1 hunks)
- idle-application/src/main/kotlin/com/swm/idle/application/notification/domain/DeviceTokenService.kt (1 hunks)
- idle-domain/src/main/kotlin/com/swm/idle/domain/applys/event/ApplyEvent.kt (1 hunks)
- idle-domain/src/main/kotlin/com/swm/idle/domain/notification/repository/DeviceTokenJpaRepository.kt (1 hunks)
- idle-domain/src/main/kotlin/com/swm/idle/domain/user/common/enum/GenderType.kt (1 hunks)
- idle-infrastructure/fcm/build.gradle.kts (1 hunks)
- idle-infrastructure/fcm/src/main/kotlin/com/swm/idle/infrastructure/fcm/applys/listener/CarerApplyEventListener.kt (1 hunks)
- idle-infrastructure/fcm/src/main/kotlin/com/swm/idle/infrastructure/fcm/applys/service/CarerApplyEventService.kt (1 hunks)
- idle-infrastructure/fcm/src/main/kotlin/com/swm/idle/infrastructure/fcm/common/client/FcmClient.kt (1 hunks)
- idle-infrastructure/fcm/src/main/kotlin/com/swm/idle/infrastructure/fcm/common/config/FcmConfig.kt (1 hunks)
- idle-infrastructure/fcm/src/main/kotlin/com/swm/idle/infrastructure/fcm/common/config/FirebaseConfig.kt (1 hunks)
- idle-infrastructure/fcm/src/main/kotlin/com/swm/idle/infrastructure/fcm/common/enums/DestinationType.kt (1 hunks)
🔇 Additional comments (22)
idle-domain/src/main/kotlin/com/swm/idle/domain/user/common/enum/GenderType.kt (1)
3-5
: LGTM! enum 클래스에 value 파라미터 추가는 좋은 개선입니다.
GenderType
enum 클래스에value
파라미터를 추가한 것은 좋은 변경사항입니다. 이를 통해 각 성별 유형에 대한 문자열 표현을 연결할 수 있어, 코드의 가독성과 유용성이 향상됩니다.idle-infrastructure/fcm/src/main/kotlin/com/swm/idle/infrastructure/fcm/common/config/FcmConfig.kt (1)
3-9
: 전반적인 변경사항에 대해 승인하지만, Firebase 초기화 로직에 대한 설명이 필요합니다.이 변경으로 코드가 더 간결해지고 유연해진 것 같습니다. 하지만 이전에 있던 Firebase 초기화 로직이 어디로 이동되었는지 명확하지 않습니다. 이 부분에 대해 설명해 주시겠습니까?
다음 스크립트를 실행하여 Firebase 초기화 로직이 다른 곳으로 이동되었는지 확인해 보겠습니다:
또한, 이러한 아키텍처 변경의 이유를 문서화하는 것이 좋을 것 같습니다. 이는 향후 유지보수와 팀 내 지식 공유에 도움이 될 것입니다.
컴포넌트 스캔이 의도한 대로 작동하는지 확인하기 위해 다음 스크립트를 실행해 보겠습니다:
✅ Verification successful
Firebase 초기화 로직이
FirebaseConfig.kt
로 이동된 것을 확인했습니다.또한, 컴포넌트 스캔이 의도한 대로 작동함을 확인했습니다. 이러한 아키텍처 변경의 이유를 문서화하는 것을 권장드립니다.
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash # Firebase 초기화 로직을 찾습니다. rg --type kotlin "FirebaseApp.initializeApp" -g '!idle-infrastructure/fcm/src/main/kotlin/com/swm/idle/infrastructure/fcm/common/config/FcmConfig.kt'Length of output: 304
Script:
#!/bin/bash # FCM 관련 컴포넌트들이 올바르게 스캔되고 있는지 확인합니다. rg --type kotlin "@Component|@Service|@Repository" -g 'idle-infrastructure/fcm/**/*.kt'Length of output: 615
🧰 Tools
🪛 detekt
[warning] 8-9: The class or object FcmConfig is empty.
(detekt.empty-blocks.EmptyClassBlock)
idle-infrastructure/fcm/build.gradle.kts (2)
Line range hint
5-7
: 빌드 구성이 적절해 보입니다.
bootJar
작업을 비활성화하고jar
작업을 활성화한 것은 이 모듈이 독립 실행형 Spring Boot 애플리케이션이 아닌 라이브러리로 사용될 것임을 나타냅니다. 이는 FCM 인프라 구성 요소로서의 모듈 목적에 부합합니다.
10-10
::idle-domain
의존성 추가에 대한 설명이 필요합니다.
:idle-domain
프로젝트에 대한 의존성을 추가한 이유를 설명해 주시겠습니까? 이는 인프라 계층과 도메인 계층 사이에 결합도를 증가시킬 수 있습니다. 가능하다면 도메인 계층에 대한 직접적인 의존성을 피하고 인터페이스나 DTO를 통해 통신하는 방법을 고려해 보시기 바랍니다.이 의존성이 정말 필요한지 확인하기 위해 다음 스크립트를 실행해 주세요:
idle-application/src/main/kotlin/com/swm/idle/application/applys/domain/CarerApplyEventPublisher.kt (2)
1-5
: 패키지 선언과 임포트가 적절합니다.패키지 구조와 필요한 클래스들이 올바르게 임포트되었습니다. 코드 구조가 잘 정리되어 있습니다.
1-16
: 전반적으로 잘 구현된 이벤트 발행자 클래스입니다.이 클래스는 PR의 목표인 이벤트 기반 아키텍처를 사용한 알림 시스템 구현에 잘 부합합니다. Spring 프레임워크의 관례를 따르고 있으며, 의존성 주입을 적절히 사용하고 있습니다.
개선을 위한 제안사항:
- 클래스와 메서드에 KDoc 주석 추가
- 에러 처리 및 로깅 기능 추가
- 단위 테스트 작성 (현재 파일에는 없음)
이러한 개선사항들을 적용하면 코드의 견고성과 유지보수성이 향상될 것입니다.
idle-infrastructure/fcm/src/main/kotlin/com/swm/idle/infrastructure/fcm/common/client/FcmClient.kt (2)
1-6
: 패키지 선언과 임포트가 적절합니다.패키지 구조와 필요한 클래스들의 임포트가 잘 되어 있습니다. Firebase Messaging과 Spring Component 애노테이션을 사용하기 위한 적절한 임포트가 포함되어 있습니다.
7-8
: 클래스 선언과 애노테이션이 적절합니다.
FcmClient
클래스에@Component
애노테이션을 사용한 것은 Spring 관리 빈으로 만들기 위한 올바른 방법입니다. 클래스 이름도 기능을 잘 설명하고 있으며 명명 규칙을 따르고 있습니다.idle-infrastructure/fcm/src/main/kotlin/com/swm/idle/infrastructure/fcm/applys/listener/CarerApplyEventListener.kt (3)
1-7
: 패키지 선언과 임포트가 적절합니다.패키지 구조와 임포트가 클래스의 목적에 맞게 잘 정의되어 있습니다. 불필요한 임포트가 없고, 필요한 모든 클래스가 임포트되어 있습니다.
8-12
: 클래스 선언과 어노테이션이 적절합니다.
@Component
어노테이션을 사용하여 Spring 관리 빈으로 올바르게 선언되었습니다. 클래스 이름CarerApplyEventListener
는 그 목적을 명확히 설명하고 있으며 명명 규칙을 잘 따르고 있습니다.
10-12
: 생성자와 의존성 주입이 올바르게 구현되었습니다.
CarerApplyEventService
를 생성자 매개변수로 받아 의존성 주입을 올바르게 사용하고 있습니다. 이는 느슨한 결합과 테스트 용이성을 위한 최선의 방법을 따르고 있습니다.private val
로 선언하여 불변성을 보장하고 있어 좋습니다.idle-domain/src/main/kotlin/com/swm/idle/domain/applys/event/ApplyEvent.kt (2)
1-5
: 패키지 선언과 임포트가 적절합니다.패키지 선언과 임포트가 잘 구성되어 있습니다. 필요한 클래스들만 임포트되어 있어 깔끔해 보입니다.
1-25
: 전반적으로 잘 구현되었으나 몇 가지 개선 사항이 있습니다.이
ApplyEvent
클래스는 PR의 목적인 "채용 공고 지원자 발생 시, 센터 관리자에게 알림을 발송"하는 기능을 위한 이벤트 구조를 잘 구현하고 있습니다. 이는 PR에서 언급된 이벤트 기반 아키텍처 접근 방식과 일치합니다.주요 개선 사항:
- 클래스와 속성에 대한 KDoc 문서화 추가
- 불필요해 보이는 팩토리 메서드 제거 검토
이러한 개선사항들을 적용하면 코드의 가독성과 유지보수성이 향상될 것입니다. 전반적으로 이 구현은 PR의 목적을 잘 달성하고 있습니다.
idle-infrastructure/fcm/src/main/kotlin/com/swm/idle/infrastructure/fcm/common/config/FirebaseConfig.kt (2)
11-12
: 클래스 구조가 적절합니다.
@Configuration
어노테이션을 사용하여 Spring 구성 클래스로 올바르게 정의되었습니다. 필요한 import 문도 모두 포함되어 있습니다.
14-15
: 속성 선언이 올바릅니다. 애플리케이션 속성 파일 확인이 필요합니다.
firebaseConfigJsonPath
속성이@Value
어노테이션을 사용하여 올바르게 선언되었습니다.lateinit var
를 사용한 것도 Spring에 의해 주입되는 속성에 적합합니다.다음 스크립트를 실행하여 애플리케이션 속성 파일에
firebase.json.path
속성이 정의되어 있는지 확인하세요:idle-application/src/main/kotlin/com/swm/idle/application/notification/domain/DeviceTokenService.kt (1)
Line range hint
1-54
: PR 목표와 잘 부합하는 변경사항입니다.새로 추가된
findByUserId
메서드는 PR의 주요 목표인 채용 공고 지원자 발생 시 센터 관리자에게 알림을 보내는 기능을 구현하는 데 도움이 될 것으로 보입니다. 이 메서드를 통해 사용자 ID로 디바이스 토큰을 조회할 수 있어, FCM 알림 발송에 필요한 정보를 쉽게 얻을 수 있습니다.이 변경사항은 다음과 같은 점에서 긍정적입니다:
- 기존 코드 스타일과 일관성을 유지합니다.
- 단일 책임 원칙을 따릅니다.
- 이벤트 기반 아키텍처를 지원하여 애플리케이션 계층과 인프라 계층 간의 결합도를 낮춥니다.
idle-infrastructure/fcm/src/main/kotlin/com/swm/idle/infrastructure/fcm/applys/service/CarerApplyEventService.kt (2)
11-14
: LGTM: 클래스 선언과 생성자가 적절합니다.클래스 이름과
@Component
어노테이션이 목적에 맞게 잘 사용되었습니다.FcmClient
의존성 주입도 올바르게 구현되었습니다.
1-51
: 전반적으로 잘 구현되었지만 몇 가지 개선이 필요합니다.
CarerApplyEventService
클래스는 단일 책임 원칙을 잘 따르고 있으며 전체적으로 잘 구조화되어 있습니다. Kotlin의 scope 함수 등의 기능을 적절히 활용한 점이 돋보입니다.다음과 같은 전반적인 개선사항을 제안합니다:
- 예외 처리: FCM 메시지 전송 시 발생할 수 있는 예외에 대한 처리를 추가하세요.
- Null 안전성: 여러 메서드에서 null 체크를 강화하여 NullPointerException을 방지하세요.
- 국제화: 하드코딩된 문자열을 외부화하여 다국어 지원을 용이하게 만드세요.
- 타입 안전성: enum 값을 문자열로 변환할 때
name
프로퍼티를 사용하세요.- 가독성: 문자열 연결 대신 문자열 템플릿을 사용하여 가독성을 향상시키세요.
이러한 개선사항을 적용하면 코드의 견고성과 유연성이 크게 향상될 것입니다.
idle-application/src/main/kotlin/com/swm/idle/application/applys/facade/CarerApplyFacadeService.kt (4)
30-30
: [검증 필요] 트랜잭션 전파 수준 확인
@Transactional(propagation = Propagation.REQUIRES_NEW)
를 사용하여 새로운 트랜잭션을 시작하고 있습니다. 이 설정이 현재 비즈니스 로직에 적합한지 확인해주세요. 알림 전송 실패 시 비즈니스 로직의 롤백을 방지하려는 의도가 맞는지 검토가 필요합니다.
38-38
: [확인 필요]deviceToken
이 없을 경우 처리 로직 검토
deviceToken
이 없을 때 알림을 발송하지 않고 경고 로그를 남기고 있습니다. 이 경우 사용자에게 토큰 등록을 유도하거나 추가 처리가 필요한지 비즈니스 요구 사항을 확인해주세요.
49-50
: [검증 필요]carerApplyService.create
의 트랜잭션 처리
carerApplyService.create
메소드 호출이 새로운 트랜잭션 내에서 이루어지고 있습니다. 해당 메소드의 트랜잭션 전파 설정이 적절한지 확인하여 예상치 못한 롤백이나 커밋 문제가 발생하지 않도록 해주세요.
51-59
: [좋습니다] 알림 발송 로직의 Null 안전성 처리
deviceToken
의 존재 여부를 검사하여 알림 발송 여부를 결정한 것은 NullPointerException을 방지하는 좋은 접근입니다.
...nfrastructure/fcm/src/main/kotlin/com/swm/idle/infrastructure/fcm/common/client/FcmClient.kt
Outdated
Show resolved
Hide resolved
...nfrastructure/fcm/src/main/kotlin/com/swm/idle/infrastructure/fcm/common/client/FcmClient.kt
Outdated
Show resolved
Hide resolved
@EventListener | ||
fun handleCarerApplyEvent(applyEvent: ApplyEvent) { | ||
carerApplyEventService.send(applyEvent) | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🛠️ Refactor suggestion
이벤트 핸들러 메서드에 오류 처리와 로깅을 추가하는 것이 좋겠습니다.
이벤트 핸들러가 ApplyEvent
를 올바르게 수신하고 있으며, 처리를 CarerApplyEventService
에 위임하고 있어 단일 책임 원칙을 잘 따르고 있습니다. 하지만 오류 처리와 로깅이 없어 모니터링과 디버깅에 어려움이 있을 수 있습니다.
다음과 같이 오류 처리와 로깅을 추가하는 것을 고려해보세요:
@EventListener
fun handleCarerApplyEvent(applyEvent: ApplyEvent) {
try {
logger.info("Handling ApplyEvent: $applyEvent")
carerApplyEventService.send(applyEvent)
logger.info("Successfully sent notification for ApplyEvent: $applyEvent")
} catch (e: Exception) {
logger.error("Failed to handle ApplyEvent: $applyEvent", e)
// 여기에 추가적인 오류 처리 로직을 구현할 수 있습니다.
}
}
이렇게 하면 이벤트 처리 과정을 더 잘 추적하고 문제가 발생했을 때 빠르게 대응할 수 있습니다.
idle-domain/src/main/kotlin/com/swm/idle/domain/applys/event/ApplyEvent.kt
Outdated
Show resolved
Hide resolved
...fcm/src/main/kotlin/com/swm/idle/infrastructure/fcm/applys/service/CarerApplyEventService.kt
Outdated
Show resolved
Hide resolved
...fcm/src/main/kotlin/com/swm/idle/infrastructure/fcm/applys/service/CarerApplyEventService.kt
Outdated
Show resolved
Hide resolved
...fcm/src/main/kotlin/com/swm/idle/infrastructure/fcm/applys/service/CarerApplyEventService.kt
Outdated
Show resolved
Hide resolved
...fcm/src/main/kotlin/com/swm/idle/infrastructure/fcm/applys/service/CarerApplyEventService.kt
Outdated
Show resolved
Hide resolved
...pplication/src/main/kotlin/com/swm/idle/application/applys/facade/CarerApplyFacadeService.kt
Show resolved
Hide resolved
logger.warn { "${carer.id} 요양 보호사의 device Token이 존재하지 않아 알림이 발송되지 않았습니다." } | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
[이슈] 로그 메시지에 개인정보 노출 위험
로그에 carer.id
와 같은 민감한 정보가 직접 노출되고 있습니다. 개인정보 보호를 위해 로그에 출력되는 정보를 검토하고 필요한 경우 마스킹 처리나 제거를 고려해주세요.
수정 제안:
logger.warn { "요양 보호사의 device Token이 존재하지 않아 알림이 발송되지 않았습니다. carerId: ${carer.id}" }
또는 ID를 마스킹하는 방법을 사용할 수 있습니다.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 10
🧹 Outside diff range and nitpick comments (6)
idle-infrastructure/fcm/src/main/kotlin/com/swm/idle/infrastructure/fcm/common/client/FcmClient.kt (1)
1-14
: 전반적인 개선 사항 요약
FcmClient
클래스의 구현에 대해 다음과 같은 주요 개선 사항을 제안합니다:
인터페이스 도입 및 의존성 주입 사용: 테스트 용이성과 유연성 향상을 위해
FcmClient
를 인터페이스로 정의하고,FirebaseMessaging
인스턴스를 주입받도록 변경하세요.오류 처리 및 로깅 추가:
sendMulticast
메서드에 예외 처리와 로깅을 추가하여 디버깅과 모니터링을 용이하게 만드세요.비동기 작업 결과 처리: FCM 메시지 전송 결과를 비동기적으로 처리하고 로깅하는 콜백을 추가하세요.
이러한 변경사항을 적용하면 코드의 품질, 유지보수성, 그리고 운영 안정성이 크게 향상될 것입니다.
idle-infrastructure/fcm/src/main/kotlin/com/swm/idle/infrastructure/fcm/applys/listener/CarerApplyEventListener.kt (1)
14-14
: 메서드 이름을 이벤트 이름과 일치시키는 것이 좋겠습니다.현재 메서드 이름은
handleApplyEvent
이지만, 이벤트 이름은ApplyEvent
입니다. 일관성을 위해 메서드 이름을handleApplyEvent
에서handleCarerApplyEvent
로 변경하는 것을 고려해보세요. 이렇게 하면 메서드의 목적이 더 명확해지고, 다른 개발자들이 코드를 이해하기 쉬워집니다.idle-presentation/build.gradle.kts (1)
12-12
: FCM 의존성 추가 승인FCM 의존성 추가는 PR의 목표인 알림 시스템 구현과 일치합니다. 변경 사항이 적절하게 구현되었습니다.
가독성을 높이기 위해 의존성을 그룹화하는 것을 고려해 보세요. 예를 들어:
dependencies { // Core modules implementation(project(":idle-domain")) implementation(project(":idle-application")) implementation(project(":idle-batch")) // Support modules implementation(project(":idle-support:logging")) implementation(project(":idle-support:common")) implementation(project(":idle-support:transfer")) implementation(project(":idle-support:security")) // Infrastructure modules implementation(project(":idle-infrastructure:aws")) implementation(project(":idle-infrastructure:client")) implementation(project(":idle-infrastructure:sms")) implementation(project(":idle-infrastructure:fcm")) // External dependencies implementation(libs.spring.boot.starter.web) implementation(libs.spring.boot.starter.data.jpa) implementation(libs.springdoc.openapi.starter.webmvc.ui) developmentOnly(libs.spring.boot.devtools) // developmentOnly(libs.spring.boot.docker.compose) }이렇게 구성하면 프로젝트 구조를 더 쉽게 이해할 수 있습니다.
idle-presentation/src/main/resources/application.yml (1)
15-15
: FCM 프로파일 추가 승인 및 추가 고려사항FCM 프로파일을 로컬 환경에 추가한 것은 PR의 목적에 부합하며 적절해 보입니다.
다음 사항을 고려해 주시기 바랍니다:
- dev와 prod 환경에도 'fcm' 프로파일 추가가 필요한지 검토해 주세요. 필요하다면 해당 섹션에도 추가해 주세요.
- 'fcm' 프로파일의 목적과 용도를 간단히 주석으로 설명해 주시면 다른 개발자들의 이해에 도움이 될 것 같습니다.
idle-application/src/main/kotlin/com/swm/idle/application/user/center/service/domain/CenterManagerService.kt (1)
88-92
: 새로운 메서드가 잘 구현되었습니다.새로 추가된
findAllByCenterBusinessRegistrationNumber
메서드는 PR의 목적에 잘 부합하며, 기존 코드 스타일과 일관성이 있습니다.다만, 반환 타입이 nullable(
List<CenterManager>?
)인 점에 주의해 주세요. 이 메서드를 호출하는 코드에서 null 체크가 필요할 수 있습니다. 대신 빈 리스트를 반환하는 것을 고려해 보시는 것은 어떨까요? 예를 들어:fun findAllByCenterBusinessRegistrationNumber(centerBusinessRegistrationNumber: BusinessRegistrationNumber): List<CenterManager> { return centerManagerJpaRepository.findAllByCenterBusinessRegistrationNumber( centerBusinessRegistrationNumber.value ) ?: emptyList() }이렇게 하면 호출하는 쪽에서 null 체크를 하지 않아도 되어 코드가 더 간결해질 수 있습니다.
idle-infrastructure/fcm/src/main/kotlin/com/swm/idle/infrastructure/fcm/applys/service/CarerApplyEventService.kt (1)
53-53
: 불필요한 세미콜론을 제거하세요.Kotlin에서는 세미콜론이 필요하지 않으므로, 코드 스타일의 일관성을 위해 제거하는 것이 좋습니다.
다음과 같이 수정할 수 있습니다:
.putData("jobPostingId", applyEvent.jobPosting.id.toString()) -.build(); +.build()
📜 Review details
Configuration used: .coderabbit.yaml
Review profile: CHILL
📒 Files selected for processing (16)
- idle-application/build.gradle.kts (1 hunks)
- idle-application/src/main/kotlin/com/swm/idle/application/applys/facade/CarerApplyFacadeService.kt (1 hunks)
- idle-application/src/main/kotlin/com/swm/idle/application/user/center/service/domain/CenterManagerService.kt (1 hunks)
- idle-batch/src/main/kotlin/com/swm/idle/batch/common/scheduler/CrawlingJobScheduler.kt (0 hunks)
- idle-domain/src/main/kotlin/com/swm/idle/domain/applys/event/ApplyEvent.kt (1 hunks)
- idle-domain/src/main/kotlin/com/swm/idle/domain/user/center/repository/jpa/CenterManagerJpaRepository.kt (1 hunks)
- idle-infrastructure/fcm/src/main/kotlin/com/swm/idle/infrastructure/fcm/applys/listener/CarerApplyEventListener.kt (1 hunks)
- idle-infrastructure/fcm/src/main/kotlin/com/swm/idle/infrastructure/fcm/applys/service/CarerApplyEventService.kt (1 hunks)
- idle-infrastructure/fcm/src/main/kotlin/com/swm/idle/infrastructure/fcm/common/client/FcmClient.kt (1 hunks)
- idle-infrastructure/fcm/src/main/kotlin/com/swm/idle/infrastructure/fcm/common/config/FcmConfig.kt (1 hunks)
- idle-infrastructure/fcm/src/main/kotlin/com/swm/idle/infrastructure/fcm/common/config/FirebaseConfig.kt (1 hunks)
- idle-infrastructure/fcm/src/main/resources/application-fcm.yaml (0 hunks)
- idle-infrastructure/fcm/src/main/resources/application-fcm.yml (1 hunks)
- idle-presentation/build.gradle.kts (1 hunks)
- idle-presentation/src/main/kotlin/com/swm/idle/presentation/IdleServerApplication.kt (2 hunks)
- idle-presentation/src/main/resources/application.yml (1 hunks)
💤 Files with no reviewable changes (2)
- idle-batch/src/main/kotlin/com/swm/idle/batch/common/scheduler/CrawlingJobScheduler.kt
- idle-infrastructure/fcm/src/main/resources/application-fcm.yaml
✅ Files skipped from review due to trivial changes (1)
- idle-infrastructure/fcm/src/main/resources/application-fcm.yml
🧰 Additional context used
🔇 Additional comments (15)
idle-infrastructure/fcm/src/main/kotlin/com/swm/idle/infrastructure/fcm/common/client/FcmClient.kt (1)
1-5
: 패키지 및 임포트가 적절합니다.패키지 이름이 프로젝트 구조를 잘 반영하고 있으며, 필요한 클래스들이 올바르게 임포트되어 있습니다.
idle-infrastructure/fcm/src/main/kotlin/com/swm/idle/infrastructure/fcm/applys/listener/CarerApplyEventListener.kt (1)
1-19
: 전반적인 구조와 설계가 잘 되어 있습니다.이벤트 기반 아키텍처를 사용하여
ApplyEvent
를 처리하는 방식이 PR의 목표와 잘 부합합니다. 생성자 주입을 통한 의존성 관리와 단일 책임 원칙을 잘 따르고 있습니다.idle-domain/src/main/kotlin/com/swm/idle/domain/user/center/repository/jpa/CenterManagerJpaRepository.kt (4)
11-11
: 매개변수 이름 변경이 적절합니다.
value
에서identifier
로의 매개변수 이름 변경은 메서드의 목적을 더 명확하게 표현합니다. 이는 코드의 가독성과 유지보수성을 향상시킵니다.
13-13
: 매개변수 이름 변경이 일관성 있게 적용되었습니다.
existsByIdentifier
메서드에서도value
에서identifier
로의 매개변수 이름 변경이 일관되게 적용되었습니다. 이는 인터페이스 전반의 일관성을 유지하며 코드의 이해도를 높입니다.
15-15
: 매개변수 이름이 메서드 이름과 일치하도록 개선되었습니다.
findByPhoneNumber
메서드에서 매개변수 이름을value
에서phoneNumber
로 변경한 것은 매우 적절합니다. 이는 메서드 이름과 매개변수 이름 사이의 일관성을 제공하여 코드의 자체 문서화 특성을 향상시킵니다.
17-17
: 새로운 메서드가 적절히 추가되었습니다. 반환 타입에 대한 확인이 필요할 수 있습니다.
findAllByCenterBusinessRegistrationNumber
메서드의 추가는 PR의 목적에 부합하며, 센터 관리자를 찾는 기능을 제공합니다. 메서드 이름이 그 기능을 명확히 설명하고 있어 좋습니다.다만, 반환 타입이
List<CenterManager>?
로 nullable한 것에 대해 확인이 필요할 수 있습니다. 비즈니스 등록 번호에 해당하는 센터 관리자가 없을 경우 빈 리스트를 반환하는 것이 더 적절할 수 있습니다. 이는 null 체크의 필요성을 줄이고 코드의 안정성을 높일 수 있습니다.다음 스크립트를 실행하여 이 메서드의 사용 패턴을 확인해 주세요:
idle-domain/src/main/kotlin/com/swm/idle/domain/applys/event/ApplyEvent.kt (3)
1-5
: 패키지 선언과 임포트가 적절합니다.패키지 선언과 필요한 클래스들의 임포트가 올바르게 되어 있습니다. 코드의 구조와 의존성이 명확히 표현되어 있습니다.
7-11
: 데이터 클래스 선언이 잘 되어 있습니다.
ApplyEvent
데이터 클래스의 구조가 이벤트 객체로 적절하게 설계되어 있습니다. 특히 다음 사항들이 좋습니다:
deviceTokens
를List<DeviceToken>
으로 선언한 것은 사용자당 여러 기기를 지원할 수 있어 좋은 설계 선택입니다.- 모든 속성을
val
로 선언하여 불변성을 보장한 것은 이벤트 객체에 적합합니다.이러한 설계는 코드의 안정성과 확장성을 높여줍니다.
13-23
: 팩토리 메서드의 필요성을 재고해 주세요.현재
createApplyEvent
팩토리 메서드는 단순히 생성자를 호출하는 것 외에 추가적인 로직이나 유효성 검사를 수행하지 않습니다. 이는 코드의 복잡성만 증가시키고 명확한 이점이 없습니다.이전 리뷰 코멘트에서도 지적된 바와 같이, 이 메서드를 제거하는 것이 좋겠습니다:
data class ApplyEvent( val deviceTokens: List<DeviceToken>, val jobPosting: JobPosting, val carer: Carer, ) -{ - - companion object { - - fun createApplyEvent( - deviceTokens: List<DeviceToken>, - jobPosting: JobPosting, - carer: Carer, - ): ApplyEvent { - return ApplyEvent(deviceTokens, jobPosting, carer) - } - - } - -}만약 이 메서드가 필요한 특별한 이유가 있다면, 그 이유를 주석으로 추가해 주시기 바랍니다.
idle-application/build.gradle.kts (1)
13-13
: FCM 의존성 추가 승인FCM(Firebase Cloud Messaging) 의존성 추가는 PR 목표와 일치하며, 채용 공고 지원자 발생 시 센터 관리자에게 알림을 보내는 기능 구현에 필요한 것으로 보입니다.
다음 스크립트를 실행하여 FCM 통합이 프로젝트의 다른 부분에서 올바르게 사용되고 있는지 확인하세요:
idle-infrastructure/fcm/src/main/kotlin/com/swm/idle/infrastructure/fcm/common/config/FirebaseConfig.kt (2)
1-15
: 클래스 구조와 어노테이션이 적절합니다.
@Configuration
어노테이션과 필요한 import 문들이 올바르게 사용되었습니다. 이는 Spring 구성 클래스로 적절하게 설정되어 있습니다.
12-15
: 생성자 구현이 적절합니다.
firebaseConfigJsonPath
매개변수가@Value
어노테이션을 통해 애플리케이션 속성에서 올바르게 주입되고 있습니다. 이는 Firebase 구성 파일 경로를 유연하게 관리할 수 있게 해줍니다.idle-presentation/src/main/kotlin/com/swm/idle/presentation/IdleServerApplication.kt (3)
9-9
: FCM 구성을 위한 import 문 추가FCM(Firebase Cloud Messaging) 기능을 위한
FcmConfig
클래스의 import 문이 적절히 추가되었습니다. 이는 PR의 목표인 알림 시스템 구현과 일치합니다.
28-28
: @import 어노테이션에 FcmConfig 추가
FcmConfig::class
가@Import
어노테이션에 추가되어 FCM 기능이 애플리케이션 구성에 통합되었습니다. 이는 채용 공고 지원자 발생 시 센터 관리자에게 알림을 보내는 PR의 목표를 달성하는 데 필요한 적절한 변경사항입니다.
9-9
: FCM 기능 통합을 위한 적절한 변경이 변경사항들은 Firebase Cloud Messaging(FCM) 기능을 IdleServerApplication에 성공적으로 통합하고 있습니다.
FcmConfig
의 import와@Import
어노테이션에의 추가는 PR의 주요 목표인 채용 공고 지원자 발생 시 센터 관리자에게 알림을 보내는 기능 구현을 위한 필수적인 단계입니다. 이러한 변경은 간결하면서도 효과적으로 이루어졌으며, 전체적인 애플리케이션 구조를 해치지 않고 새로운 기능을 추가하고 있습니다.Also applies to: 28-28
fun sendMulticast(message: MulticastMessage) { | ||
FirebaseMessaging.getInstance().sendEachForMulticast(message) | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🛠️ Refactor suggestion
오류 처리와 로깅을 추가하는 것이 좋겠습니다.
현재 sendMulticast
메서드는 간단하게 구현되어 있지만, 오류 처리와 로깅이 없어 문제 발생 시 디버깅이 어려울 수 있습니다. 다음과 같은 개선을 제안합니다:
try-catch
블록을 사용하여 예외를 처리합니다.- 로깅을 추가하여 메시지 전송 시작과 완료를 기록합니다.
- 비동기 작업의 결과를 처리하는 콜백을 추가합니다.
예시 코드:
private val logger = LoggerFactory.getLogger(FcmClient::class.java)
fun sendMulticast(message: MulticastMessage) {
try {
logger.info("Sending FCM multicast message: $message")
FirebaseMessaging.getInstance().sendEachForMulticast(message).addOnCompleteListener { task ->
if (task.isSuccessful) {
logger.info("FCM multicast message sent successfully")
} else {
logger.error("Failed to send FCM multicast message", task.exception)
}
}
} catch (e: Exception) {
logger.error("Error while sending FCM multicast message", e)
throw e
}
}
이렇게 구현하면 메시지 전송 과정을 더 잘 모니터링하고 문제 발생 시 빠르게 대응할 수 있습니다.
@EventListener | ||
fun handleApplyEvent(applyEvent: ApplyEvent) { | ||
carerApplyEventService.sendForMulticast(applyEvent) | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🛠️ Refactor suggestion
오류 처리와 로깅을 추가하는 것이 좋겠습니다.
이벤트 핸들러에 오류 처리와 로깅을 추가하면 모니터링과 디버깅이 더 쉬워질 것입니다. 다음과 같이 수정하는 것을 고려해보세요:
@EventListener
fun handleApplyEvent(applyEvent: ApplyEvent) {
try {
logger.info("ApplyEvent 처리 시작: $applyEvent")
carerApplyEventService.sendForMulticast(applyEvent)
logger.info("ApplyEvent 처리 완료: $applyEvent")
} catch (e: Exception) {
logger.error("ApplyEvent 처리 실패: $applyEvent", e)
// 필요한 경우 추가적인 오류 처리 로직을 구현하세요.
}
}
이렇게 하면 이벤트 처리 과정을 더 잘 추적하고 문제가 발생했을 때 빠르게 대응할 수 있습니다.
@PostConstruct | ||
fun initializeFirebaseApp() { | ||
val googleCredentials = | ||
GoogleCredentials.fromStream(ClassPathResource(firebaseConfigJsonPath).inputStream) | ||
|
||
val fireBaseOptions = FirebaseOptions.builder() | ||
.setCredentials(googleCredentials) | ||
.build() | ||
|
||
FirebaseApp.initializeApp(fireBaseOptions) | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🛠️ Refactor suggestion
initializeFirebaseApp
메서드 개선 제안
현재 구현은 기능적이지만, 이전 리뷰 의견에서 제안된 중요한 개선 사항들이 여전히 적용되지 않았습니다. 다음 사항들을 고려하여 메서드를 개선해 주세요:
- 오류 처리: 파일 읽기나 Firebase 초기화 중 발생할 수 있는 예외를 처리해야 합니다.
- 기존 Firebase 앱 확인: 이미 초기화된 Firebase 앱이 있는지 확인이 필요합니다.
- 로깅: 디버깅과 모니터링을 위한 로그 문장을 추가하면 좋겠습니다.
아래와 같이 메서드를 개선해 보세요:
@PostConstruct
fun initializeFirebaseApp() {
try {
if (FirebaseApp.getApps().isEmpty()) {
val googleCredentials =
GoogleCredentials.fromStream(ClassPathResource(firebaseConfigJsonPath).inputStream)
val fireBaseOptions = FirebaseOptions.builder()
.setCredentials(googleCredentials)
.build()
FirebaseApp.initializeApp(fireBaseOptions)
logger.info("Firebase 앱이 성공적으로 초기화되었습니다.")
} else {
logger.info("Firebase 앱이 이미 초기화되어 있습니다.")
}
} catch (e: Exception) {
logger.error("Firebase 앱 초기화 중 오류가 발생했습니다: ${e.message}", e)
throw RuntimeException("Firebase 앱 초기화 실패", e)
}
}
또한, 클래스 상단에 private val logger = LoggerFactory.getLogger(FirebaseConfig::class.java)
를 추가하여 로거를 정의해야 합니다.
import org.springframework.boot.context.properties.ConfigurationPropertiesScan | ||
import org.springframework.boot.context.properties.EnableConfigurationProperties | ||
import org.springframework.context.annotation.ComponentScan |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@EnableConfigurationProperties
와 @ConfigurationPropertiesScan
의 중복 사용 검토 필요
@EnableConfigurationProperties
와 @ConfigurationPropertiesScan
은 모두 @ConfigurationProperties
가 붙은 클래스를 스캔하고 바인딩하는 역할을 합니다. 두 어노테이션의 기능이 겹칠 수 있으므로, 둘 다 필요한지 확인하고 하나만 사용해도 되는지 검토하는 것이 좋습니다.
|
||
@Configuration | ||
@ComponentScan(basePackages = ["com.swm.idle.infrastructure.fcm"]) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🛠️ Refactor suggestion
@ComponentScan
어노테이션의 필요성 확인
@ComponentScan
은 지정된 패키지의 빈을 스캔합니다. 하지만 Spring Boot 애플리케이션은 기본적으로 시작 클래스 패키지 이하의 모든 빈을 자동으로 스캔하므로, @ComponentScan
이 필요하지 않을 수 있습니다. 불필요한 중복 스캔을 방지하기 위해 이 어노테이션이 꼭 필요한지 확인하고, 필요하지 않다면 제거를 고려해보세요.
val deviceTokens = applyEvent.deviceTokens.map { deviceToken -> | ||
deviceToken.deviceToken | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
deviceTokens
가 비어 있을 경우 처리가 필요합니다.
deviceTokens
리스트가 비어 있으면 FCM 전송 시 오류가 발생할 수 있습니다. 빈 리스트에 대한 체크를 추가하여 안정성을 높일 수 있습니다.
다음과 같이 수정할 수 있습니다:
val deviceTokens = applyEvent.deviceTokens.map { deviceToken ->
deviceToken.deviceToken
}
if (deviceTokens.isEmpty()) {
// deviceTokens가 비어 있을 경우 처리 로직 추가 (예: 로깅 후 메서드 종료)
logger.warn("전송할 deviceToken이 없습니다.")
return
}
return MulticastMessage.builder()
.addAllTokens(deviceTokens)
.setNotification(applyNotification)
.putData("destination", DestinationType.APPLICANTS.toString())
.putData("jobPostingId", applyEvent.jobPosting.id.toString())
.build()
Also applies to: 48-50
fun sendForMulticast(applyEvent: ApplyEvent) { | ||
createMulticastMessage(applyEvent).also { | ||
fcmClient.sendMulticast(it) | ||
} | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
fcmClient.sendMulticast
호출 시 예외 처리가 필요합니다.
fcmClient.sendMulticast(it)
호출 중 예외가 발생할 수 있으므로, 예외 처리를 추가하여 서비스의 안정성을 향상시킬 수 있습니다. 예외 발생 시 적절한 로깅이나 대처 방안을 마련하는 것이 좋습니다.
다음과 같이 수정할 수 있습니다:
fun sendForMulticast(applyEvent: ApplyEvent) {
+ try {
createMulticastMessage(applyEvent).also {
fcmClient.sendMulticast(it)
}
+ } catch (e: Exception) {
+ // 예외 처리 로직 추가 (예: 로깅)
+ logger.error("Multicast 메시지 전송 실패: ${e.message}", e)
+ }
}
Committable suggestion was skipped due to low confidence.
deviceTokens?.let { | ||
ApplyEvent.createApplyEvent( | ||
deviceTokens = deviceTokens, | ||
jobPosting = jobPosting, | ||
carer = carer, | ||
).also { | ||
carerApplyEventPublisher.publish(it) | ||
} | ||
} ?: run { | ||
logger.warn { "device Token이 존재하지 않아 알림이 발송되지 않았습니다." } | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
알림 발송 시 빈 디바이스 토큰 목록에 대한 처리 필요
현재 코드는 deviceTokens
가 null
인 경우에만 알림 발송을 생략하고 로그를 남기고 있습니다. 그러나 deviceTokens
가 빈 리스트일 경우에도 알림이 발송되지 않을 수 있으므로, 빈 리스트인지 확인하는 로직이 필요합니다.
다음과 같이 수정하여 빈 리스트인 경우에도 적절하게 처리할 수 있습니다:
if (!deviceTokens.isNullOrEmpty()) {
ApplyEvent.createApplyEvent(
deviceTokens = deviceTokens,
jobPosting = jobPosting,
carer = carer,
).also {
carerApplyEventPublisher.publish(it)
}
} else {
logger.warn { "Device Token이 존재하지 않아 알림이 발송되지 않았습니다." }
}
val deviceTokens = centerManagerService.findAllByCenterBusinessRegistrationNumber( | ||
BusinessRegistrationNumber(center.businessRegistrationNumber) | ||
)?.filter { centerManager -> | ||
centerManager.status == CenterManagerAccountStatus.APPROVED && centerManager.entityStatus == EntityStatus.ACTIVE | ||
}?.mapNotNull { centerManager -> | ||
deviceTokenService.findByUserId(centerManager.id) | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🛠️ Refactor suggestion
가독성을 향상시키기 위한 deviceTokens 획득 로직 리팩토링 제안
현재 deviceTokens
를 획득하는 로직이 메서드 체이닝으로 복잡하게 구성되어 있어 가독성이 떨어질 수 있습니다. 코드를 단계별로 분리하여 가독성을 높이는 것을 제안합니다.
다음과 같이 수정할 수 있습니다:
val centerManagers = centerManagerService.findAllByCenterBusinessRegistrationNumber(
BusinessRegistrationNumber(center.businessRegistrationNumber)
)?.filter { centerManager ->
centerManager.status == CenterManagerAccountStatus.APPROVED &&
centerManager.entityStatus == EntityStatus.ACTIVE
}
val deviceTokens = centerManagers?.mapNotNull { centerManager ->
deviceTokenService.findByUserId(centerManager.id)
}
이렇게 하면 로직의 흐름이 명확해져 이해하기 쉽고 유지보수에도 도움이 됩니다.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 13
🧹 Outside diff range and nitpick comments (12)
idle-domain/src/main/kotlin/com/swm/idle/domain/notification/enums/NotificationType.kt (1)
1-5
: LGTM! 알림 유형을 위한 열거형 클래스 추가.
NotificationType
열거형 클래스의 도입은 알림 시스템 구현에 적합한 접근 방식입니다. 이는 타입 안전성을 제공하고 향후 확장이 용이합니다.향후 필요할 수 있는 다른 알림 유형들도 고려해 보시는 것이 좋겠습니다. 예를 들어:
INTERVIEW_SCHEDULED
APPLICATION_STATUS_CHANGED
NEW_JOB_POSTING
이러한 유형들을 미리 추가하거나, 추후 확장 계획을 팀과 논의해보시는 것은 어떨까요?
idle-support/transfer/src/main/kotlin/com/swm/idle/support/transfer/notification/UnreadNotificationCountResponse.kt (1)
1-5
: LGTM! 간단한 개선 제안코드가 잘 작성되었습니다. 데이터 클래스의 사용이 적절하며, 이름이 명확합니다.
가독성을 더욱 높이기 위해 클래스에 KDoc 주석을 추가하는 것이 좋겠습니다. 다음과 같이 추가할 수 있습니다:
/** * 읽지 않은 알림의 개수를 나타내는 응답 객체 * * @property unreadNotificationCount 읽지 않은 알림의 개수 */ data class UnreadNotificationCountResponse( val unreadNotificationCount: Int, )idle-domain/src/main/kotlin/com/swm/idle/domain/common/dto/NotificationQueryDto.kt (2)
7-16
: 데이터 클래스 구조는 좋지만, 문서화와 Null 안정성을 개선할 수 있습니다.
NotificationQueryDto
클래스의 구조는 잘 설계되어 있습니다. 하지만 다음과 같은 개선 사항을 고려해 보시기 바랍니다:
클래스와 각 속성에 대한 KDoc 주석을 추가하여 문서화를 개선하세요. 이는 코드의 가독성과 유지보수성을 높일 것입니다.
imageUrl
외의 다른 속성들도 nullable이어야 하는지 검토해 보세요. 예를 들어,notificationDetails
가 항상 필요한지, 혹은 null일 수 있는지 고려해 보세요.다음은 KDoc 주석을 추가한 예시입니다:
/** * 알림 정보를 전달하기 위한 데이터 전송 객체(DTO) * * @property id 알림의 고유 식별자 * @property isRead 알림 읽음 여부 * @property title 알림 제목 * @property body 알림 본문 * @property notificationType 알림 유형 * @property createdAt 알림 생성 시간 * @property imageUrl 알림과 관련된 이미지 URL (없을 수 있음) * @property notificationDetails 알림에 대한 추가 세부 정보 */ data class NotificationQueryDto( val id: UUID, val isRead: Boolean, val title: String, val body: String, val notificationType: NotificationType, val createdAt: LocalDateTime, val imageUrl: String?, val notificationDetails: String, )
7-16
: 향후 확장성을 고려한 개선 사항현재
NotificationQueryDto
클래스의 구조는 잘 설계되어 있지만, 다음과 같은 개선 사항을 고려해 보시면 좋겠습니다:
notificationDetails
를 더 유연한 구조로 변경하는 것을 고려해 보세요. 예를 들어,Map<String, Any>
타입을 사용하면 다양한 종류의 알림에 대해 추가 정보를 더 쉽게 포함시킬 수 있습니다.향후 변경 사항에 대비하여 버전 관리 전략을 고려해 보세요. 예를 들어, 클래스에 버전 필드를 추가하거나 패키지 이름에 버전을 포함시키는 방법이 있습니다.
다음은 이러한 개선 사항을 적용한 예시입니다:
package com.swm.idle.domain.common.dto.v1 data class NotificationQueryDto( val id: UUID, val isRead: Boolean, val title: String, val body: String, val notificationType: NotificationType, val createdAt: LocalDateTime, val imageUrl: String?, val notificationDetails: Map<String, Any>, val version: Int = 1 )이렇게 변경하면 향후 새로운 알림 유형이나 추가 정보가 필요할 때 더 유연하게 대응할 수 있습니다.
idle-application/src/main/kotlin/com/swm/idle/application/notification/utils/converter/NotificationDetailsConverter.kt (1)
1-16
: 전반적으로 잘 구현되었습니다. 로깅 추가를 고려해보세요.
NotificationDetailsConverter
클래스가 단일 책임 원칙을 잘 따르고 있으며, 코드 구조가 깔끔합니다. JSON 문자열을 맵으로 변환하는 기능을 명확하게 구현하고 있습니다.개선을 위한 제안:
- 앞서 언급한
ObjectMapper
의존성 주입 고려- JSON 파싱 예외 처리 추가
- 로깅 기능 추가: 디버깅과 모니터링을 위해 SLF4J나 Log4j를 사용한 로깅을 추가하는 것이 좋겠습니다.
private val logger = LoggerFactory.getLogger(NotificationDetailsConverter::class.java)이러한 개선사항들을 적용하면 코드의 안정성과 유지보수성이 더욱 향상될 것입니다.
idle-domain/src/main/kotlin/com/swm/idle/domain/notification/repository/jpa/DeviceTokenJpaRepository.kt (1)
15-16
: 새로운 메서드가 잘 추가되었습니다.
findByUserId
메서드의 추가는 PR의 목적에 부합하며, JPA 명명 규칙을 잘 따르고 있습니다. 사용자 ID로 디바이스 토큰을 조회할 수 있게 되어 알림 시스템 구현에 도움이 될 것 같습니다.성능 최적화를 위해 다음과 같이 메서드에
@Query
어노테이션을 추가하는 것을 고려해 보세요:@Query("SELECT dt FROM DeviceToken dt WHERE dt.userId = :userId") fun findByUserId(userId: UUID): DeviceToken?이렇게 하면 JPA가 메서드 이름을 파싱하는 대신 직접 쿼리를 실행하여 약간의 성능 향상을 얻을 수 있습니다.
idle-domain/src/main/kotlin/com/swm/idle/domain/notification/repository/jpa/NotificationJpaRepository.kt (1)
10-19
: 쿼리 메서드 구현이 적절하나 몇 가지 개선 사항이 있습니다.전반적인 구현은 잘 되어 있습니다. 그러나 다음 사항들을 고려해 보시기 바랍니다:
- SQL 인젝션 방지를 위해 준비된 문(prepared statement) 또는 매개변수화된 쿼리(parameterized query)를 사용하는 것이 좋습니다.
- 성능 최적화를 위해
receiver_id
와is_read
컬럼에 인덱스를 추가하는 것을 고려해 보세요.이러한 개선 사항들을 구현하는 데 도움이 필요하시면 말씀해 주세요.
idle-application/src/main/kotlin/com/swm/idle/application/notification/domain/DeviceTokenService.kt (1)
20-22
: 새로운 메서드 추가 승인 및 개선 제안
findByUserId
메서드가 적절하게 추가되었습니다. 이는 기존 클래스 패턴과 일치하며 읽기 전용 작업에 대해 올바르게 구현되었습니다.가독성을 높이기 위해 다음과 같이 메서드를 한 줄로 작성하는 것을 고려해 보세요:
fun findByUserId(userId: UUID): DeviceToken? = deviceTokenJpaRepository.findByUserId(userId)idle-presentation/src/main/kotlin/com/swm/idle/presentation/jobposting/api/CrawlingJobPostingApi.kt (1)
Line range hint
1-38
: 전반적인 인터페이스 설계가 적절합니다.이 인터페이스는 RESTful 원칙을 잘 따르고 있으며, @secured 어노테이션을 사용하여 PR 목표에서 언급된 보안 요구사항을 충족시키고 있습니다. 크롤링 공고 상세 조회, 전체 조회, 즐겨찾기 조회 등 필요한 작업들을 잘 커버하고 있습니다.
다만, 한 가지 제안사항이 있습니다:
PR 목표에서 언급된 "채용 공고 지원자 발생 시, 센터 관리자에게 알림을 발송"하는 기능이 이 인터페이스에 반영되어 있지 않습니다. 이 기능을 위한 새로운 메서드를 추가하는 것을 고려해 보시는 것은 어떨까요? 예를 들어:
@Secured @Operation(summary = "채용 공고 지원 알림 발송 API") @PostMapping("/{crawling-job-posting-id}/notify-application") @ResponseStatus(HttpStatus.OK) fun notifyJobApplication(@PathVariable(value = "crawling-job-posting-id") crawlingJobPostingId: UUID)이 메서드는 특정 공고에 지원이 발생했을 때 호출되어 센터 관리자에게 알림을 발송하는 역할을 할 수 있습니다.
idle-support/transfer/src/main/kotlin/com/swm/idle/support/transfer/notification/NotificationScrollResponse.kt (1)
36-47
:from
함수의 필요성 검토companion object의
from
함수는 현재 생성자를 직접 호출하는 역할만 수행하고 있습니다. 추가적인 로직이 없는 경우, 생성자를 직접 사용하는 것이 더 간결하며 코드를 단순화할 수 있습니다. 해당 함수를 유지하려는 특별한 이유가 없다면 제거를 고려해 보세요.idle-domain/src/main/kotlin/com/swm/idle/domain/notification/jpa/Notification.kt (1)
58-61
: 예외 처리 추가 권장
convertMapToJson()
메서드에서 JSON으로 변환할 때 예외가 발생할 수 있으므로, 예외 처리를 추가하는 것이 좋습니다. 이를 통해 애플리케이션의 안정성을 향상시킬 수 있습니다.idle-application/src/main/kotlin/com/swm/idle/application/notification/domain/NotificationService.kt (1)
35-38
: 예외 처리 시 적절한 예외 클래스 사용 권장현재
PersistenceException.ResourceNotFound
예외를 사용하고 있는데, 이는 Persistence 계층의 예외로 비즈니스 로직에 적합하지 않을 수 있습니다. 도메인에 맞는 커스텀 예외를 정의하여 사용하는 것을 고려해보세요.
📜 Review details
Configuration used: .coderabbit.yaml
Review profile: CHILL
📒 Files selected for processing (24)
- idle-application/src/main/kotlin/com/swm/idle/application/jobposting/facade/CarerJobPostingFacadeService.kt (1 hunks)
- idle-application/src/main/kotlin/com/swm/idle/application/jobposting/facade/CrawlingJobPostingFacadeService.kt (1 hunks)
- idle-application/src/main/kotlin/com/swm/idle/application/jobposting/facade/JobPostingFavoriteFacadeService.kt (1 hunks)
- idle-application/src/main/kotlin/com/swm/idle/application/notification/domain/DeviceTokenService.kt (2 hunks)
- idle-application/src/main/kotlin/com/swm/idle/application/notification/domain/NotificationService.kt (1 hunks)
- idle-application/src/main/kotlin/com/swm/idle/application/notification/facade/NotificationFacadeService.kt (1 hunks)
- idle-application/src/main/kotlin/com/swm/idle/application/notification/utils/converter/NotificationDetailsConverter.kt (1 hunks)
- idle-domain/src/main/kotlin/com/swm/idle/domain/common/dto/NotificationQueryDto.kt (1 hunks)
- idle-domain/src/main/kotlin/com/swm/idle/domain/jobposting/repository/querydsl/JobPostingQueryRepository.kt (1 hunks)
- idle-domain/src/main/kotlin/com/swm/idle/domain/notification/enums/NotificationType.kt (1 hunks)
- idle-domain/src/main/kotlin/com/swm/idle/domain/notification/jpa/Notification.kt (3 hunks)
- idle-domain/src/main/kotlin/com/swm/idle/domain/notification/jpa/NotificationInfo.kt (1 hunks)
- idle-domain/src/main/kotlin/com/swm/idle/domain/notification/repository/jpa/DeviceTokenJpaRepository.kt (2 hunks)
- idle-domain/src/main/kotlin/com/swm/idle/domain/notification/repository/jpa/NotificationJpaRepository.kt (1 hunks)
- idle-domain/src/main/kotlin/com/swm/idle/domain/notification/repository/querydsl/NotificationQueryRepository.kt (1 hunks)
- idle-presentation/src/main/kotlin/com/swm/idle/presentation/jobposting/api/CarerJobPostingApi.kt (1 hunks)
- idle-presentation/src/main/kotlin/com/swm/idle/presentation/jobposting/api/CrawlingJobPostingApi.kt (1 hunks)
- idle-presentation/src/main/kotlin/com/swm/idle/presentation/jobposting/controller/CarerJobPostingController.kt (1 hunks)
- idle-presentation/src/main/kotlin/com/swm/idle/presentation/jobposting/controller/CrawlingJobPostingController.kt (1 hunks)
- idle-presentation/src/main/kotlin/com/swm/idle/presentation/notification/api/NotificationApi.kt (1 hunks)
- idle-presentation/src/main/kotlin/com/swm/idle/presentation/notification/controller/NotificationController.kt (1 hunks)
- idle-support/transfer/src/main/kotlin/com/swm/idle/support/transfer/common/CursorScrollRequest.kt (1 hunks)
- idle-support/transfer/src/main/kotlin/com/swm/idle/support/transfer/notification/NotificationScrollResponse.kt (1 hunks)
- idle-support/transfer/src/main/kotlin/com/swm/idle/support/transfer/notification/UnreadNotificationCountResponse.kt (1 hunks)
✅ Files skipped from review due to trivial changes (2)
- idle-application/src/main/kotlin/com/swm/idle/application/jobposting/facade/CarerJobPostingFacadeService.kt
- idle-application/src/main/kotlin/com/swm/idle/application/jobposting/facade/CrawlingJobPostingFacadeService.kt
🧰 Additional context used
🔇 Additional comments (23)
idle-domain/src/main/kotlin/com/swm/idle/domain/notification/jpa/NotificationInfo.kt (1)
1-14
: 인터페이스 구조가 잘 설계되었습니다.
NotificationInfo
인터페이스의 전반적인 구조와 설계가 잘 되어 있습니다. 알림 시스템 구현을 위한 PR 목표와 잘 부합합니다. 몇 가지 제안사항:
- 각 프로퍼티에 대한 KDoc 주석을 추가하여 문서화를 개선하는 것이 좋겠습니다.
imageUrl
과notificationDetails
를 nullable로 정의한 것은 적절합니다.KDoc 주석 추가 예시:
interface NotificationInfo { /** 알림의 제목 */ val title: String /** 알림의 본문 내용 */ val body: String /** 알림 수신자의 고유 식별자 */ val receiverId: UUID /** 알림의 유형 */ val notificationType: NotificationType /** 알림에 포함될 이미지의 URL (선택사항) */ val imageUrl: String? /** 알림에 대한 추가 세부 정보 (선택사항) */ val notificationDetails: Map<String, Any>? }이 인터페이스의 사용을 확인하기 위해 다음 스크립트를 실행해 주세요:
✅ Verification successful
인터페이스 구조가 잘 설계되었습니다.
NotificationInfo
인터페이스의 전반적인 구조와 설계가 잘 되어 있습니다. 알림 시스템 구현을 위한 PR 목표와 잘 부합합니다. 몇 가지 제안사항:
- 각 프로퍼티에 대한 KDoc 주석을 추가하여 문서화를 개선하는 것이 좋겠습니다.
- 현재
NotificationService.kt
에서만 사용되고 있으므로, 추후 구현 클래스 추가 여부를 검토해 주세요.🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash # Description: Verify the usage of NotificationInfo interface in the codebase. # Test: Search for classes implementing NotificationInfo echo "Classes implementing NotificationInfo:" rg --type kotlin "class.*:.*NotificationInfo" # Test: Search for functions or properties using NotificationInfo echo "\nFunctions or properties using NotificationInfo:" rg --type kotlin "NotificationInfo[^{]"Length of output: 567
idle-domain/src/main/kotlin/com/swm/idle/domain/common/dto/NotificationQueryDto.kt (1)
1-5
: 패키지 선언과 임포트가 적절합니다.패키지 선언과 필요한 클래스들의 임포트가 올바르게 되어 있습니다.
NotificationType
,LocalDateTime
,UUID
를 포함한 필요한 모든 타입들이 임포트되어 있어 좋습니다.idle-application/src/main/kotlin/com/swm/idle/application/notification/utils/converter/NotificationDetailsConverter.kt (2)
1-6
: 패키지 선언과 임포트가 적절합니다.패키지 선언이 정확하고, 필요한 Jackson 라이브러리 컴포넌트와 Spring의
@Component
어노테이션이 올바르게 임포트되었습니다. 불필요한 임포트가 없어 깔끔합니다.
7-8
: 클래스 선언과 어노테이션이 적절합니다.
NotificationDetailsConverter
클래스에@Component
어노테이션을 사용하여 Spring 관리 빈으로 올바르게 선언되었습니다. 클래스 이름도 그 목적을 잘 설명하고 있습니다.idle-support/transfer/src/main/kotlin/com/swm/idle/support/transfer/common/CursorScrollRequest.kt (1)
1-1
: 패키지 변경이 적절해 보입니다.
CursorScrollRequest
클래스를common
패키지로 이동한 것은 코드 구조를 개선하고 재사용성을 높이는 좋은 결정으로 보입니다. 이 변경으로 다른 모듈에서도 이 클래스를 더 쉽게 사용할 수 있을 것 같습니다.다음 스크립트를 실행하여 이 변경이 다른 파일들에 미치는 영향을 확인해 주세요:
이 스크립트의 결과를 바탕으로 필요한 추가 변경사항이 있는지 확인해 주세요.
✅ Verification successful
변경 사항이 성공적으로 검증되었습니다.
패키지
com.swm.idle.support.transfer.common
으로의 변경이 올바르게 이루어졌으며, 기존 패키지에 대한 import가 더 이상 존재하지 않습니다. 또한,CursorScrollRequest
의 모든 사용처가 새로운 패키지로 업데이트되었고,ScrollRequest.kt
도 동일한 패키지에 위치하고 있어 문제가 없습니다.🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash # Description: Verify the impact of CursorScrollRequest package change # Test 1: Check for any remaining imports of the old package echo "Checking for old package imports..." rg "import com.swm.idle.support.transfer.jobposting.carer.CursorScrollRequest" --type kotlin # Test 2: Check for usage of CursorScrollRequest echo "Checking for CursorScrollRequest usage..." rg "CursorScrollRequest" --type kotlin # Test 3: Check if ScrollRequest is in the same package echo "Checking ScrollRequest location..." fd ScrollRequest.ktLength of output: 4314
idle-domain/src/main/kotlin/com/swm/idle/domain/notification/repository/jpa/NotificationJpaRepository.kt (1)
1-8
: 인터페이스 선언이 적절합니다.
NotificationJpaRepository
인터페이스의 선언이 Spring Data JPA 규칙을 잘 따르고 있습니다.UUID
를 식별자 타입으로 사용한 것은 분산 시스템에 적합한 선택입니다.idle-presentation/src/main/kotlin/com/swm/idle/presentation/notification/controller/NotificationController.kt (3)
1-9
: 패키지 선언과 임포트가 적절합니다.패키지 선언과 임포트가 잘 구성되어 있습니다. 필요한 모든 클래스가 임포트되어 있으며, 불필요한 임포트는 없습니다.
16-18
: readNotification 메서드가 적절히 구현되었습니다.이 메서드는 인터페이스를 올바르게 구현하고 있으며, 작업을
notificationFacadeService
에 위임하고 있습니다. 단일 책임 원칙을 잘 따르고 있습니다.
20-26
: countUnreadNotification과 getNotifications 메서드가 적절히 구현되었습니다.두 메서드 모두 인터페이스를 올바르게 구현하고 있으며, 작업을
notificationFacadeService
에 위임하고 있습니다. 반환 타입도 인터페이스 명세와 일치합니다. 단일 책임 원칙을 잘 따르고 있어 좋습니다.idle-application/src/main/kotlin/com/swm/idle/application/jobposting/facade/JobPostingFavoriteFacadeService.kt (2)
Line range hint
1-46
: PR 목표와의 일치성 검토이 변경사항은 PR의 주요 목표인 채용 공고 지원자 발생 시 알림 발송과 직접적으로 관련되지 않지만, 전반적인 시스템 개선에 기여합니다:
- 즐겨찾기 기능의 개선: 중복 방지 및 재활성화 기능 추가
- 데이터 일관성 향상: 기존 즐겨찾기 항목의 재사용
이러한 변경사항은 사용자 경험을 개선하고 데이터 관리를 최적화하는 데 도움이 됩니다. 그러나 PR의 주요 목표인 알림 시스템 구현과 관련된 코드는 이 파일에 포함되어 있지 않습니다.
다음 스크립트를 실행하여 PR의 주요 목표와 관련된 코드를 확인하세요:
#!/bin/bash # Description: PR 목표와 관련된 코드 검색 # Test: FCM 관련 클래스 및 메서드 검색 rg --type kotlin -e "FCM|Firebase|Notification|Alert" -g "!test/**"
22-27
: 기존 즐겨찾기 확인 및 재활성화 로직 추가이 변경사항은 중복 즐겨찾기를 방지하고 이전에 비활성화된 즐겨찾기를 재활성화할 수 있게 해줍니다. 이는 사용자 경험을 개선하고 데이터 일관성을 유지하는 데 도움이 됩니다.
몇 가지 고려사항:
active()
메서드의 구현을 확인하여 예상대로 작동하는지 확인하세요.- 이 변경으로 인해 발생할 수 있는 성능 영향을 고려해 보세요. 데이터베이스 조회가 추가되었기 때문입니다.
- 이 변경사항이 프론트엔드에 미치는 영향을 검토하고, 필요한 경우 관련 문서를 업데이트하세요.
다음 스크립트를 실행하여
active()
메서드의 구현을 확인하세요:✅ Verification successful
active()
메서드 구현을 찾기 위한 추가 스크립트 실행
active()
메서드의 구현을 확인하기 위해 다음 스크립트를 실행해주세요:
active()
메서드 구현 확인 완료
active()
메서드가BaseEntity.kt
에 올바르게 구현되어 있으며,JobPostingFavorite
클래스에서 상속받아 정상적으로 사용되고 있음을 확인했습니다. 이로 인해 중복 즐겨찾기 방지 및 기존 즐겨찾기의 재활성화 로직이 의도대로 작동합니다.🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash # Description: `active()` 메서드의 구현 확인 # Test: JobPostingFavorite 클래스에서 active() 메서드 검색 ast-grep --lang kotlin --pattern 'class JobPostingFavorite { $$$ fun active() { $$$ } $$$ }'Length of output: 17448
Script:
#!/bin/bash # Description: `active()` 메서드 구현 확인을 위한 검색 # Test: Kotlin 파일에서 `active()` 메서드 정의 찾기 rg 'fun active\(' --type kotlinLength of output: 128
idle-application/src/main/kotlin/com/swm/idle/application/notification/domain/DeviceTokenService.kt (2)
Line range hint
1-23
: PR 목표와의 일치성 및 잠재적 사용이 변경 사항은 알림 시스템 구현이라는 PR의 목표와 잘 일치합니다. 새로 추가된
findByUserId
메서드는 특정 사용자에게 알림을 보내기 위해 디바이스 토큰을 검색하는 데 사용될 수 있습니다.이 메서드가 채용 공고 지원자 발생 시 센터 관리자에게 알림을 보내는 데 어떻게 활용될 것인지 간단히 설명해 주시면 좋겠습니다. 이는 코드의 목적과 사용 맥락을 더 명확히 이해하는 데 도움이 될 것입니다.
4-4
: 저장소 패키지 구조 변경 확인 필요
DeviceTokenJpaRepository
의 임포트 경로가 변경되었습니다. 이는 저장소 패키지 구조의 변경을 나타냅니다.프로젝트 전체에서 이 변경이 일관되게 적용되었는지 확인하십시오. 다음 스크립트를 실행하여 검증할 수 있습니다:
idle-presentation/src/main/kotlin/com/swm/idle/presentation/jobposting/api/CrawlingJobPostingApi.kt (1)
4-4
: import 문 순서 변경이 적절합니다.import 문의 순서를 변경한 것은 코드의 가독성을 향상시키거나 프로젝트의 import 정렬 규칙을 따르기 위한 것으로 보입니다. 이는 코드의 기능에 영향을 주지 않는 minor한 변경사항입니다.
idle-presentation/src/main/kotlin/com/swm/idle/presentation/jobposting/controller/CrawlingJobPostingController.kt (1)
8-8
: 패키지 변경에 따른 import 문 업데이트 확인
CursorScrollRequest
의 import 문이 변경되었습니다. 이는 클래스의 위치가 변경되었음을 나타냅니다.다음 스크립트를 실행하여
CursorScrollRequest
의 사용이 프로젝트 전체에서 일관되게 변경되었는지 확인하세요:✅ Verification successful
Import 변경 사항 확인 완료
모든
CursorScrollRequest
의 import가 새로운 패키지로 일관되게 업데이트되었습니다.🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash # Description: Verify that all imports of CursorScrollRequest are from the new package # Test: Search for old import. Expect: No results. echo "Checking for old imports:" rg --type kotlin "import com\.swm\.idle\.support\.transfer\.jobposting\.carer\.CursorScrollRequest" # Test: Search for new import. Expect: Results in relevant files. echo "Checking for new imports:" rg --type kotlin "import com\.swm\.idle\.support\.transfer\.common\.CursorScrollRequest" # Test: Search for usages of CursorScrollRequest. Expect: All usages to be from the new package. echo "Checking for usages:" rg --type kotlin "CursorScrollRequest"Length of output: 5650
idle-presentation/src/main/kotlin/com/swm/idle/presentation/jobposting/api/CarerJobPostingApi.kt (1)
4-4
: import 문 변경이 적절해 보입니다.
CursorScrollRequest
클래스의 import 문이 더 일반적인 패키지로 변경되었습니다. 이는 코드 구조 개선을 위한 리팩토링으로 보입니다.다음 스크립트를 실행하여 다른 파일들에서
CursorScrollRequest
의 사용을 확인하세요:✅ Verification successful
<!-- [monologue] [task verify_import_change_1/1] Verify the import statement change in `CarerJobPostingApi.kt`. [observations] - The shell script executed searched for both old and new import statements. - No files are using the old import `com.swm.idle.support.transfer.jobposting.carer.CursorScrollRequest`. - Multiple files are using the new import `com.swm.idle.support.transfer.common.CursorScrollRequest`. [analysis] - Since no files are using the old import, the refactoring has been successfully applied across the codebase. - The import change does not negatively impact any other parts of the codebase. - The change improves code organization by centralizing the `CursorScrollRequest` class. [actions] - Conclude the verification process by approving the change. -->변경된 import가 모든 관련 파일에서 올바르게 반영되었습니다.
변경된
CursorScrollRequest
클래스의 import 문이 코드베이스 전반에 걸쳐 성공적으로 적용되었습니다. 추가적인 문제가 발견되지 않았습니다.🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash # Description: Verify the usage of CursorScrollRequest in other files # Test: Search for the old import statement echo "Files still using the old import:" rg --type kotlin "import com\.swm\.idle\.support\.transfer\.jobposting\.carer\.CursorScrollRequest" # Test: Search for the new import statement echo "Files using the new import:" rg --type kotlin "import com\.swm\.idle\.support\.transfer\.common\.CursorScrollRequest"Length of output: 1864
idle-presentation/src/main/kotlin/com/swm/idle/presentation/jobposting/controller/CarerJobPostingController.kt (1)
9-9
: import 문 추가 확인
CursorScrollRequest
클래스의 import 문이 다시 추가되었습니다. 이 변경은 문제를 해결하거나 IDE 경고를 제거하는 데 도움이 될 수 있습니다.다음 스크립트를 실행하여 이 import 문이 실제로 필요한지 확인하세요:
✅ Verification successful
CursorScrollRequest Import 확인 완료
CursorScrollRequest
클래스가getJobPostings
메서드에서 사용되고 있어 import가 필요함을 확인했습니다. 해당 변경 사항을 승인합니다.🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash # Description: Verify the usage of CursorScrollRequest in the file # Test: Check if CursorScrollRequest is used in the file rg --type kotlin "CursorScrollRequest" idle-presentation/src/main/kotlin/com/swm/idle/presentation/jobposting/controller/CarerJobPostingController.kt # Test: Check if there are any unused imports in the file rg --type kotlin "^import.*" idle-presentation/src/main/kotlin/com/swm/idle/presentation/jobposting/controller/CarerJobPostingController.kt | rg -v "$(rg --type kotlin -o "\w+(?=\.|\s|$)" idle-presentation/src/main/kotlin/com/swm/idle/presentation/jobposting/controller/CarerJobPostingController.kt | sort -u | rg -v "^(package|import)$" | tr '\n' '|' | sed 's/|$//')"Length of output: 943
Script:
#!/bin/bash # Description: Verify if CursorScrollRequest is used in the CarerJobPostingController.kt file # Extract all imported classes imports=$(rg --type kotlin "^import" idle-presentation/src/main/kotlin/com/swm/idle/presentation/jobposting/controller/CarerJobPostingController.kt | awk '{print $2}' | awk -F '.' '{print $NF}') # Extract all used classes in the file except for imports and package declarations used=$(rg --type kotlin "^[^import|^package].*\b" idle-presentation/src/main/kotlin/com/swm/idle/presentation/jobposting/controller/CarerJobPostingController.kt | grep -oE '\b[A-Za-z_][A-Za-z0-9_]*\b' | sort -u) # Compare imports with used classes for imp in $imports; do if ! echo "$used" | grep -qw "$imp"; then echo "Unused import: $imp" fi doneLength of output: 24124
idle-domain/src/main/kotlin/com/swm/idle/domain/jobposting/repository/querydsl/JobPostingQueryRepository.kt (1)
33-33
: LGTM: entityStatus 필터링 추가이 변경사항은
ACTIVE
상태의 채용 공고만 포함되도록 보장하여 데이터의 정확성을 향상시킵니다. 이는 사용자에게 관련성 있는 최신 정보만 제공하는 데 도움이 됩니다.idle-domain/src/main/kotlin/com/swm/idle/domain/notification/repository/querydsl/NotificationQueryRepository.kt (2)
12-14
: 의존성 주입 방식이 적절합니다.
NotificationQueryRepository
클래스에서JPAQueryFactory
를 생성자 주입 방식으로 받아오는 것이 올바르게 구현되어 있습니다.
16-44
:findAllByUserId
메서드의 쿼리 구성과 조건 처리가 적절합니다.요청한 사용자 ID를 기반으로 알림을 조회하고,
next
파라미터를 활용하여 페이징을 구현한 점이 인상적입니다. 또한,EntityStatus.ACTIVE
상태인 알림만 조회하여 불필요한 데이터를 배제한 것도 좋습니다.idle-domain/src/main/kotlin/com/swm/idle/domain/notification/jpa/Notification.kt (1)
49-51
: 데이터베이스의 JSON 컬럼 타입 지원 여부 확인 필요
@Column(columnDefinition = "json")
을 사용하여notificationDetailsJson
을 저장하고 있는데, 사용 중인 데이터베이스에서 JSON 컬럼 타입을 지원하는지 확인해야 합니다. 일부 데이터베이스에서는 JSON 타입을 지원하지 않으므로, 이 경우 VARCHAR 또는 TEXT 타입으로 변경하거나 추가 설정이 필요할 수 있습니다.데이터베이스의 JSON 컬럼 지원 여부를 확인하기 위해 다음 스크립트를 실행할 수 있습니다:
idle-application/src/main/kotlin/com/swm/idle/application/notification/domain/NotificationService.kt (1)
40-43
: 읽음 처리 후 영속성 컨텍스트 반영 여부 확인 필요
@Transactional
을 통해 상태 변경이 이루어지지만,notification.read()
호출 후 변경 사항이 실제로 데이터베이스에 저장되는지 확인이 필요합니다. 필요하다면notificationJpaRepository.save(notification)
를 명시적으로 호출하는 것을 고려해보세요.idle-presentation/src/main/kotlin/com/swm/idle/presentation/notification/api/NotificationApi.kt (1)
1-64
: 코드 구현이 전체적으로 적절합니다인터페이스와 메서드들이 명확하게 정의되어 있으며, 필요한 어노테이션들도 올바르게 적용되었습니다.
@Component | ||
class NotificationDetailsConverter { | ||
|
||
private val objectMapper: ObjectMapper = ObjectMapper() |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🛠️ Refactor suggestion
ObjectMapper
의 의존성 주입을 고려해보세요.
현재 ObjectMapper
를 private 필드로 선언하고 즉시 초기화하고 있습니다. 이 방식도 괜찮지만, Spring의 의존성 주입을 활용하면 더 유연한 설계가 가능합니다. 다음과 같이 변경을 고려해보세요:
@Autowired
private lateinit var objectMapper: ObjectMapper
이렇게 하면 테스트 시 mock ObjectMapper
를 주입하기 쉬워지고, 애플리케이션 전체에서 일관된 ObjectMapper
설정을 사용할 수 있습니다.
fun convertToMap(details: String): Map<String, Any> { | ||
return objectMapper.readValue(details) | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
JSON 파싱 오류 처리를 추가하세요.
convertToMap
메서드가 JSON 문자열을 Map<String, Any>
로 변환하는 기능을 올바르게 구현하고 있습니다. 하지만 JSON 파싱 중 발생할 수 있는 예외 처리가 없습니다. 다음과 같이 예외 처리를 추가하는 것이 좋겠습니다:
fun convertToMap(details: String): Map<String, Any> {
return try {
objectMapper.readValue(details)
} catch (e: Exception) {
logger.error("JSON 파싱 중 오류 발생: $details", e)
emptyMap()
}
}
이렇게 하면 잘못된 JSON 형식으로 인한 예외를 처리하고, 로깅을 통해 문제를 추적할 수 있습니다.
@RestController | ||
class NotificationController( | ||
private val notificationFacadeService: NotificationFacadeService, | ||
) : NotificationApi { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🛠️ Refactor suggestion
생성자 수준의 의존성 주입을 고려해보세요.
클래스 선언과 생성자가 올바르게 구현되어 있습니다. 하지만 코드를 더 간결하게 만들기 위해 생성자 수준의 의존성 주입을 사용할 수 있습니다.
다음과 같이 변경을 고려해보세요:
@RestController
class NotificationController(
private val notificationFacadeService: NotificationFacadeService
) : NotificationApi {
// ... 메서드 구현 ...
}
이렇게 하면 private val
선언을 생성자 매개변수에 직접 할 수 있어 코드가 더 간결해집니다.
val notificationType: NotificationType, | ||
val createdAt: LocalDateTime, | ||
val imageUrl: String?, | ||
val notificationDetails: Map<String, Any>, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🛠️ Refactor suggestion
notificationDetails
의 타입을 구체화하여 타입 안전성 향상
notificationDetails
필드가 현재 Map<String, Any>
로 정의되어 있습니다. 타입 안정성을 높이고 잠재적인 런타임 오류를 방지하기 위해, 가능한 경우 값의 타입을 더 구체적으로 명시하는 것을 권장합니다. 예를 들어, 상세 정보에 대한 전용 데이터 클래스를 생성하여 사용할 수 있습니다.
.from(notification) | ||
.where( | ||
notification.receiverId.eq(userId) | ||
.and(next?.let { notification.id.goe(it) }) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🛠️ Refactor suggestion
next
파라미터의 조건 처리 방식 개선 제안
현재 next?.let { notification.id.goe(it) }
로 조건을 추가하고 있는데, 이 부분을 더욱 명확하게 표현하기 위해 next != null
체크를 별도로 하고 조건을 추가하는 것은 어떨까요? 이렇게 하면 조건의 가독성이 높아질 수 있습니다.
다음과 같이 수정할 수 있습니다:
.where(
notification.receiverId.eq(userId)
.and(
if (next != null) notification.id.goe(next) else null
)
.and(notification.entityStatus.eq(EntityStatus.ACTIVE))
)
fun findAllByUserId( | ||
next: UUID?, | ||
limit: Long, | ||
userId: UUID, | ||
): List<NotificationQueryDto> { | ||
return notificationQueryRepository.findAllByUserId( | ||
next = next, | ||
limit = limit, | ||
userId = userId, | ||
) | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🛠️ Refactor suggestion
'limit' 파라미터에 대한 유효성 검사 추가 권장
limit
값이 비정상적으로 큰 경우 시스템 성능에 영향이 있을 수 있습니다. 최대 허용 범위를 설정하고 이에 대한 유효성 검사를 추가하여 안전성을 강화하는 것이 좋습니다.
notificationService.getById(notificationId).also { | ||
notificationService.read(it) | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
이미 가져온 notification
객체를 재사용하세요.
라인 23에서 이미 notification
객체를 가져왔기 때문에, 동일한 객체를 재사용하여 불필요한 데이터베이스 접근을 줄일 수 있습니다. 이는 코드 효율성을 높이고 가독성을 향상시킵니다.
수정 제안:
- notificationService.getById(notificationId).also {
- notificationService.read(it)
- }
+ notificationService.read(notification)
📝 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.
notificationService.getById(notificationId).also { | |
notificationService.read(it) | |
} | |
notificationService.read(notification) |
fun readNotification(notificationId: UUID) { | ||
val notification = notificationService.getById(notificationId) | ||
|
||
if (notification.receiverId != getUserAuthentication().userId) { | ||
throw SecurityException.UnAuthorizedRequest() | ||
} | ||
|
||
notificationService.getById(notificationId).also { | ||
notificationService.read(it) | ||
} | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
쓰기 작업을 수행하는 메서드에 적절한 트랜잭션 설정을 적용하세요.
readNotification
메서드는 알림을 읽음으로 표시하여 데이터베이스를 수정합니다. 하지만 클래스 레벨에서 @Transactional(readOnly = true)
로 설정되어 있으므로, 쓰기 작업이 허용되지 않을 수 있습니다. 이 메서드에 별도로 @Transactional
어노테이션을 추가하여 쓰기 작업이 가능하도록 설정해야 합니다.
수정 제안:
+ @Transactional
fun readNotification(notificationId: UUID) {
val notification = notificationService.getById(notificationId)
if (notification.receiverId != getUserAuthentication().userId) {
throw SecurityException.UnAuthorizedRequest()
}
- notificationService.getById(notificationId).also {
- notificationService.read(it)
- }
+ notificationService.read(notification)
}
📝 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.
fun readNotification(notificationId: UUID) { | |
val notification = notificationService.getById(notificationId) | |
if (notification.receiverId != getUserAuthentication().userId) { | |
throw SecurityException.UnAuthorizedRequest() | |
} | |
notificationService.getById(notificationId).also { | |
notificationService.read(it) | |
} | |
} | |
@Transactional | |
fun readNotification(notificationId: UUID) { | |
val notification = notificationService.getById(notificationId) | |
if (notification.receiverId != getUserAuthentication().userId) { | |
throw SecurityException.UnAuthorizedRequest() | |
} | |
notificationService.read(notification) | |
} |
@Operation(summary = "알림 전체 조회 API") | ||
@GetMapping("/my") | ||
@ResponseStatus(HttpStatus.OK) | ||
fun getNotifications(request: CursorScrollRequest): NotificationScrollResponse |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
GET 요청에서 객체 파라미터 바인딩 문제
GET 요청에서 객체 타입의 파라미터를 받을 때는 @ModelAttribute
어노테이션을 사용하여 파라미터를 바인딩해야 합니다. 그렇지 않으면 파라미터 바인딩이 제대로 이루어지지 않을 수 있습니다.
다음과 같이 수정할 수 있습니다:
- fun getNotifications(request: CursorScrollRequest): NotificationScrollResponse
+ fun getNotifications(@ModelAttribute request: CursorScrollRequest): NotificationScrollResponse
📝 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.
fun getNotifications(request: CursorScrollRequest): NotificationScrollResponse | |
fun getNotifications(@ModelAttribute request: CursorScrollRequest): NotificationScrollResponse |
responseCode = "400", | ||
description = "처리 실패 - 본인이 아닌, 인증되지 않은 사용자가 읽음 처리를 시도한 경우", | ||
content = [ | ||
Content( | ||
mediaType = "application/json", | ||
schema = Schema( | ||
implementation = ErrorResponse::class | ||
) | ||
), | ||
] | ||
), |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
HTTP 상태 코드 수정 필요
인증되지 않은 사용자나 권한이 없는 사용자가 알림 읽음 처리를 시도할 때, HTTP 상태 코드를 400 Bad Request
대신 403 Forbidden
또는 401 Unauthorized
로 변경하는 것이 더 적절합니다.
다음과 같이 수정할 수 있습니다:
- responseCode = "400",
+ responseCode = "403",
📝 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.
responseCode = "400", | |
description = "처리 실패 - 본인이 아닌, 인증되지 않은 사용자가 읽음 처리를 시도한 경우", | |
content = [ | |
Content( | |
mediaType = "application/json", | |
schema = Schema( | |
implementation = ErrorResponse::class | |
) | |
), | |
] | |
), | |
responseCode = "403", | |
description = "처리 실패 - 본인이 아닌, 인증되지 않은 사용자가 읽음 처리를 시도한 경우", | |
content = [ | |
Content( | |
mediaType = "application/json", | |
schema = Schema( | |
implementation = ErrorResponse::class | |
) | |
), | |
] | |
), |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 5
🧹 Outside diff range and nitpick comments (5)
idle-domain/src/main/kotlin/com/swm/idle/domain/applys/event/ApplyEvent.kt (1)
7-11
: 데이터 클래스 선언이 적절합니다.
ApplyEvent
데이터 클래스의 선언이 간결하고 적절합니다. 필요한 정보를 잘 캡슐화하고 있습니다.각 프로퍼티에 대한 간단한 설명을 KDoc 주석으로 추가하면 코드의 가독성과 유지보수성이 향상될 것 같습니다. 예를 들어:
/** * @property deviceToken 알림을 보낼 디바이스의 토큰 * @property notificationId 알림의 고유 식별자 * @property notificationInfo 알림에 포함될 정보 */ data class ApplyEvent( val deviceToken: DeviceToken, val notificationId: UUID, val notificationInfo: NotificationInfo, )idle-application/src/main/kotlin/com/swm/idle/application/applys/vo/CarerApplyNotificationInfo.kt (2)
7-14
: 데이터 클래스 선언이 잘 되어 있습니다.
CarerApplyNotificationInfo
데이터 클래스가NotificationInfo
인터페이스를 올바르게 구현하고 있습니다. 모든 필요한 속성이 포함되어 있으며, 널 허용 타입을 적절히 사용하고 있습니다.가독성을 높이기 위해 각 속성을 새 줄에 배치하는 것을 고려해 보세요. 예를 들면 다음과 같습니다:
data class CarerApplyNotificationInfo( override val title: String, override val body: String, override val receiverId: UUID, override val notificationType: NotificationType, override val imageUrl: String?, override val notificationDetails: Map<String, Any>? ) : NotificationInfo
16-39
: 팩토리 메서드가 잘 구현되어 있습니다.
create
팩토리 메서드가CarerApplyNotificationInfo
인스턴스를 생성하는 편리한 방법을 제공하고 있습니다. 추가 세부 정보를 위한 맵 사용은 확장성을 제공합니다.null 안전성을 개선하기 위해
notificationDetails
를 불변(immutable) 맵으로 만드는 것을 고려해 보세요. 예를 들면 다음과 같습니다:val notificationDetails = mapOf( "jobPostingId" to jobPostingId ).toMap()이렇게 하면
notificationDetails
가 변경되지 않도록 보장할 수 있습니다.idle-application/src/main/kotlin/com/swm/idle/application/applys/facade/CarerApplyFacadeService.kt (1)
29-37
: 생성자 변경 승인 및 개선 제안새로운 의존성들이 클래스의 확장된 기능에 맞게 적절히 추가되었습니다.
다만, 가독성 향상을 위해 다음과 같이 의존성들을 그룹화하는 것을 고려해 보시기 바랍니다:
class CarerApplyFacadeService( private val carerApplyService: CarerApplyService, private val carerApplyEventPublisher: CarerApplyEventPublisher, private val jobPostingService: JobPostingService, private val carerService: CarerService, private val centerManagerService: CenterManagerService, private val centerService: CenterService, private val deviceTokenService: DeviceTokenService, private val notificationService: NotificationService, )이렇게 그룹화하면 각 의존성의 역할을 더 쉽게 파악할 수 있습니다.
idle-infrastructure/fcm/src/main/kotlin/com/swm/idle/infrastructure/fcm/applys/service/CarerApplyEventService.kt (1)
46-46
: 불필요한 세미콜론 제거Kotlin에서는 세미콜론이 필요하지 않으며 일반적으로 생략됩니다. 46번째 줄의 세미콜론을 제거하여 코드 스타일의 일관성을 유지하는 것이 좋습니다.
- .build(); + .build()
📜 Review details
Configuration used: .coderabbit.yaml
Review profile: CHILL
📒 Files selected for processing (8)
- idle-application/src/main/kotlin/com/swm/idle/application/applys/facade/CarerApplyFacadeService.kt (1 hunks)
- idle-application/src/main/kotlin/com/swm/idle/application/applys/vo/CarerApplyNotificationInfo.kt (1 hunks)
- idle-domain/src/main/kotlin/com/swm/idle/domain/applys/event/ApplyEvent.kt (1 hunks)
- idle-domain/src/main/kotlin/com/swm/idle/domain/notification/enums/NotificationType.kt (1 hunks)
- idle-infrastructure/fcm/src/main/kotlin/com/swm/idle/infrastructure/fcm/applys/listener/CarerApplyEventListener.kt (1 hunks)
- idle-infrastructure/fcm/src/main/kotlin/com/swm/idle/infrastructure/fcm/applys/service/CarerApplyEventService.kt (1 hunks)
- idle-infrastructure/fcm/src/main/kotlin/com/swm/idle/infrastructure/fcm/common/client/FcmClient.kt (1 hunks)
- idle-infrastructure/fcm/src/main/resources/application-fcm.yml (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (3)
- idle-domain/src/main/kotlin/com/swm/idle/domain/notification/enums/NotificationType.kt
- idle-infrastructure/fcm/src/main/kotlin/com/swm/idle/infrastructure/fcm/applys/listener/CarerApplyEventListener.kt
- idle-infrastructure/fcm/src/main/resources/application-fcm.yml
🧰 Additional context used
🪛 detekt
idle-infrastructure/fcm/src/main/kotlin/com/swm/idle/infrastructure/fcm/applys/service/CarerApplyEventService.kt
[warning] 22-22: The caught exception is swallowed. The original exception could be lost.
(detekt.exceptions.SwallowedException)
🔇 Additional comments (12)
idle-infrastructure/fcm/src/main/kotlin/com/swm/idle/infrastructure/fcm/common/client/FcmClient.kt (1)
1-5
: 패키지 선언과 임포트가 적절합니다.패키지 선언과 필요한 클래스들의 임포트가 올바르게 되어 있습니다. 현재 구현에 필요한 모든 요소가 포함되어 있습니다.
idle-domain/src/main/kotlin/com/swm/idle/domain/applys/event/ApplyEvent.kt (2)
1-5
: 패키지 선언과 임포트가 적절합니다.패키지 선언과 필요한 클래스들의 임포트가 올바르게 되어 있습니다. 코드 구조가 잘 정리되어 있습니다.
13-23
: 🛠️ Refactor suggestion팩토리 메서드의 필요성을 재고해 보세요.
현재
createApplyEvent
팩토리 메서드는 단순히ApplyEvent
인스턴스를 생성하여 반환하고 있습니다. 이는 데이터 클래스의 기본 생성자가 이미 제공하는 기능과 동일합니다.팩토리 메서드를 유지해야 할 특별한 이유가 없다면, 다음과 같이 제거하는 것이 좋겠습니다:
data class ApplyEvent( val deviceToken: DeviceToken, val notificationId: UUID, val notificationInfo: NotificationInfo, ) -{ - - companion object { - - fun createApplyEvent( - deviceToken: DeviceToken, - notificationId: UUID, - notificationInfo: NotificationInfo, - ): ApplyEvent { - return ApplyEvent(deviceToken, notificationId, notificationInfo) - } - - } - -}만약 이 메서드가 필요한 특별한 이유가 있다면, 그 이유를 주석으로 추가하는 것이 좋겠습니다.
이 의견은 이전 리뷰에서도 제시되었던 내용입니다. 아직 해결되지 않은 것 같아 다시 언급합니다.
idle-application/src/main/kotlin/com/swm/idle/application/applys/vo/CarerApplyNotificationInfo.kt (1)
1-6
: 패키지 선언 및 임포트가 적절합니다.패키지 선언과 임포트가 올바르게 되어 있으며, 필요한 모든 클래스와 인터페이스가 임포트되어 있습니다.
idle-application/src/main/kotlin/com/swm/idle/application/applys/facade/CarerApplyFacadeService.kt (3)
3-21
: import 문 변경 승인새로운 기능과 의존성에 필요한 import 문들이 적절히 추가되었습니다. 불필요한 import는 없어 보입니다.
40-40
: 트랜잭션 전파 레벨 변경 승인
Propagation.REQUIRES_NEW
를 사용하여 새로운 트랜잭션에서 메서드가 실행되도록 한 것은 적절합니다. 이는 PR의 목표와 일치하며, 알림 발송 실패가 비즈니스 로직 트랜잭션의 롤백을 유발하지 않도록 합니다.
1-101
: 전체적인 변경 사항 검토이 PR의 변경 사항들은 PR 목표에 잘 부합합니다:
- FCM을 이용한 알림 시스템이 성공적으로 구현되었습니다.
- 이벤트 기반 아키텍처를 활용하여 애플리케이션 계층과 인프라 계층 간의 결합도를 낮추었습니다.
REQUIRES_NEW
트랜잭션 전파 레벨을 사용하여 알림 발송 실패가 비즈니스 로직에 영향을 미치지 않도록 했습니다.코드는 전반적으로 잘 구조화되어 있고 Kotlin의 모범 사례를 따르고 있습니다. 제안된 개선 사항들을 적용하면 코드의 안정성과 유연성이 더욱 향상될 것입니다.
idle-infrastructure/fcm/src/main/kotlin/com/swm/idle/infrastructure/fcm/applys/service/CarerApplyEventService.kt (5)
1-9
: 패키지 및 임포트가 적절하게 구성되었습니다필요한 패키지 선언과 라이브러리 임포트가 올바르게 설정되었습니다.
15-16
: 로거 초기화가 올바릅니다KotlinLogging을 사용하여 로거를 초기화한 것은 좋은 선택입니다.
17-25
: 이전 리뷰 코멘트가 여전히 적용됩니다이전 리뷰에서
send
메서드의 예외 처리에 대한 개선 사항이 제안되었습니다. 해당 코멘트를 참고하여 예외 발생 시 원본 예외 정보를 로깅하는 것이 좋습니다.🧰 Tools
🪛 detekt
[warning] 22-22: The caught exception is swallowed. The original exception could be lost.
(detekt.exceptions.SwallowedException)
27-32
: 알림 생성 메서드가 정상적으로 구현되었습니다
createApplyNotification
메서드는 Notification 객체를 올바르게 생성하고 있습니다.
34-47
: 메시지 생성 메서드가 올바르게 구현되었습니다
createMessage
메서드는 필요한 데이터를 포함하여 Message 객체를 정확하게 빌드하고 있습니다.
@Component | ||
class FcmClient { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🛠️ Refactor suggestion
클래스 선언을 개선할 수 있습니다.
현재 구현은 @Component
어노테이션을 사용하여 Spring 빈으로 잘 관리되고 있습니다. 하지만 다음과 같은 개선을 고려해 보시기 바랍니다:
- 인터페이스 도입:
FcmClient
를 인터페이스로 정의하고 구현 클래스를 별도로 만들면 추상화 수준을 높이고 테스트 용이성을 개선할 수 있습니다. - 생성자 주입:
FirebaseMessaging
인스턴스를 생성자를 통해 주입받도록 변경하면 의존성 관리와 테스트가 더 쉬워집니다.
예시 코드:
interface FcmClient {
fun send(message: Message)
}
@Component
class FirebaseFcmClient(private val firebaseMessaging: FirebaseMessaging) : FcmClient {
override fun send(message: Message) {
firebaseMessaging.sendAsync(message)
}
}
이렇게 변경하면 코드의 유연성과 테스트 용이성이 향상됩니다.
fun send(message: Message) { | ||
FirebaseMessaging.getInstance().sendAsync(message) | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🛠️ Refactor suggestion
send
메서드의 구현을 개선할 수 있습니다.
현재 구현은 간단하고 비동기 전송을 사용하고 있어 좋습니다. 하지만 다음과 같은 개선 사항을 고려해 보시기 바랍니다:
- 오류 처리: 예외 상황에 대한 처리가 없습니다.
- 로깅: 메시지 전송 성공 또는 실패에 대한 로깅이 없습니다.
- 피드백: 메서드가 작업의 성공 또는 실패에 대한 피드백을 제공하지 않습니다.
다음과 같은 개선된 구현을 고려해 보세요:
fun send(message: Message): CompletableFuture<String> {
return CompletableFuture.supplyAsync {
try {
logger.info("Sending FCM message: $message")
val response = firebaseMessaging.sendAsync(message).get()
logger.info("FCM message sent successfully: ${response.messageId}")
response.messageId
} catch (e: Exception) {
logger.error("Failed to send FCM message", e)
throw e
}
}
}
이 구현은 오류 처리, 로깅, 그리고 비동기 작업의 결과를 CompletableFuture
로 반환하여 호출자에게 피드백을 제공합니다.
package com.swm.idle.infrastructure.fcm.common.client | ||
|
||
import com.google.firebase.messaging.FirebaseMessaging | ||
import com.google.firebase.messaging.Message | ||
import org.springframework.stereotype.Component | ||
|
||
@Component | ||
class FcmClient { | ||
|
||
fun send(message: Message) { | ||
FirebaseMessaging.getInstance().sendAsync(message) | ||
} | ||
|
||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🛠️ Refactor suggestion
클래스에 로거 추가 및 Firebase 초기화 확인이 필요합니다.
현재 구현에서 개선할 수 있는 두 가지 중요한 점이 있습니다:
- 로거 추가: 클래스에 로거를 추가하면 디버깅과 모니터링이 더 쉬워집니다.
private val logger = LoggerFactory.getLogger(FcmClient::class.java)
- Firebase 초기화:
FirebaseMessaging.getInstance()
를 사용하고 있지만, Firebase가 적절히 초기화되었는지 확인이 필요합니다. 이는 보통 애플리케이션 시작 시 수행되어야 합니다.
@Configuration
class FirebaseConfig {
@PostConstruct
fun initialize() {
try {
FirebaseApp.initializeApp()
} catch (e: IOException) {
logger.error("Firebase 초기화 실패", e)
}
}
}
이러한 추가 사항들은 클래스의 안정성과 유지보수성을 크게 향상시킬 것입니다.
centerManagers?.map { centerManager -> | ||
val deviceToken = deviceTokenService.findByUserId(centerManager.id) | ||
|
||
if (deviceToken != null) { | ||
val notificationInfo = CarerApplyNotificationInfo( | ||
title = "${carer.name} 님이 공고에 지원하였습니다.", | ||
body = createBodyMessage(jobPosting), | ||
receiverId = centerManager.id, | ||
notificationType = NotificationType.APPLICANT, | ||
imageUrl = carer.profileImageUrl, | ||
notificationDetails = mapOf( | ||
"jobPostingId" to jobPostingId, | ||
) | ||
) | ||
|
||
val notification = notificationService.create(notificationInfo) | ||
|
||
ApplyEvent.createApplyEvent( | ||
deviceToken = deviceToken, | ||
notificationId = notification.id, | ||
notificationInfo = notificationInfo | ||
).also { | ||
carerApplyEventPublisher.publish(it) | ||
} | ||
} | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Null 안전성 개선 및 오류 로깅 추가 제안
centerManagers
가 null일 경우를 처리하지 않고 있습니다. 또한, 알림 발송 과정에서 발생할 수 있는 예외 처리가 없습니다. 다음과 같은 개선을 제안합니다:
- Null 안전성 개선:
centerManagers?.forEach { centerManager ->
// ... 기존 코드 ...
} ?: run {
logger.warn("No approved center managers found for job posting $jobPostingId")
}
- 오류 로깅 추가:
try {
// 알림 생성 및 이벤트 발행 코드
} catch (e: Exception) {
logger.error("Failed to send notification for job posting $jobPostingId", e)
}
이러한 변경으로 코드의 안정성과 디버깅 용이성이 향상될 것입니다.
...pplication/src/main/kotlin/com/swm/idle/application/applys/facade/CarerApplyFacadeService.kt
Show resolved
Hide resolved
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 1
🧹 Outside diff range and nitpick comments (1)
idle-domain/src/main/resources/application-domain.yml (1)
프로덕션 환경에 개발용 JPA 설정이 적용되었습니다.
application-domain.yml
파일에서 다음 설정이 프로덕션 관련 프로필에 잘못 적용되어 있습니다:
spring.jpa.hibernate.ddl-auto: update
spring.jpa.show-sql: true
이 설정들은 프로덕션 환경에서 자동 스키마 변경 및 SQL 로그 출력을 유발할 수 있어, 보안 및 안정성에 영향을 미칠 수 있습니다. 해당 설정을 프로덕션 프로필에서 제거하거나 적절히 재구성해 주세요.
🔗 Analysis chain
Line range hint
1-35
: 로컬 프로필에 새로운 JPA 설정이 추가되었습니다.
local
프로필에 다음과 같은 새로운 JPA 설정이 추가되었습니다:
spring.jpa.hibernate.ddl-auto: update
spring.jpa.show-sql: true
이러한 변경사항은 다음과 같은 영향을 줄 수 있습니다:
ddl-auto: update
는 개발 중 스키마 변경을 자동으로 적용하여 편의성을 제공합니다.show-sql: true
는 SQL 쿼리를 로그에 출력하여 디버깅에 도움을 줍니다.그러나 이러한 설정은 개발 환경에서만 사용해야 하며, 프로덕션 환경에서는 사용하지 않도록 주의해야 합니다.
다음 스크립트를 실행하여 이러한 설정이 다른 프로필이나 환경에 잘못 적용되지 않았는지 확인해 주세요:
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash # 설명: 프로덕션 관련 설정 파일에서 개발용 설정이 있는지 확인합니다. # 테스트: prod 또는 production이 포함된 yml 파일에서 개발용 설정을 검색합니다. fd -e yml -e yaml | rg 'prod|production' | xargs rg 'ddl-auto:\s*update|show-sql:\s*true'Length of output: 318
📜 Review details
Configuration used: .coderabbit.yaml
Review profile: CHILL
📒 Files selected for processing (4)
- .github/workflows/prod-server-deployer.yaml (1 hunks)
- .github/workflows/prod-server-integrator.yaml (1 hunks)
- idle-domain/src/main/resources/application-domain.yml (1 hunks)
- idle-infrastructure/fcm/src/main/resources/application-fcm.yml (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
- idle-infrastructure/fcm/src/main/resources/application-fcm.yml
🧰 Additional context used
🔇 Additional comments (2)
idle-domain/src/main/resources/application-domain.yml (1)
35-35
: 개발 환경에서의ddl-auto
설정 변경에 주의가 필요합니다.
dev
프로필에서spring.jpa.hibernate.ddl-auto
를validate
에서update
로 변경하셨습니다. 이 변경은 다음과 같은 영향을 줄 수 있습니다:
- 자동으로 스키마를 업데이트하여 개발 과정에서의 편의성이 향상됩니다.
- 하지만, 의도하지 않은 스키마 변경이 발생할 수 있어 데이터 무결성에 위험이 될 수 있습니다.
개발 환경에서도 데이터의 일관성과 무결성이 중요하므로, 이 설정 변경의 영향을 충분히 고려해 주시기 바랍니다.
다음 스크립트를 실행하여 다른 환경 설정 파일에서도 이 변경이 일관되게 적용되었는지 확인해 주세요:
#!/bin/bash # 설명: 다른 환경 설정 파일에서 ddl-auto 설정을 확인합니다. # 테스트: 모든 application*.yml 파일에서 ddl-auto 설정을 검색합니다. fd -e yml -e yaml -x rg --type yaml 'ddl-auto:'.github/workflows/prod-server-integrator.yaml (1)
6-6
: 브랜치 트리거 변경 의도 확인 필요'main' 브랜치에서 'feat/IDLE-400' 브랜치로 워크플로우 트리거가 변경되었습니다. 이는 의도적인 변경인지 확인이 필요합니다.
고려사항:
- 이 변경이 임시적이라면, PR 병합 전에 'main'으로 되돌려야 합니다.
- 장기적으로 이 변경을 유지하려면, 'main' 브랜치에 대한 CI/CD가 중단될 수 있습니다.
- 두 브랜치 모두에서 워크플로우를 실행하려면, 다음과 같이 수정하는 것이 좋습니다:
on: push: branches: - main - feat/IDLE-400의도를 확인하고 적절한 조치를 취해주세요.
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 0
🧹 Outside diff range and nitpick comments (1)
.github/workflows/dev-server-deployer.yaml (1)
Line range hint
1-124
: 워크플로우 파일 변경 요약이 PR에서
dev-server-deployer.yaml
워크플로우 파일의 주요 변경 사항은 Firebase 서비스 키 설정 경로의 업데이트입니다. 이 변경은 프로젝트의 새로운 모듈화 구조를 반영하며, FCM 기능을 별도의 모듈로 분리한 것으로 보입니다.전반적인 배포 프로세스와 워크플로우의 다른 부분들은 변경되지 않았습니다. 이는 새로운 알림 시스템 구현이 기존의 배포 프로세스에 큰 영향을 주지 않았음을 시사합니다.
모듈화된 구조로의 전환은 좋은 아키텍처 결정으로 보입니다. 향후 다른 인프라 관련 모듈을 추가할 때도 이와 같은 방식으로 구조화하는 것이 좋을 것 같습니다.
📜 Review details
Configuration used: .coderabbit.yaml
Review profile: CHILL
📒 Files selected for processing (3)
- .github/workflows/dev-server-deployer.yaml (1 hunks)
- .github/workflows/dev-server-integrator.yaml (1 hunks)
- .github/workflows/prod-server-deployer.yaml (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
- .github/workflows/prod-server-deployer.yaml
🧰 Additional context used
🔇 Additional comments (2)
.github/workflows/dev-server-integrator.yaml (1)
6-6
: 브랜치 트리거 변경에 대한 검토 필요'develop' 브랜치에서 'feat/IDLE-400' 브랜치로의 트리거 변경을 확인했습니다.
이 변경의 의도가 무엇인지 명확히 해주시겠습니까? 이는 IDLE-400 기능을 격리된 환경에서 테스트하기 위한 임시 조치인가요?
이 변경이 전체 개발 워크플로우에 미칠 수 있는 영향을 고려해 주시기 바랍니다. 'develop' 브랜치에 대한 CI/CD 파이프라인이 중단될 수 있습니다.
제안:
- 테스트 후 이 변경을 원래대로 되돌리는 것을 고려해 주세요.
- 또는 기능 브랜치를 위한 별도의 워크플로우를 만드는 것이 더 나을 수 있습니다.
.github/workflows/dev-server-deployer.yaml (1)
47-49
: Firebase 서비스 키 설정 경로 변경 확인Firebase 서비스 키 설정 경로가 변경되었습니다. 이는 프로젝트의 모듈화 구조를 반영하는 것으로 보입니다.
다음 스크립트를 실행하여 새 경로가 프로젝트 구조와 일치하는지 확인하세요:
* [IDLE-000] Production CI 스크립트 작성 * [IDLE-000] 센터 공고 수정 API 내 접수 방법 null 비허용 * [IDLE-000] 공고 지원자 조회 시, 삭제된 유저는 조회되지 않도록 수정 * [IDLE-363] 센터 관리자 전화 인증 요청 API * [IDLE-363] 개발 환경 ddl-auto 옵션 임시로 create 옵션으로 변경 * [IDLE-365] 공고 크롤러 selenium 로직 수정 및 로컬 동작 확인 * [IDLE-365] 테스트를 위한 스케줄러 기준 시각 변경 * [IDLE-365] batch job enable 옵션 비활성화 * [IDLE-365] ddl-auto update로 변경 * [IDLE-365] 크롤링 공고 필드 null 비허용 * [IDLE-365] 스케줄러 시간 02시로 설정 * [IDLE-366] spring batch selenium 크롤링을 위한 빌드 스크립트 수정 * [IDLE-366] worknet 사이트가 고용 24 사이트로 통합됨에 따라, 크롤링 스크립트 수정 * [IDLE-366] 크롤러 동작 스케줄링 시간 변경 * [IDLE-366] 스프링 초기 실행 시, spring batch 자동 실행 방지 옵션 추가 * [IDLE-366] spring batch 5 버전에서 업데이트 된 변경사항 적용 및 별도의 JobLauncher 구현 * [IDLE-366] 불필요 의존성 및 옵션 제거 * [IDLE-366] 크롤링 조회 API 내 entity status 필드 추가 및 쿼리 수정 * [IDLE-358] 운영 환경 CD 구축 및 운영 환경 profile 설정 추가 * [IDLE-358] 운영 환경 docker run 실행 시 예외 처리 * [IDLE-000] 크롤링 전체 조회 DTO 생성자 추가 * [IDLE-000] 공고 전체 조회 fetchJoin() 중복 이슈 해결을 위한 subquery 분리 * [IDLE-000] AI 코드리뷰 coderabbit 도입 * [IDLE-000] 크롤링 공고 반경범위 조회 필터를 위한 where절 추가 * [IDLE-000] TimeZone 설정이 적용되지 않는 문제 해결 * [IDLE-000] TimeZone 지정 및 @EnableScheduling 설정 * [IDLE-000] TimeZone 설정 제거 * [IDLE-000] 공고 전체 조회 쿼리 롤백 * [IDLE-000] 기존 공고 내 location을 기반으로 위.경도 값을 decoding하도록 변경 * [IDLE-000] 배포 전 최종 QA * [IDLE-000] 크롤링 공고 생성일자 필드 type 변경(timestamp -> date) * [IDLE-000] Redis 비밀번호 설정 추가 (#171) * [IDLE-000] Redis 비밀번호 설정 추가 * [IDLE-000] yaml 파일에 password 필드 추가 * [IDLE-000] redis local default password 설정 * [IDLE-000] compose 파일 내, 비밀번호 지정 command 설정 * [IDLE-000] Redis 볼륨 설정 * [IDLE-000] ci triggering branch 임시 변경 * [IDLE-000] ci triggering branch 롤백 * [IDLE-000] 테스트 심사 통과를 위한 전화번호 검증 로직 추가 * [IDLE-000] 테스트 심사 통과를 위한 전화번호 검증 로직 추가 * [IDLE-389] 센터 인증 요청 이벤트 발생 시, 디스코드 웹훅 알림을 전송하는 로직 작성 * [IDLE-389] 사업자 등록번호 client properties 클래스명 변경 * [IDLE-389] 코드 리뷰 반영 * [IDLE-000] 트랜잭션 전파 레벨 변경(REQUIRED -> REQUIRES_NEW) * [IDLE-396] FCM 모듈 추가 및 firebase 의존성 설정 * readme 제목 수정 * readme 제목 수정 * [IDLE-399] FCM Device Token 관리 API * [IDLE-399] 알림 도메인 설계 * [IDLE-000] fcm service 설정값 주입을 위한 디렉토리 구조 변경 * [IDLE-000] fcm service 설정값 주입을 위한 디렉토리 구조 변경 * [IDLE-400] 채용 공고 지원자 발생 시, 센터 관리자에게 알림을 발송한다. * [IDLE-400] fcm 모듈 설정 추가 * [IDLE-400] 공고 지원자 발생 시, 모든 센터 관리자들에게 다중 알림을 발송한다. * [IDLE-415] 알림 조회 처리 API * [IDLE-417] 읽지 않은 알림 수 집계 API * [IDLE-418] 알림 목록 조회 API * [IDLE-418] 피드백 반영 * [IDLE-423] soft-delete가 적용된 즐겨찾기 entity에서, 즐겨찾기 해제 후 다시 설정하는 경우 발생하는 버그를 해결한다. * [IDLE-424] 요양 보호사 공고 전체 조회 시, 삭제된 공고가 함께 보이는 문제 해결 * [IDLE-400] 채용 공고 지원자 발생 시, 센터 관리자에게 알림을 발송한다. (#183) * [IDLE-400] 채용 공고 지원자 발생 시, 센터 관리자에게 알림을 발송한다. * [IDLE-400] fcm 모듈 설정 추가 * [IDLE-400] 공고 지원자 발생 시, 모든 센터 관리자들에게 다중 알림을 발송한다. * [IDLE-400] 채용 공고 지원자 발생 시, 센터 관리자에게 알림을 발송한다. * [IDLE-400] fcm 모듈 설정 추가 * [IDLE-400] 공고 지원자 발생 시, 모든 센터 관리자들에게 다중 알림을 발송한다. * [IDLE-415] 알림 조회 처리 API * [IDLE-417] 읽지 않은 알림 수 집계 API * [IDLE-418] 알림 목록 조회 API * [IDLE-418] 피드백 반영 * [IDLE-423] soft-delete가 적용된 즐겨찾기 entity에서, 즐겨찾기 해제 후 다시 설정하는 경우 발생하는 버그를 해결한다. * [IDLE-424] 요양 보호사 공고 전체 조회 시, 삭제된 공고가 함께 보이는 문제 해결 * [IDLE-400] 알림 명세 변경 * [IDLE-400] fcm 설정 파일 디렉토리 path 변경 * [IDLE-400] ddl 옵션 변경 * [IDLE-400] ci/cd 옵션 변경 * [IDLE-000] ci triggering branch 복구 * [IDLE-000] develop 환경에서 fcm service 설정 파일 path 수정 * [IDLE-000] fcm service json 파일명 변경 * [IDLE-000] firebase service key 설정 경로 체크를 위해, cd 스크립트를 수정합니다. * Update README.md * [IDLE-000] fcm service key 경로를 class path 경로로 수정 시도 * [IDLE-000] ci triggering branch 임시 변경 * [IDLE-000] firebaseApp 초기화 임시 비활성화 * [IDLE-000] firebaseApp 초기화 임시 비활성화 * [IDLE-000] firebaseApp 초기화 임시 비활성화 * [IDLE-000] file path 앞에 ./ 제외 * [IDLE-000] 절대 경로로 변경 시도 * [IDLE-000] fcm service key 생성 path 수정 * [IDLE-000] fcm service key json file 생성 스크립트 작성 * [IDLE-000] ci triggering branch develop으로 롤백 * [IDLE-000] 불필요 스크립트 제거 * [IDLE-000] firebase config의 현재 경로를 출력하도록 print문 추가 (#197) * [IDLE-000] firebase config의 현재 경로를 출력하도록 print문 추가 * [IDLE-000] ci triggering branch 수정 * [IDLE-000] ci triggering branch 수정 * [IDLE-000] firebase app 초기화 로직 주석 처리 * [IDLE-000] firebase app 초기화 로직 주석 처리 * [IDLE-000] firebase app 초기화 로직 주석 처리 * [IDLE-000] file 대신 string으로 주입받아 초기화하는 방식으로 전환 * [IDLE-000] 일반 string 대신 base64 인코딩 된 문자열을 주입하도록 처리 * [IDLE-000] 일반 string 주입으로 rollback * [IDLE-000] json string log 추가 * [IDLE-000] base64 문자열로 재 변경 * [IDLE-000] firebase config의 현재 경로를 출력하도록 print문 추가 * [IDLE-429] DB 형상관리를 위한 Flyway 적용 * [IDLE-429] Flyway latest version으로 설정 * [IDLE-429] 피드백 반영 * [IDLE-000] firebase config의 현재 경로를 출력하도록 print문 추가 * [IDLE-000] 알림 조회 처리 로직에 @transactional 추가 * [IDLE-000] 알림 조회 시, 생성 시각 기준이 아닌 uuid v7 id 기준으로 내림차순 정렬하도록 변경 * [IDLE-000] CI 트리거 브랜치 복구 * [IDLE-454] 테스트를 위한 크롤링 수행 시각 변경 및 로깅 추가 * [IDLE-000] 공고 범위 검색 내 중복 데이터 발생 방지 * [IDLE-000] ci 트리거 브랜치 변경 * [IDLE-000] ci 트리거 브랜치 롤백 * [IDLE-000] monitoring 모듈 추가 및 actuator, prometheus 의존성 추가 * [IDLE-456] monitoring.yml 작성 * [IDLE-456] monitoring profile 추가 * [IDLE-456] actuator dependency group name 수정 * [IDLE-000] 크롤링 주기 하루 2회로 변경 * [IDLE-000] 불필요 로그 제거 * [IDLE-000] 인증번호 SMS 내용 수정 * [IDLE-000] classPath 하위 yaml 파일 확장자 모두 .yml로 통일 * [IDLE-000] 즐겨찾기 facade service에 트랜잭션 추가 (#206) * [IDLE-000] firebase config의 현재 경로를 출력하도록 print문 추가 * [IDLE-000] facade service에 transaction 추가 * [IDLE-461] 유저가 다중 디바이스에서 알림을 받을 수 있도록 개선한다. (#207) * [IDLE-000] firebase config의 현재 경로를 출력하도록 print문 추가 * [IDLE-461] 한 유저가 다중 디바이스 설정이 가능하도록 한다. * [IDLE-000] firebase config의 현재 경로를 출력하도록 print문 추가 * [IDLE-000] presentation module의 gradle 파일에 monitoring 모듈 dependency 추가 * [IDLE-000] deviceToken 서비스에서 트랜잭션 어노테이션 추가 * [IDLE-000] batch 테스트를 위해 30분마다 동작하도록 변경 * [IDLE-475] 채팅, 채팅방 도메인 설계 * [IDLE-475] 채팅 메세지 최소, 최대 길이 제한 설정 * [IDLE-000] Batch 메타데이터 테이블 스크립트 변경 및 크롤링 수행 주기 설정 * [IDLE-000] 운영 환경 CD 스크립트에서 불필요한 step 제거
* [IDLE-000] Production CI 스크립트 작성 * [IDLE-000] 센터 공고 수정 API 내 접수 방법 null 비허용 * [IDLE-000] 공고 지원자 조회 시, 삭제된 유저는 조회되지 않도록 수정 * [IDLE-363] 센터 관리자 전화 인증 요청 API * [IDLE-363] 개발 환경 ddl-auto 옵션 임시로 create 옵션으로 변경 * [IDLE-365] 공고 크롤러 selenium 로직 수정 및 로컬 동작 확인 * [IDLE-365] 테스트를 위한 스케줄러 기준 시각 변경 * [IDLE-365] batch job enable 옵션 비활성화 * [IDLE-365] ddl-auto update로 변경 * [IDLE-365] 크롤링 공고 필드 null 비허용 * [IDLE-365] 스케줄러 시간 02시로 설정 * [IDLE-366] spring batch selenium 크롤링을 위한 빌드 스크립트 수정 * [IDLE-366] worknet 사이트가 고용 24 사이트로 통합됨에 따라, 크롤링 스크립트 수정 * [IDLE-366] 크롤러 동작 스케줄링 시간 변경 * [IDLE-366] 스프링 초기 실행 시, spring batch 자동 실행 방지 옵션 추가 * [IDLE-366] spring batch 5 버전에서 업데이트 된 변경사항 적용 및 별도의 JobLauncher 구현 * [IDLE-366] 불필요 의존성 및 옵션 제거 * [IDLE-366] 크롤링 조회 API 내 entity status 필드 추가 및 쿼리 수정 * [IDLE-358] 운영 환경 CD 구축 및 운영 환경 profile 설정 추가 * [IDLE-358] 운영 환경 docker run 실행 시 예외 처리 * [IDLE-000] 크롤링 전체 조회 DTO 생성자 추가 * [IDLE-000] 공고 전체 조회 fetchJoin() 중복 이슈 해결을 위한 subquery 분리 * [IDLE-000] AI 코드리뷰 coderabbit 도입 * [IDLE-000] 크롤링 공고 반경범위 조회 필터를 위한 where절 추가 * [IDLE-000] TimeZone 설정이 적용되지 않는 문제 해결 * [IDLE-000] TimeZone 지정 및 @EnableScheduling 설정 * [IDLE-000] TimeZone 설정 제거 * [IDLE-000] 공고 전체 조회 쿼리 롤백 * [IDLE-000] 기존 공고 내 location을 기반으로 위.경도 값을 decoding하도록 변경 * [IDLE-000] 배포 전 최종 QA * [IDLE-000] 크롤링 공고 생성일자 필드 type 변경(timestamp -> date) * [IDLE-000] Redis 비밀번호 설정 추가 (#171) * [IDLE-000] Redis 비밀번호 설정 추가 * [IDLE-000] yaml 파일에 password 필드 추가 * [IDLE-000] redis local default password 설정 * [IDLE-000] compose 파일 내, 비밀번호 지정 command 설정 * [IDLE-000] Redis 볼륨 설정 * [IDLE-000] ci triggering branch 임시 변경 * [IDLE-000] ci triggering branch 롤백 * [IDLE-000] 테스트 심사 통과를 위한 전화번호 검증 로직 추가 * [IDLE-000] 테스트 심사 통과를 위한 전화번호 검증 로직 추가 * [IDLE-389] 센터 인증 요청 이벤트 발생 시, 디스코드 웹훅 알림을 전송하는 로직 작성 * [IDLE-389] 사업자 등록번호 client properties 클래스명 변경 * [IDLE-389] 코드 리뷰 반영 * [IDLE-000] 트랜잭션 전파 레벨 변경(REQUIRED -> REQUIRES_NEW) * [IDLE-396] FCM 모듈 추가 및 firebase 의존성 설정 * readme 제목 수정 * readme 제목 수정 * [IDLE-399] FCM Device Token 관리 API * [IDLE-399] 알림 도메인 설계 * [IDLE-000] fcm service 설정값 주입을 위한 디렉토리 구조 변경 * [IDLE-000] fcm service 설정값 주입을 위한 디렉토리 구조 변경 * [IDLE-400] 채용 공고 지원자 발생 시, 센터 관리자에게 알림을 발송한다. * [IDLE-400] fcm 모듈 설정 추가 * [IDLE-400] 공고 지원자 발생 시, 모든 센터 관리자들에게 다중 알림을 발송한다. * [IDLE-415] 알림 조회 처리 API * [IDLE-417] 읽지 않은 알림 수 집계 API * [IDLE-418] 알림 목록 조회 API * [IDLE-418] 피드백 반영 * [IDLE-423] soft-delete가 적용된 즐겨찾기 entity에서, 즐겨찾기 해제 후 다시 설정하는 경우 발생하는 버그를 해결한다. * [IDLE-424] 요양 보호사 공고 전체 조회 시, 삭제된 공고가 함께 보이는 문제 해결 * [IDLE-400] 채용 공고 지원자 발생 시, 센터 관리자에게 알림을 발송한다. (#183) * [IDLE-400] 채용 공고 지원자 발생 시, 센터 관리자에게 알림을 발송한다. * [IDLE-400] fcm 모듈 설정 추가 * [IDLE-400] 공고 지원자 발생 시, 모든 센터 관리자들에게 다중 알림을 발송한다. * [IDLE-400] 채용 공고 지원자 발생 시, 센터 관리자에게 알림을 발송한다. * [IDLE-400] fcm 모듈 설정 추가 * [IDLE-400] 공고 지원자 발생 시, 모든 센터 관리자들에게 다중 알림을 발송한다. * [IDLE-415] 알림 조회 처리 API * [IDLE-417] 읽지 않은 알림 수 집계 API * [IDLE-418] 알림 목록 조회 API * [IDLE-418] 피드백 반영 * [IDLE-423] soft-delete가 적용된 즐겨찾기 entity에서, 즐겨찾기 해제 후 다시 설정하는 경우 발생하는 버그를 해결한다. * [IDLE-424] 요양 보호사 공고 전체 조회 시, 삭제된 공고가 함께 보이는 문제 해결 * [IDLE-400] 알림 명세 변경 * [IDLE-400] fcm 설정 파일 디렉토리 path 변경 * [IDLE-400] ddl 옵션 변경 * [IDLE-400] ci/cd 옵션 변경 * [IDLE-000] ci triggering branch 복구 * [IDLE-000] develop 환경에서 fcm service 설정 파일 path 수정 * [IDLE-000] fcm service json 파일명 변경 * [IDLE-000] firebase service key 설정 경로 체크를 위해, cd 스크립트를 수정합니다. * Update README.md * [IDLE-000] fcm service key 경로를 class path 경로로 수정 시도 * [IDLE-000] ci triggering branch 임시 변경 * [IDLE-000] firebaseApp 초기화 임시 비활성화 * [IDLE-000] firebaseApp 초기화 임시 비활성화 * [IDLE-000] firebaseApp 초기화 임시 비활성화 * [IDLE-000] file path 앞에 ./ 제외 * [IDLE-000] 절대 경로로 변경 시도 * [IDLE-000] fcm service key 생성 path 수정 * [IDLE-000] fcm service key json file 생성 스크립트 작성 * [IDLE-000] ci triggering branch develop으로 롤백 * [IDLE-000] 불필요 스크립트 제거 * [IDLE-000] firebase config의 현재 경로를 출력하도록 print문 추가 (#197) * [IDLE-000] firebase config의 현재 경로를 출력하도록 print문 추가 * [IDLE-000] ci triggering branch 수정 * [IDLE-000] ci triggering branch 수정 * [IDLE-000] firebase app 초기화 로직 주석 처리 * [IDLE-000] firebase app 초기화 로직 주석 처리 * [IDLE-000] firebase app 초기화 로직 주석 처리 * [IDLE-000] file 대신 string으로 주입받아 초기화하는 방식으로 전환 * [IDLE-000] 일반 string 대신 base64 인코딩 된 문자열을 주입하도록 처리 * [IDLE-000] 일반 string 주입으로 rollback * [IDLE-000] json string log 추가 * [IDLE-000] base64 문자열로 재 변경 * [IDLE-000] firebase config의 현재 경로를 출력하도록 print문 추가 * [IDLE-429] DB 형상관리를 위한 Flyway 적용 * [IDLE-429] Flyway latest version으로 설정 * [IDLE-429] 피드백 반영 * [IDLE-000] firebase config의 현재 경로를 출력하도록 print문 추가 * [IDLE-000] 알림 조회 처리 로직에 @transactional 추가 * [IDLE-000] 알림 조회 시, 생성 시각 기준이 아닌 uuid v7 id 기준으로 내림차순 정렬하도록 변경 * [IDLE-000] CI 트리거 브랜치 복구 * [IDLE-454] 테스트를 위한 크롤링 수행 시각 변경 및 로깅 추가 * [IDLE-000] 공고 범위 검색 내 중복 데이터 발생 방지 * [IDLE-000] ci 트리거 브랜치 변경 * [IDLE-000] ci 트리거 브랜치 롤백 * [IDLE-000] monitoring 모듈 추가 및 actuator, prometheus 의존성 추가 * [IDLE-456] monitoring.yml 작성 * [IDLE-456] monitoring profile 추가 * [IDLE-456] actuator dependency group name 수정 * [IDLE-000] 크롤링 주기 하루 2회로 변경 * [IDLE-000] 불필요 로그 제거 * [IDLE-000] 인증번호 SMS 내용 수정 * [IDLE-000] classPath 하위 yaml 파일 확장자 모두 .yml로 통일 * [IDLE-000] 즐겨찾기 facade service에 트랜잭션 추가 (#206) * [IDLE-000] firebase config의 현재 경로를 출력하도록 print문 추가 * [IDLE-000] facade service에 transaction 추가 * [IDLE-461] 유저가 다중 디바이스에서 알림을 받을 수 있도록 개선한다. (#207) * [IDLE-000] firebase config의 현재 경로를 출력하도록 print문 추가 * [IDLE-461] 한 유저가 다중 디바이스 설정이 가능하도록 한다. * [IDLE-000] firebase config의 현재 경로를 출력하도록 print문 추가 * [IDLE-000] presentation module의 gradle 파일에 monitoring 모듈 dependency 추가 * [IDLE-000] deviceToken 서비스에서 트랜잭션 어노테이션 추가 * [IDLE-000] batch 테스트를 위해 30분마다 동작하도록 변경 * [IDLE-475] 채팅, 채팅방 도메인 설계 * [IDLE-475] 채팅 메세지 최소, 최대 길이 제한 설정 * [IDLE-000] Batch 메타데이터 테이블 스크립트 변경 및 크롤링 수행 주기 설정 * [IDLE-000] 운영 환경 CD 스크립트에서 불필요한 step 제거 * [IDLE-000] 도텐브 파일 공백 제거 스크립트 작성, 크롤링 대상일자 전날 등록된 공고로 변경 * [IDLE-000] 크롤링 기준 시각 15시로 임시 변경
* [IDLE-000] Production CI 스크립트 작성 * [IDLE-000] 센터 공고 수정 API 내 접수 방법 null 비허용 * [IDLE-000] 공고 지원자 조회 시, 삭제된 유저는 조회되지 않도록 수정 * [IDLE-363] 센터 관리자 전화 인증 요청 API * [IDLE-363] 개발 환경 ddl-auto 옵션 임시로 create 옵션으로 변경 * [IDLE-365] 공고 크롤러 selenium 로직 수정 및 로컬 동작 확인 * [IDLE-365] 테스트를 위한 스케줄러 기준 시각 변경 * [IDLE-365] batch job enable 옵션 비활성화 * [IDLE-365] ddl-auto update로 변경 * [IDLE-365] 크롤링 공고 필드 null 비허용 * [IDLE-365] 스케줄러 시간 02시로 설정 * [IDLE-366] spring batch selenium 크롤링을 위한 빌드 스크립트 수정 * [IDLE-366] worknet 사이트가 고용 24 사이트로 통합됨에 따라, 크롤링 스크립트 수정 * [IDLE-366] 크롤러 동작 스케줄링 시간 변경 * [IDLE-366] 스프링 초기 실행 시, spring batch 자동 실행 방지 옵션 추가 * [IDLE-366] spring batch 5 버전에서 업데이트 된 변경사항 적용 및 별도의 JobLauncher 구현 * [IDLE-366] 불필요 의존성 및 옵션 제거 * [IDLE-366] 크롤링 조회 API 내 entity status 필드 추가 및 쿼리 수정 * [IDLE-358] 운영 환경 CD 구축 및 운영 환경 profile 설정 추가 * [IDLE-358] 운영 환경 docker run 실행 시 예외 처리 * [IDLE-000] 크롤링 전체 조회 DTO 생성자 추가 * [IDLE-000] 공고 전체 조회 fetchJoin() 중복 이슈 해결을 위한 subquery 분리 * [IDLE-000] AI 코드리뷰 coderabbit 도입 * [IDLE-000] 크롤링 공고 반경범위 조회 필터를 위한 where절 추가 * [IDLE-000] TimeZone 설정이 적용되지 않는 문제 해결 * [IDLE-000] TimeZone 지정 및 @EnableScheduling 설정 * [IDLE-000] TimeZone 설정 제거 * [IDLE-000] 공고 전체 조회 쿼리 롤백 * [IDLE-000] 기존 공고 내 location을 기반으로 위.경도 값을 decoding하도록 변경 * [IDLE-000] 배포 전 최종 QA * [IDLE-000] 크롤링 공고 생성일자 필드 type 변경(timestamp -> date) * [IDLE-000] Redis 비밀번호 설정 추가 (#171) * [IDLE-000] Redis 비밀번호 설정 추가 * [IDLE-000] yaml 파일에 password 필드 추가 * [IDLE-000] redis local default password 설정 * [IDLE-000] compose 파일 내, 비밀번호 지정 command 설정 * [IDLE-000] Redis 볼륨 설정 * [IDLE-000] ci triggering branch 임시 변경 * [IDLE-000] ci triggering branch 롤백 * [IDLE-000] 테스트 심사 통과를 위한 전화번호 검증 로직 추가 * [IDLE-000] 테스트 심사 통과를 위한 전화번호 검증 로직 추가 * [IDLE-389] 센터 인증 요청 이벤트 발생 시, 디스코드 웹훅 알림을 전송하는 로직 작성 * [IDLE-389] 사업자 등록번호 client properties 클래스명 변경 * [IDLE-389] 코드 리뷰 반영 * [IDLE-000] 트랜잭션 전파 레벨 변경(REQUIRED -> REQUIRES_NEW) * [IDLE-396] FCM 모듈 추가 및 firebase 의존성 설정 * readme 제목 수정 * readme 제목 수정 * [IDLE-399] FCM Device Token 관리 API * [IDLE-399] 알림 도메인 설계 * [IDLE-000] fcm service 설정값 주입을 위한 디렉토리 구조 변경 * [IDLE-000] fcm service 설정값 주입을 위한 디렉토리 구조 변경 * [IDLE-400] 채용 공고 지원자 발생 시, 센터 관리자에게 알림을 발송한다. * [IDLE-400] fcm 모듈 설정 추가 * [IDLE-400] 공고 지원자 발생 시, 모든 센터 관리자들에게 다중 알림을 발송한다. * [IDLE-415] 알림 조회 처리 API * [IDLE-417] 읽지 않은 알림 수 집계 API * [IDLE-418] 알림 목록 조회 API * [IDLE-418] 피드백 반영 * [IDLE-423] soft-delete가 적용된 즐겨찾기 entity에서, 즐겨찾기 해제 후 다시 설정하는 경우 발생하는 버그를 해결한다. * [IDLE-424] 요양 보호사 공고 전체 조회 시, 삭제된 공고가 함께 보이는 문제 해결 * [IDLE-400] 채용 공고 지원자 발생 시, 센터 관리자에게 알림을 발송한다. (#183) * [IDLE-400] 채용 공고 지원자 발생 시, 센터 관리자에게 알림을 발송한다. * [IDLE-400] fcm 모듈 설정 추가 * [IDLE-400] 공고 지원자 발생 시, 모든 센터 관리자들에게 다중 알림을 발송한다. * [IDLE-400] 채용 공고 지원자 발생 시, 센터 관리자에게 알림을 발송한다. * [IDLE-400] fcm 모듈 설정 추가 * [IDLE-400] 공고 지원자 발생 시, 모든 센터 관리자들에게 다중 알림을 발송한다. * [IDLE-415] 알림 조회 처리 API * [IDLE-417] 읽지 않은 알림 수 집계 API * [IDLE-418] 알림 목록 조회 API * [IDLE-418] 피드백 반영 * [IDLE-423] soft-delete가 적용된 즐겨찾기 entity에서, 즐겨찾기 해제 후 다시 설정하는 경우 발생하는 버그를 해결한다. * [IDLE-424] 요양 보호사 공고 전체 조회 시, 삭제된 공고가 함께 보이는 문제 해결 * [IDLE-400] 알림 명세 변경 * [IDLE-400] fcm 설정 파일 디렉토리 path 변경 * [IDLE-400] ddl 옵션 변경 * [IDLE-400] ci/cd 옵션 변경 * [IDLE-000] ci triggering branch 복구 * [IDLE-000] develop 환경에서 fcm service 설정 파일 path 수정 * [IDLE-000] fcm service json 파일명 변경 * [IDLE-000] firebase service key 설정 경로 체크를 위해, cd 스크립트를 수정합니다. * Update README.md * [IDLE-000] fcm service key 경로를 class path 경로로 수정 시도 * [IDLE-000] ci triggering branch 임시 변경 * [IDLE-000] firebaseApp 초기화 임시 비활성화 * [IDLE-000] firebaseApp 초기화 임시 비활성화 * [IDLE-000] firebaseApp 초기화 임시 비활성화 * [IDLE-000] file path 앞에 ./ 제외 * [IDLE-000] 절대 경로로 변경 시도 * [IDLE-000] fcm service key 생성 path 수정 * [IDLE-000] fcm service key json file 생성 스크립트 작성 * [IDLE-000] ci triggering branch develop으로 롤백 * [IDLE-000] 불필요 스크립트 제거 * [IDLE-000] firebase config의 현재 경로를 출력하도록 print문 추가 (#197) * [IDLE-000] firebase config의 현재 경로를 출력하도록 print문 추가 * [IDLE-000] ci triggering branch 수정 * [IDLE-000] ci triggering branch 수정 * [IDLE-000] firebase app 초기화 로직 주석 처리 * [IDLE-000] firebase app 초기화 로직 주석 처리 * [IDLE-000] firebase app 초기화 로직 주석 처리 * [IDLE-000] file 대신 string으로 주입받아 초기화하는 방식으로 전환 * [IDLE-000] 일반 string 대신 base64 인코딩 된 문자열을 주입하도록 처리 * [IDLE-000] 일반 string 주입으로 rollback * [IDLE-000] json string log 추가 * [IDLE-000] base64 문자열로 재 변경 * [IDLE-000] firebase config의 현재 경로를 출력하도록 print문 추가 * [IDLE-429] DB 형상관리를 위한 Flyway 적용 * [IDLE-429] Flyway latest version으로 설정 * [IDLE-429] 피드백 반영 * [IDLE-000] firebase config의 현재 경로를 출력하도록 print문 추가 * [IDLE-000] 알림 조회 처리 로직에 @transactional 추가 * [IDLE-000] 알림 조회 시, 생성 시각 기준이 아닌 uuid v7 id 기준으로 내림차순 정렬하도록 변경 * [IDLE-000] CI 트리거 브랜치 복구 * [IDLE-454] 테스트를 위한 크롤링 수행 시각 변경 및 로깅 추가 * [IDLE-000] 공고 범위 검색 내 중복 데이터 발생 방지 * [IDLE-000] ci 트리거 브랜치 변경 * [IDLE-000] ci 트리거 브랜치 롤백 * [IDLE-000] monitoring 모듈 추가 및 actuator, prometheus 의존성 추가 * [IDLE-456] monitoring.yml 작성 * [IDLE-456] monitoring profile 추가 * [IDLE-456] actuator dependency group name 수정 * [IDLE-000] 크롤링 주기 하루 2회로 변경 * [IDLE-000] 불필요 로그 제거 * [IDLE-000] 인증번호 SMS 내용 수정 * [IDLE-000] classPath 하위 yaml 파일 확장자 모두 .yml로 통일 * [IDLE-000] 즐겨찾기 facade service에 트랜잭션 추가 (#206) * [IDLE-000] firebase config의 현재 경로를 출력하도록 print문 추가 * [IDLE-000] facade service에 transaction 추가 * [IDLE-461] 유저가 다중 디바이스에서 알림을 받을 수 있도록 개선한다. (#207) * [IDLE-000] firebase config의 현재 경로를 출력하도록 print문 추가 * [IDLE-461] 한 유저가 다중 디바이스 설정이 가능하도록 한다. * [IDLE-000] firebase config의 현재 경로를 출력하도록 print문 추가 * [IDLE-000] presentation module의 gradle 파일에 monitoring 모듈 dependency 추가 * [IDLE-000] deviceToken 서비스에서 트랜잭션 어노테이션 추가 * [IDLE-000] batch 테스트를 위해 30분마다 동작하도록 변경 * [IDLE-475] 채팅, 채팅방 도메인 설계 * [IDLE-475] 채팅 메세지 최소, 최대 길이 제한 설정 * [IDLE-000] Batch 메타데이터 테이블 스크립트 변경 및 크롤링 수행 주기 설정 * [IDLE-000] 운영 환경 CD 스크립트에서 불필요한 step 제거 * [IDLE-000] 도텐브 파일 공백 제거 스크립트 작성, 크롤링 대상일자 전날 등록된 공고로 변경 * [IDLE-000] 크롤링 기준 시각 15시로 임시 변경 * [IDLE-000] cd env 파일 생성 스크립트 변경
* [IDLE-000] Production CI 스크립트 작성 * [IDLE-000] 센터 공고 수정 API 내 접수 방법 null 비허용 * [IDLE-000] 공고 지원자 조회 시, 삭제된 유저는 조회되지 않도록 수정 * [IDLE-363] 센터 관리자 전화 인증 요청 API * [IDLE-363] 개발 환경 ddl-auto 옵션 임시로 create 옵션으로 변경 * [IDLE-365] 공고 크롤러 selenium 로직 수정 및 로컬 동작 확인 * [IDLE-365] 테스트를 위한 스케줄러 기준 시각 변경 * [IDLE-365] batch job enable 옵션 비활성화 * [IDLE-365] ddl-auto update로 변경 * [IDLE-365] 크롤링 공고 필드 null 비허용 * [IDLE-365] 스케줄러 시간 02시로 설정 * [IDLE-366] spring batch selenium 크롤링을 위한 빌드 스크립트 수정 * [IDLE-366] worknet 사이트가 고용 24 사이트로 통합됨에 따라, 크롤링 스크립트 수정 * [IDLE-366] 크롤러 동작 스케줄링 시간 변경 * [IDLE-366] 스프링 초기 실행 시, spring batch 자동 실행 방지 옵션 추가 * [IDLE-366] spring batch 5 버전에서 업데이트 된 변경사항 적용 및 별도의 JobLauncher 구현 * [IDLE-366] 불필요 의존성 및 옵션 제거 * [IDLE-366] 크롤링 조회 API 내 entity status 필드 추가 및 쿼리 수정 * [IDLE-358] 운영 환경 CD 구축 및 운영 환경 profile 설정 추가 * [IDLE-358] 운영 환경 docker run 실행 시 예외 처리 * [IDLE-000] 크롤링 전체 조회 DTO 생성자 추가 * [IDLE-000] 공고 전체 조회 fetchJoin() 중복 이슈 해결을 위한 subquery 분리 * [IDLE-000] AI 코드리뷰 coderabbit 도입 * [IDLE-000] 크롤링 공고 반경범위 조회 필터를 위한 where절 추가 * [IDLE-000] TimeZone 설정이 적용되지 않는 문제 해결 * [IDLE-000] TimeZone 지정 및 @EnableScheduling 설정 * [IDLE-000] TimeZone 설정 제거 * [IDLE-000] 공고 전체 조회 쿼리 롤백 * [IDLE-000] 기존 공고 내 location을 기반으로 위.경도 값을 decoding하도록 변경 * [IDLE-000] 배포 전 최종 QA * [IDLE-000] 크롤링 공고 생성일자 필드 type 변경(timestamp -> date) * [IDLE-000] Redis 비밀번호 설정 추가 (#171) * [IDLE-000] Redis 비밀번호 설정 추가 * [IDLE-000] yaml 파일에 password 필드 추가 * [IDLE-000] redis local default password 설정 * [IDLE-000] compose 파일 내, 비밀번호 지정 command 설정 * [IDLE-000] Redis 볼륨 설정 * [IDLE-000] ci triggering branch 임시 변경 * [IDLE-000] ci triggering branch 롤백 * [IDLE-000] 테스트 심사 통과를 위한 전화번호 검증 로직 추가 * [IDLE-000] 테스트 심사 통과를 위한 전화번호 검증 로직 추가 * [IDLE-389] 센터 인증 요청 이벤트 발생 시, 디스코드 웹훅 알림을 전송하는 로직 작성 * [IDLE-389] 사업자 등록번호 client properties 클래스명 변경 * [IDLE-389] 코드 리뷰 반영 * [IDLE-000] 트랜잭션 전파 레벨 변경(REQUIRED -> REQUIRES_NEW) * [IDLE-396] FCM 모듈 추가 및 firebase 의존성 설정 * readme 제목 수정 * readme 제목 수정 * [IDLE-399] FCM Device Token 관리 API * [IDLE-399] 알림 도메인 설계 * [IDLE-000] fcm service 설정값 주입을 위한 디렉토리 구조 변경 * [IDLE-000] fcm service 설정값 주입을 위한 디렉토리 구조 변경 * [IDLE-400] 채용 공고 지원자 발생 시, 센터 관리자에게 알림을 발송한다. * [IDLE-400] fcm 모듈 설정 추가 * [IDLE-400] 공고 지원자 발생 시, 모든 센터 관리자들에게 다중 알림을 발송한다. * [IDLE-415] 알림 조회 처리 API * [IDLE-417] 읽지 않은 알림 수 집계 API * [IDLE-418] 알림 목록 조회 API * [IDLE-418] 피드백 반영 * [IDLE-423] soft-delete가 적용된 즐겨찾기 entity에서, 즐겨찾기 해제 후 다시 설정하는 경우 발생하는 버그를 해결한다. * [IDLE-424] 요양 보호사 공고 전체 조회 시, 삭제된 공고가 함께 보이는 문제 해결 * [IDLE-400] 채용 공고 지원자 발생 시, 센터 관리자에게 알림을 발송한다. (#183) * [IDLE-400] 채용 공고 지원자 발생 시, 센터 관리자에게 알림을 발송한다. * [IDLE-400] fcm 모듈 설정 추가 * [IDLE-400] 공고 지원자 발생 시, 모든 센터 관리자들에게 다중 알림을 발송한다. * [IDLE-400] 채용 공고 지원자 발생 시, 센터 관리자에게 알림을 발송한다. * [IDLE-400] fcm 모듈 설정 추가 * [IDLE-400] 공고 지원자 발생 시, 모든 센터 관리자들에게 다중 알림을 발송한다. * [IDLE-415] 알림 조회 처리 API * [IDLE-417] 읽지 않은 알림 수 집계 API * [IDLE-418] 알림 목록 조회 API * [IDLE-418] 피드백 반영 * [IDLE-423] soft-delete가 적용된 즐겨찾기 entity에서, 즐겨찾기 해제 후 다시 설정하는 경우 발생하는 버그를 해결한다. * [IDLE-424] 요양 보호사 공고 전체 조회 시, 삭제된 공고가 함께 보이는 문제 해결 * [IDLE-400] 알림 명세 변경 * [IDLE-400] fcm 설정 파일 디렉토리 path 변경 * [IDLE-400] ddl 옵션 변경 * [IDLE-400] ci/cd 옵션 변경 * [IDLE-000] ci triggering branch 복구 * [IDLE-000] develop 환경에서 fcm service 설정 파일 path 수정 * [IDLE-000] fcm service json 파일명 변경 * [IDLE-000] firebase service key 설정 경로 체크를 위해, cd 스크립트를 수정합니다. * Update README.md * [IDLE-000] fcm service key 경로를 class path 경로로 수정 시도 * [IDLE-000] ci triggering branch 임시 변경 * [IDLE-000] firebaseApp 초기화 임시 비활성화 * [IDLE-000] firebaseApp 초기화 임시 비활성화 * [IDLE-000] firebaseApp 초기화 임시 비활성화 * [IDLE-000] file path 앞에 ./ 제외 * [IDLE-000] 절대 경로로 변경 시도 * [IDLE-000] fcm service key 생성 path 수정 * [IDLE-000] fcm service key json file 생성 스크립트 작성 * [IDLE-000] ci triggering branch develop으로 롤백 * [IDLE-000] 불필요 스크립트 제거 * [IDLE-000] firebase config의 현재 경로를 출력하도록 print문 추가 (#197) * [IDLE-000] firebase config의 현재 경로를 출력하도록 print문 추가 * [IDLE-000] ci triggering branch 수정 * [IDLE-000] ci triggering branch 수정 * [IDLE-000] firebase app 초기화 로직 주석 처리 * [IDLE-000] firebase app 초기화 로직 주석 처리 * [IDLE-000] firebase app 초기화 로직 주석 처리 * [IDLE-000] file 대신 string으로 주입받아 초기화하는 방식으로 전환 * [IDLE-000] 일반 string 대신 base64 인코딩 된 문자열을 주입하도록 처리 * [IDLE-000] 일반 string 주입으로 rollback * [IDLE-000] json string log 추가 * [IDLE-000] base64 문자열로 재 변경 * [IDLE-000] firebase config의 현재 경로를 출력하도록 print문 추가 * [IDLE-429] DB 형상관리를 위한 Flyway 적용 * [IDLE-429] Flyway latest version으로 설정 * [IDLE-429] 피드백 반영 * [IDLE-000] firebase config의 현재 경로를 출력하도록 print문 추가 * [IDLE-000] 알림 조회 처리 로직에 @transactional 추가 * [IDLE-000] 알림 조회 시, 생성 시각 기준이 아닌 uuid v7 id 기준으로 내림차순 정렬하도록 변경 * [IDLE-000] CI 트리거 브랜치 복구 * [IDLE-454] 테스트를 위한 크롤링 수행 시각 변경 및 로깅 추가 * [IDLE-000] 공고 범위 검색 내 중복 데이터 발생 방지 * [IDLE-000] ci 트리거 브랜치 변경 * [IDLE-000] ci 트리거 브랜치 롤백 * [IDLE-000] monitoring 모듈 추가 및 actuator, prometheus 의존성 추가 * [IDLE-456] monitoring.yml 작성 * [IDLE-456] monitoring profile 추가 * [IDLE-456] actuator dependency group name 수정 * [IDLE-000] 크롤링 주기 하루 2회로 변경 * [IDLE-000] 불필요 로그 제거 * [IDLE-000] 인증번호 SMS 내용 수정 * [IDLE-000] classPath 하위 yaml 파일 확장자 모두 .yml로 통일 * [IDLE-000] 즐겨찾기 facade service에 트랜잭션 추가 (#206) * [IDLE-000] firebase config의 현재 경로를 출력하도록 print문 추가 * [IDLE-000] facade service에 transaction 추가 * [IDLE-461] 유저가 다중 디바이스에서 알림을 받을 수 있도록 개선한다. (#207) * [IDLE-000] firebase config의 현재 경로를 출력하도록 print문 추가 * [IDLE-461] 한 유저가 다중 디바이스 설정이 가능하도록 한다. * [IDLE-000] firebase config의 현재 경로를 출력하도록 print문 추가 * [IDLE-000] presentation module의 gradle 파일에 monitoring 모듈 dependency 추가 * [IDLE-000] deviceToken 서비스에서 트랜잭션 어노테이션 추가 * [IDLE-000] batch 테스트를 위해 30분마다 동작하도록 변경 * [IDLE-475] 채팅, 채팅방 도메인 설계 * [IDLE-475] 채팅 메세지 최소, 최대 길이 제한 설정 * [IDLE-000] Batch 메타데이터 테이블 스크립트 변경 및 크롤링 수행 주기 설정 * [IDLE-000] 운영 환경 CD 스크립트에서 불필요한 step 제거 * [IDLE-000] 도텐브 파일 공백 제거 스크립트 작성, 크롤링 대상일자 전날 등록된 공고로 변경 * [IDLE-000] 크롤링 기준 시각 15시로 임시 변경 * [IDLE-000] cd env 파일 생성 스크립트 변경
* [IDLE-000] Production CI 스크립트 작성 * [IDLE-000] 센터 공고 수정 API 내 접수 방법 null 비허용 * [IDLE-000] 공고 지원자 조회 시, 삭제된 유저는 조회되지 않도록 수정 * [IDLE-363] 센터 관리자 전화 인증 요청 API * [IDLE-363] 개발 환경 ddl-auto 옵션 임시로 create 옵션으로 변경 * [IDLE-365] 공고 크롤러 selenium 로직 수정 및 로컬 동작 확인 * [IDLE-365] 테스트를 위한 스케줄러 기준 시각 변경 * [IDLE-365] batch job enable 옵션 비활성화 * [IDLE-365] ddl-auto update로 변경 * [IDLE-365] 크롤링 공고 필드 null 비허용 * [IDLE-365] 스케줄러 시간 02시로 설정 * [IDLE-366] spring batch selenium 크롤링을 위한 빌드 스크립트 수정 * [IDLE-366] worknet 사이트가 고용 24 사이트로 통합됨에 따라, 크롤링 스크립트 수정 * [IDLE-366] 크롤러 동작 스케줄링 시간 변경 * [IDLE-366] 스프링 초기 실행 시, spring batch 자동 실행 방지 옵션 추가 * [IDLE-366] spring batch 5 버전에서 업데이트 된 변경사항 적용 및 별도의 JobLauncher 구현 * [IDLE-366] 불필요 의존성 및 옵션 제거 * [IDLE-366] 크롤링 조회 API 내 entity status 필드 추가 및 쿼리 수정 * [IDLE-358] 운영 환경 CD 구축 및 운영 환경 profile 설정 추가 * [IDLE-358] 운영 환경 docker run 실행 시 예외 처리 * [IDLE-000] 크롤링 전체 조회 DTO 생성자 추가 * [IDLE-000] 공고 전체 조회 fetchJoin() 중복 이슈 해결을 위한 subquery 분리 * [IDLE-000] AI 코드리뷰 coderabbit 도입 * [IDLE-000] 크롤링 공고 반경범위 조회 필터를 위한 where절 추가 * [IDLE-000] TimeZone 설정이 적용되지 않는 문제 해결 * [IDLE-000] TimeZone 지정 및 @EnableScheduling 설정 * [IDLE-000] TimeZone 설정 제거 * [IDLE-000] 공고 전체 조회 쿼리 롤백 * [IDLE-000] 기존 공고 내 location을 기반으로 위.경도 값을 decoding하도록 변경 * [IDLE-000] 배포 전 최종 QA * [IDLE-000] 크롤링 공고 생성일자 필드 type 변경(timestamp -> date) * [IDLE-000] Redis 비밀번호 설정 추가 (#171) * [IDLE-000] Redis 비밀번호 설정 추가 * [IDLE-000] yaml 파일에 password 필드 추가 * [IDLE-000] redis local default password 설정 * [IDLE-000] compose 파일 내, 비밀번호 지정 command 설정 * [IDLE-000] Redis 볼륨 설정 * [IDLE-000] ci triggering branch 임시 변경 * [IDLE-000] ci triggering branch 롤백 * [IDLE-000] 테스트 심사 통과를 위한 전화번호 검증 로직 추가 * [IDLE-000] 테스트 심사 통과를 위한 전화번호 검증 로직 추가 * [IDLE-389] 센터 인증 요청 이벤트 발생 시, 디스코드 웹훅 알림을 전송하는 로직 작성 * [IDLE-389] 사업자 등록번호 client properties 클래스명 변경 * [IDLE-389] 코드 리뷰 반영 * [IDLE-000] 트랜잭션 전파 레벨 변경(REQUIRED -> REQUIRES_NEW) * [IDLE-396] FCM 모듈 추가 및 firebase 의존성 설정 * readme 제목 수정 * readme 제목 수정 * [IDLE-399] FCM Device Token 관리 API * [IDLE-399] 알림 도메인 설계 * [IDLE-000] fcm service 설정값 주입을 위한 디렉토리 구조 변경 * [IDLE-000] fcm service 설정값 주입을 위한 디렉토리 구조 변경 * [IDLE-400] 채용 공고 지원자 발생 시, 센터 관리자에게 알림을 발송한다. * [IDLE-400] fcm 모듈 설정 추가 * [IDLE-400] 공고 지원자 발생 시, 모든 센터 관리자들에게 다중 알림을 발송한다. * [IDLE-415] 알림 조회 처리 API * [IDLE-417] 읽지 않은 알림 수 집계 API * [IDLE-418] 알림 목록 조회 API * [IDLE-418] 피드백 반영 * [IDLE-423] soft-delete가 적용된 즐겨찾기 entity에서, 즐겨찾기 해제 후 다시 설정하는 경우 발생하는 버그를 해결한다. * [IDLE-424] 요양 보호사 공고 전체 조회 시, 삭제된 공고가 함께 보이는 문제 해결 * [IDLE-400] 채용 공고 지원자 발생 시, 센터 관리자에게 알림을 발송한다. (#183) * [IDLE-400] 채용 공고 지원자 발생 시, 센터 관리자에게 알림을 발송한다. * [IDLE-400] fcm 모듈 설정 추가 * [IDLE-400] 공고 지원자 발생 시, 모든 센터 관리자들에게 다중 알림을 발송한다. * [IDLE-400] 채용 공고 지원자 발생 시, 센터 관리자에게 알림을 발송한다. * [IDLE-400] fcm 모듈 설정 추가 * [IDLE-400] 공고 지원자 발생 시, 모든 센터 관리자들에게 다중 알림을 발송한다. * [IDLE-415] 알림 조회 처리 API * [IDLE-417] 읽지 않은 알림 수 집계 API * [IDLE-418] 알림 목록 조회 API * [IDLE-418] 피드백 반영 * [IDLE-423] soft-delete가 적용된 즐겨찾기 entity에서, 즐겨찾기 해제 후 다시 설정하는 경우 발생하는 버그를 해결한다. * [IDLE-424] 요양 보호사 공고 전체 조회 시, 삭제된 공고가 함께 보이는 문제 해결 * [IDLE-400] 알림 명세 변경 * [IDLE-400] fcm 설정 파일 디렉토리 path 변경 * [IDLE-400] ddl 옵션 변경 * [IDLE-400] ci/cd 옵션 변경 * [IDLE-000] ci triggering branch 복구 * [IDLE-000] develop 환경에서 fcm service 설정 파일 path 수정 * [IDLE-000] fcm service json 파일명 변경 * [IDLE-000] firebase service key 설정 경로 체크를 위해, cd 스크립트를 수정합니다. * Update README.md * [IDLE-000] fcm service key 경로를 class path 경로로 수정 시도 * [IDLE-000] ci triggering branch 임시 변경 * [IDLE-000] firebaseApp 초기화 임시 비활성화 * [IDLE-000] firebaseApp 초기화 임시 비활성화 * [IDLE-000] firebaseApp 초기화 임시 비활성화 * [IDLE-000] file path 앞에 ./ 제외 * [IDLE-000] 절대 경로로 변경 시도 * [IDLE-000] fcm service key 생성 path 수정 * [IDLE-000] fcm service key json file 생성 스크립트 작성 * [IDLE-000] ci triggering branch develop으로 롤백 * [IDLE-000] 불필요 스크립트 제거 * [IDLE-000] firebase config의 현재 경로를 출력하도록 print문 추가 (#197) * [IDLE-000] firebase config의 현재 경로를 출력하도록 print문 추가 * [IDLE-000] ci triggering branch 수정 * [IDLE-000] ci triggering branch 수정 * [IDLE-000] firebase app 초기화 로직 주석 처리 * [IDLE-000] firebase app 초기화 로직 주석 처리 * [IDLE-000] firebase app 초기화 로직 주석 처리 * [IDLE-000] file 대신 string으로 주입받아 초기화하는 방식으로 전환 * [IDLE-000] 일반 string 대신 base64 인코딩 된 문자열을 주입하도록 처리 * [IDLE-000] 일반 string 주입으로 rollback * [IDLE-000] json string log 추가 * [IDLE-000] base64 문자열로 재 변경 * [IDLE-000] firebase config의 현재 경로를 출력하도록 print문 추가 * [IDLE-429] DB 형상관리를 위한 Flyway 적용 * [IDLE-429] Flyway latest version으로 설정 * [IDLE-429] 피드백 반영 * [IDLE-000] firebase config의 현재 경로를 출력하도록 print문 추가 * [IDLE-000] 알림 조회 처리 로직에 @transactional 추가 * [IDLE-000] 알림 조회 시, 생성 시각 기준이 아닌 uuid v7 id 기준으로 내림차순 정렬하도록 변경 * [IDLE-000] CI 트리거 브랜치 복구 * [IDLE-454] 테스트를 위한 크롤링 수행 시각 변경 및 로깅 추가 * [IDLE-000] 공고 범위 검색 내 중복 데이터 발생 방지 * [IDLE-000] ci 트리거 브랜치 변경 * [IDLE-000] ci 트리거 브랜치 롤백 * [IDLE-000] monitoring 모듈 추가 및 actuator, prometheus 의존성 추가 * [IDLE-456] monitoring.yml 작성 * [IDLE-456] monitoring profile 추가 * [IDLE-456] actuator dependency group name 수정 * [IDLE-000] 크롤링 주기 하루 2회로 변경 * [IDLE-000] 불필요 로그 제거 * [IDLE-000] 인증번호 SMS 내용 수정 * [IDLE-000] classPath 하위 yaml 파일 확장자 모두 .yml로 통일 * [IDLE-000] 즐겨찾기 facade service에 트랜잭션 추가 (#206) * [IDLE-000] firebase config의 현재 경로를 출력하도록 print문 추가 * [IDLE-000] facade service에 transaction 추가 * [IDLE-461] 유저가 다중 디바이스에서 알림을 받을 수 있도록 개선한다. (#207) * [IDLE-000] firebase config의 현재 경로를 출력하도록 print문 추가 * [IDLE-461] 한 유저가 다중 디바이스 설정이 가능하도록 한다. * [IDLE-000] firebase config의 현재 경로를 출력하도록 print문 추가 * [IDLE-000] presentation module의 gradle 파일에 monitoring 모듈 dependency 추가 * [IDLE-000] deviceToken 서비스에서 트랜잭션 어노테이션 추가 * [IDLE-000] batch 테스트를 위해 30분마다 동작하도록 변경 * [IDLE-475] 채팅, 채팅방 도메인 설계 * [IDLE-475] 채팅 메세지 최소, 최대 길이 제한 설정 * [IDLE-000] Batch 메타데이터 테이블 스크립트 변경 및 크롤링 수행 주기 설정 * [IDLE-000] 운영 환경 CD 스크립트에서 불필요한 step 제거 * [IDLE-000] 도텐브 파일 공백 제거 스크립트 작성, 크롤링 대상일자 전날 등록된 공고로 변경 * [IDLE-000] 크롤링 기준 시각 15시로 임시 변경 * [IDLE-000] cd env 파일 생성 스크립트 변경
* [IDLE-000] Production CI 스크립트 작성 * [IDLE-000] 센터 공고 수정 API 내 접수 방법 null 비허용 * [IDLE-000] 공고 지원자 조회 시, 삭제된 유저는 조회되지 않도록 수정 * [IDLE-363] 센터 관리자 전화 인증 요청 API * [IDLE-363] 개발 환경 ddl-auto 옵션 임시로 create 옵션으로 변경 * [IDLE-365] 공고 크롤러 selenium 로직 수정 및 로컬 동작 확인 * [IDLE-365] 테스트를 위한 스케줄러 기준 시각 변경 * [IDLE-365] batch job enable 옵션 비활성화 * [IDLE-365] ddl-auto update로 변경 * [IDLE-365] 크롤링 공고 필드 null 비허용 * [IDLE-365] 스케줄러 시간 02시로 설정 * [IDLE-366] spring batch selenium 크롤링을 위한 빌드 스크립트 수정 * [IDLE-366] worknet 사이트가 고용 24 사이트로 통합됨에 따라, 크롤링 스크립트 수정 * [IDLE-366] 크롤러 동작 스케줄링 시간 변경 * [IDLE-366] 스프링 초기 실행 시, spring batch 자동 실행 방지 옵션 추가 * [IDLE-366] spring batch 5 버전에서 업데이트 된 변경사항 적용 및 별도의 JobLauncher 구현 * [IDLE-366] 불필요 의존성 및 옵션 제거 * [IDLE-366] 크롤링 조회 API 내 entity status 필드 추가 및 쿼리 수정 * [IDLE-358] 운영 환경 CD 구축 및 운영 환경 profile 설정 추가 * [IDLE-358] 운영 환경 docker run 실행 시 예외 처리 * [IDLE-000] 크롤링 전체 조회 DTO 생성자 추가 * [IDLE-000] 공고 전체 조회 fetchJoin() 중복 이슈 해결을 위한 subquery 분리 * [IDLE-000] AI 코드리뷰 coderabbit 도입 * [IDLE-000] 크롤링 공고 반경범위 조회 필터를 위한 where절 추가 * [IDLE-000] TimeZone 설정이 적용되지 않는 문제 해결 * [IDLE-000] TimeZone 지정 및 @EnableScheduling 설정 * [IDLE-000] TimeZone 설정 제거 * [IDLE-000] 공고 전체 조회 쿼리 롤백 * [IDLE-000] 기존 공고 내 location을 기반으로 위.경도 값을 decoding하도록 변경 * [IDLE-000] 배포 전 최종 QA * [IDLE-000] 크롤링 공고 생성일자 필드 type 변경(timestamp -> date) * [IDLE-000] Redis 비밀번호 설정 추가 (#171) * [IDLE-000] Redis 비밀번호 설정 추가 * [IDLE-000] yaml 파일에 password 필드 추가 * [IDLE-000] redis local default password 설정 * [IDLE-000] compose 파일 내, 비밀번호 지정 command 설정 * [IDLE-000] Redis 볼륨 설정 * [IDLE-000] ci triggering branch 임시 변경 * [IDLE-000] ci triggering branch 롤백 * [IDLE-000] 테스트 심사 통과를 위한 전화번호 검증 로직 추가 * [IDLE-000] 테스트 심사 통과를 위한 전화번호 검증 로직 추가 * [IDLE-389] 센터 인증 요청 이벤트 발생 시, 디스코드 웹훅 알림을 전송하는 로직 작성 * [IDLE-389] 사업자 등록번호 client properties 클래스명 변경 * [IDLE-389] 코드 리뷰 반영 * [IDLE-000] 트랜잭션 전파 레벨 변경(REQUIRED -> REQUIRES_NEW) * [IDLE-396] FCM 모듈 추가 및 firebase 의존성 설정 * readme 제목 수정 * readme 제목 수정 * [IDLE-399] FCM Device Token 관리 API * [IDLE-399] 알림 도메인 설계 * [IDLE-000] fcm service 설정값 주입을 위한 디렉토리 구조 변경 * [IDLE-000] fcm service 설정값 주입을 위한 디렉토리 구조 변경 * [IDLE-400] 채용 공고 지원자 발생 시, 센터 관리자에게 알림을 발송한다. * [IDLE-400] fcm 모듈 설정 추가 * [IDLE-400] 공고 지원자 발생 시, 모든 센터 관리자들에게 다중 알림을 발송한다. * [IDLE-415] 알림 조회 처리 API * [IDLE-417] 읽지 않은 알림 수 집계 API * [IDLE-418] 알림 목록 조회 API * [IDLE-418] 피드백 반영 * [IDLE-423] soft-delete가 적용된 즐겨찾기 entity에서, 즐겨찾기 해제 후 다시 설정하는 경우 발생하는 버그를 해결한다. * [IDLE-424] 요양 보호사 공고 전체 조회 시, 삭제된 공고가 함께 보이는 문제 해결 * [IDLE-400] 채용 공고 지원자 발생 시, 센터 관리자에게 알림을 발송한다. (#183) * [IDLE-400] 채용 공고 지원자 발생 시, 센터 관리자에게 알림을 발송한다. * [IDLE-400] fcm 모듈 설정 추가 * [IDLE-400] 공고 지원자 발생 시, 모든 센터 관리자들에게 다중 알림을 발송한다. * [IDLE-400] 채용 공고 지원자 발생 시, 센터 관리자에게 알림을 발송한다. * [IDLE-400] fcm 모듈 설정 추가 * [IDLE-400] 공고 지원자 발생 시, 모든 센터 관리자들에게 다중 알림을 발송한다. * [IDLE-415] 알림 조회 처리 API * [IDLE-417] 읽지 않은 알림 수 집계 API * [IDLE-418] 알림 목록 조회 API * [IDLE-418] 피드백 반영 * [IDLE-423] soft-delete가 적용된 즐겨찾기 entity에서, 즐겨찾기 해제 후 다시 설정하는 경우 발생하는 버그를 해결한다. * [IDLE-424] 요양 보호사 공고 전체 조회 시, 삭제된 공고가 함께 보이는 문제 해결 * [IDLE-400] 알림 명세 변경 * [IDLE-400] fcm 설정 파일 디렉토리 path 변경 * [IDLE-400] ddl 옵션 변경 * [IDLE-400] ci/cd 옵션 변경 * [IDLE-000] ci triggering branch 복구 * [IDLE-000] develop 환경에서 fcm service 설정 파일 path 수정 * [IDLE-000] fcm service json 파일명 변경 * [IDLE-000] firebase service key 설정 경로 체크를 위해, cd 스크립트를 수정합니다. * Update README.md * [IDLE-000] fcm service key 경로를 class path 경로로 수정 시도 * [IDLE-000] ci triggering branch 임시 변경 * [IDLE-000] firebaseApp 초기화 임시 비활성화 * [IDLE-000] firebaseApp 초기화 임시 비활성화 * [IDLE-000] firebaseApp 초기화 임시 비활성화 * [IDLE-000] file path 앞에 ./ 제외 * [IDLE-000] 절대 경로로 변경 시도 * [IDLE-000] fcm service key 생성 path 수정 * [IDLE-000] fcm service key json file 생성 스크립트 작성 * [IDLE-000] ci triggering branch develop으로 롤백 * [IDLE-000] 불필요 스크립트 제거 * [IDLE-000] firebase config의 현재 경로를 출력하도록 print문 추가 (#197) * [IDLE-000] firebase config의 현재 경로를 출력하도록 print문 추가 * [IDLE-000] ci triggering branch 수정 * [IDLE-000] ci triggering branch 수정 * [IDLE-000] firebase app 초기화 로직 주석 처리 * [IDLE-000] firebase app 초기화 로직 주석 처리 * [IDLE-000] firebase app 초기화 로직 주석 처리 * [IDLE-000] file 대신 string으로 주입받아 초기화하는 방식으로 전환 * [IDLE-000] 일반 string 대신 base64 인코딩 된 문자열을 주입하도록 처리 * [IDLE-000] 일반 string 주입으로 rollback * [IDLE-000] json string log 추가 * [IDLE-000] base64 문자열로 재 변경 * [IDLE-000] firebase config의 현재 경로를 출력하도록 print문 추가 * [IDLE-429] DB 형상관리를 위한 Flyway 적용 * [IDLE-429] Flyway latest version으로 설정 * [IDLE-429] 피드백 반영 * [IDLE-000] firebase config의 현재 경로를 출력하도록 print문 추가 * [IDLE-000] 알림 조회 처리 로직에 @transactional 추가 * [IDLE-000] 알림 조회 시, 생성 시각 기준이 아닌 uuid v7 id 기준으로 내림차순 정렬하도록 변경 * [IDLE-000] CI 트리거 브랜치 복구 * [IDLE-454] 테스트를 위한 크롤링 수행 시각 변경 및 로깅 추가 * [IDLE-000] 공고 범위 검색 내 중복 데이터 발생 방지 * [IDLE-000] ci 트리거 브랜치 변경 * [IDLE-000] ci 트리거 브랜치 롤백 * [IDLE-000] monitoring 모듈 추가 및 actuator, prometheus 의존성 추가 * [IDLE-456] monitoring.yml 작성 * [IDLE-456] monitoring profile 추가 * [IDLE-456] actuator dependency group name 수정 * [IDLE-000] 크롤링 주기 하루 2회로 변경 * [IDLE-000] 불필요 로그 제거 * [IDLE-000] 인증번호 SMS 내용 수정 * [IDLE-000] classPath 하위 yaml 파일 확장자 모두 .yml로 통일 * [IDLE-000] 즐겨찾기 facade service에 트랜잭션 추가 (#206) * [IDLE-000] firebase config의 현재 경로를 출력하도록 print문 추가 * [IDLE-000] facade service에 transaction 추가 * [IDLE-461] 유저가 다중 디바이스에서 알림을 받을 수 있도록 개선한다. (#207) * [IDLE-000] firebase config의 현재 경로를 출력하도록 print문 추가 * [IDLE-461] 한 유저가 다중 디바이스 설정이 가능하도록 한다. * [IDLE-000] firebase config의 현재 경로를 출력하도록 print문 추가 * [IDLE-000] presentation module의 gradle 파일에 monitoring 모듈 dependency 추가 * [IDLE-000] deviceToken 서비스에서 트랜잭션 어노테이션 추가 * [IDLE-000] batch 테스트를 위해 30분마다 동작하도록 변경 * [IDLE-475] 채팅, 채팅방 도메인 설계 * [IDLE-475] 채팅 메세지 최소, 최대 길이 제한 설정 * [IDLE-000] Batch 메타데이터 테이블 스크립트 변경 및 크롤링 수행 주기 설정 * [IDLE-000] 운영 환경 CD 스크립트에서 불필요한 step 제거 * [IDLE-000] 도텐브 파일 공백 제거 스크립트 작성, 크롤링 대상일자 전날 등록된 공고로 변경 * [IDLE-000] 크롤링 기준 시각 15시로 임시 변경 * [IDLE-000] cd env 파일 생성 스크립트 변경 * [IDLE-000] docker run 스크립트 오류 해결 시도
* [IDLE-000] Production CI 스크립트 작성 * [IDLE-000] 센터 공고 수정 API 내 접수 방법 null 비허용 * [IDLE-000] 공고 지원자 조회 시, 삭제된 유저는 조회되지 않도록 수정 * [IDLE-363] 센터 관리자 전화 인증 요청 API * [IDLE-363] 개발 환경 ddl-auto 옵션 임시로 create 옵션으로 변경 * [IDLE-365] 공고 크롤러 selenium 로직 수정 및 로컬 동작 확인 * [IDLE-365] 테스트를 위한 스케줄러 기준 시각 변경 * [IDLE-365] batch job enable 옵션 비활성화 * [IDLE-365] ddl-auto update로 변경 * [IDLE-365] 크롤링 공고 필드 null 비허용 * [IDLE-365] 스케줄러 시간 02시로 설정 * [IDLE-366] spring batch selenium 크롤링을 위한 빌드 스크립트 수정 * [IDLE-366] worknet 사이트가 고용 24 사이트로 통합됨에 따라, 크롤링 스크립트 수정 * [IDLE-366] 크롤러 동작 스케줄링 시간 변경 * [IDLE-366] 스프링 초기 실행 시, spring batch 자동 실행 방지 옵션 추가 * [IDLE-366] spring batch 5 버전에서 업데이트 된 변경사항 적용 및 별도의 JobLauncher 구현 * [IDLE-366] 불필요 의존성 및 옵션 제거 * [IDLE-366] 크롤링 조회 API 내 entity status 필드 추가 및 쿼리 수정 * [IDLE-358] 운영 환경 CD 구축 및 운영 환경 profile 설정 추가 * [IDLE-358] 운영 환경 docker run 실행 시 예외 처리 * [IDLE-000] 크롤링 전체 조회 DTO 생성자 추가 * [IDLE-000] 공고 전체 조회 fetchJoin() 중복 이슈 해결을 위한 subquery 분리 * [IDLE-000] AI 코드리뷰 coderabbit 도입 * [IDLE-000] 크롤링 공고 반경범위 조회 필터를 위한 where절 추가 * [IDLE-000] TimeZone 설정이 적용되지 않는 문제 해결 * [IDLE-000] TimeZone 지정 및 @EnableScheduling 설정 * [IDLE-000] TimeZone 설정 제거 * [IDLE-000] 공고 전체 조회 쿼리 롤백 * [IDLE-000] 기존 공고 내 location을 기반으로 위.경도 값을 decoding하도록 변경 * [IDLE-000] 배포 전 최종 QA * [IDLE-000] 크롤링 공고 생성일자 필드 type 변경(timestamp -> date) * [IDLE-000] Redis 비밀번호 설정 추가 (#171) * [IDLE-000] Redis 비밀번호 설정 추가 * [IDLE-000] yaml 파일에 password 필드 추가 * [IDLE-000] redis local default password 설정 * [IDLE-000] compose 파일 내, 비밀번호 지정 command 설정 * [IDLE-000] Redis 볼륨 설정 * [IDLE-000] ci triggering branch 임시 변경 * [IDLE-000] ci triggering branch 롤백 * [IDLE-000] 테스트 심사 통과를 위한 전화번호 검증 로직 추가 * [IDLE-000] 테스트 심사 통과를 위한 전화번호 검증 로직 추가 * [IDLE-389] 센터 인증 요청 이벤트 발생 시, 디스코드 웹훅 알림을 전송하는 로직 작성 * [IDLE-389] 사업자 등록번호 client properties 클래스명 변경 * [IDLE-389] 코드 리뷰 반영 * [IDLE-000] 트랜잭션 전파 레벨 변경(REQUIRED -> REQUIRES_NEW) * [IDLE-396] FCM 모듈 추가 및 firebase 의존성 설정 * readme 제목 수정 * readme 제목 수정 * [IDLE-399] FCM Device Token 관리 API * [IDLE-399] 알림 도메인 설계 * [IDLE-000] fcm service 설정값 주입을 위한 디렉토리 구조 변경 * [IDLE-000] fcm service 설정값 주입을 위한 디렉토리 구조 변경 * [IDLE-400] 채용 공고 지원자 발생 시, 센터 관리자에게 알림을 발송한다. * [IDLE-400] fcm 모듈 설정 추가 * [IDLE-400] 공고 지원자 발생 시, 모든 센터 관리자들에게 다중 알림을 발송한다. * [IDLE-415] 알림 조회 처리 API * [IDLE-417] 읽지 않은 알림 수 집계 API * [IDLE-418] 알림 목록 조회 API * [IDLE-418] 피드백 반영 * [IDLE-423] soft-delete가 적용된 즐겨찾기 entity에서, 즐겨찾기 해제 후 다시 설정하는 경우 발생하는 버그를 해결한다. * [IDLE-424] 요양 보호사 공고 전체 조회 시, 삭제된 공고가 함께 보이는 문제 해결 * [IDLE-400] 채용 공고 지원자 발생 시, 센터 관리자에게 알림을 발송한다. (#183) * [IDLE-400] 채용 공고 지원자 발생 시, 센터 관리자에게 알림을 발송한다. * [IDLE-400] fcm 모듈 설정 추가 * [IDLE-400] 공고 지원자 발생 시, 모든 센터 관리자들에게 다중 알림을 발송한다. * [IDLE-400] 채용 공고 지원자 발생 시, 센터 관리자에게 알림을 발송한다. * [IDLE-400] fcm 모듈 설정 추가 * [IDLE-400] 공고 지원자 발생 시, 모든 센터 관리자들에게 다중 알림을 발송한다. * [IDLE-415] 알림 조회 처리 API * [IDLE-417] 읽지 않은 알림 수 집계 API * [IDLE-418] 알림 목록 조회 API * [IDLE-418] 피드백 반영 * [IDLE-423] soft-delete가 적용된 즐겨찾기 entity에서, 즐겨찾기 해제 후 다시 설정하는 경우 발생하는 버그를 해결한다. * [IDLE-424] 요양 보호사 공고 전체 조회 시, 삭제된 공고가 함께 보이는 문제 해결 * [IDLE-400] 알림 명세 변경 * [IDLE-400] fcm 설정 파일 디렉토리 path 변경 * [IDLE-400] ddl 옵션 변경 * [IDLE-400] ci/cd 옵션 변경 * [IDLE-000] ci triggering branch 복구 * [IDLE-000] develop 환경에서 fcm service 설정 파일 path 수정 * [IDLE-000] fcm service json 파일명 변경 * [IDLE-000] firebase service key 설정 경로 체크를 위해, cd 스크립트를 수정합니다. * Update README.md * [IDLE-000] fcm service key 경로를 class path 경로로 수정 시도 * [IDLE-000] ci triggering branch 임시 변경 * [IDLE-000] firebaseApp 초기화 임시 비활성화 * [IDLE-000] firebaseApp 초기화 임시 비활성화 * [IDLE-000] firebaseApp 초기화 임시 비활성화 * [IDLE-000] file path 앞에 ./ 제외 * [IDLE-000] 절대 경로로 변경 시도 * [IDLE-000] fcm service key 생성 path 수정 * [IDLE-000] fcm service key json file 생성 스크립트 작성 * [IDLE-000] ci triggering branch develop으로 롤백 * [IDLE-000] 불필요 스크립트 제거 * [IDLE-000] firebase config의 현재 경로를 출력하도록 print문 추가 (#197) * [IDLE-000] firebase config의 현재 경로를 출력하도록 print문 추가 * [IDLE-000] ci triggering branch 수정 * [IDLE-000] ci triggering branch 수정 * [IDLE-000] firebase app 초기화 로직 주석 처리 * [IDLE-000] firebase app 초기화 로직 주석 처리 * [IDLE-000] firebase app 초기화 로직 주석 처리 * [IDLE-000] file 대신 string으로 주입받아 초기화하는 방식으로 전환 * [IDLE-000] 일반 string 대신 base64 인코딩 된 문자열을 주입하도록 처리 * [IDLE-000] 일반 string 주입으로 rollback * [IDLE-000] json string log 추가 * [IDLE-000] base64 문자열로 재 변경 * [IDLE-000] firebase config의 현재 경로를 출력하도록 print문 추가 * [IDLE-429] DB 형상관리를 위한 Flyway 적용 * [IDLE-429] Flyway latest version으로 설정 * [IDLE-429] 피드백 반영 * [IDLE-000] firebase config의 현재 경로를 출력하도록 print문 추가 * [IDLE-000] 알림 조회 처리 로직에 @transactional 추가 * [IDLE-000] 알림 조회 시, 생성 시각 기준이 아닌 uuid v7 id 기준으로 내림차순 정렬하도록 변경 * [IDLE-000] CI 트리거 브랜치 복구 * [IDLE-454] 테스트를 위한 크롤링 수행 시각 변경 및 로깅 추가 * [IDLE-000] 공고 범위 검색 내 중복 데이터 발생 방지 * [IDLE-000] ci 트리거 브랜치 변경 * [IDLE-000] ci 트리거 브랜치 롤백 * [IDLE-000] monitoring 모듈 추가 및 actuator, prometheus 의존성 추가 * [IDLE-456] monitoring.yml 작성 * [IDLE-456] monitoring profile 추가 * [IDLE-456] actuator dependency group name 수정 * [IDLE-000] 크롤링 주기 하루 2회로 변경 * [IDLE-000] 불필요 로그 제거 * [IDLE-000] 인증번호 SMS 내용 수정 * [IDLE-000] classPath 하위 yaml 파일 확장자 모두 .yml로 통일 * [IDLE-000] 즐겨찾기 facade service에 트랜잭션 추가 (#206) * [IDLE-000] firebase config의 현재 경로를 출력하도록 print문 추가 * [IDLE-000] facade service에 transaction 추가 * [IDLE-461] 유저가 다중 디바이스에서 알림을 받을 수 있도록 개선한다. (#207) * [IDLE-000] firebase config의 현재 경로를 출력하도록 print문 추가 * [IDLE-461] 한 유저가 다중 디바이스 설정이 가능하도록 한다. * [IDLE-000] firebase config의 현재 경로를 출력하도록 print문 추가 * [IDLE-000] presentation module의 gradle 파일에 monitoring 모듈 dependency 추가 * [IDLE-000] deviceToken 서비스에서 트랜잭션 어노테이션 추가 * [IDLE-000] batch 테스트를 위해 30분마다 동작하도록 변경 * [IDLE-475] 채팅, 채팅방 도메인 설계 * [IDLE-475] 채팅 메세지 최소, 최대 길이 제한 설정 * [IDLE-000] Batch 메타데이터 테이블 스크립트 변경 및 크롤링 수행 주기 설정 * [IDLE-000] 운영 환경 CD 스크립트에서 불필요한 step 제거 * [IDLE-000] 도텐브 파일 공백 제거 스크립트 작성, 크롤링 대상일자 전날 등록된 공고로 변경 * [IDLE-000] 크롤링 기준 시각 15시로 임시 변경 * [IDLE-000] cd env 파일 생성 스크립트 변경 * [IDLE-492] 동일 유저가 여러 개의 디바이스를 사용 시, 알림이 중복해서 누적되는 현상 * [IDLE-493] flyway 스크립트 오탈자 수정 * [IDLE-493] flyway 스크립트 오탈자 수정 * [IDLE-494] 요양 보호사 및 센터 프로필에서 긴 텍스트를 입력 가능한 항목을 TEXT 컬럼으로 지정한다. * [IDLE-495] 요양 보호사는 마감된 공고에 지원이 불가능하다. * [IDLE-495] 공고 마감 처리 메서드명 변경 complete -> completed * [IDLE-496] 스프링 프로파일 지정을 위한 환경변수 주입 * [IDLE-496] 로그 일부 수정 * hotfix/v1.1.0
* [IDLE-000] Production CI 스크립트 작성 * [IDLE-000] 센터 공고 수정 API 내 접수 방법 null 비허용 * [IDLE-000] 공고 지원자 조회 시, 삭제된 유저는 조회되지 않도록 수정 * [IDLE-363] 센터 관리자 전화 인증 요청 API * [IDLE-363] 개발 환경 ddl-auto 옵션 임시로 create 옵션으로 변경 * [IDLE-365] 공고 크롤러 selenium 로직 수정 및 로컬 동작 확인 * [IDLE-365] 테스트를 위한 스케줄러 기준 시각 변경 * [IDLE-365] batch job enable 옵션 비활성화 * [IDLE-365] ddl-auto update로 변경 * [IDLE-365] 크롤링 공고 필드 null 비허용 * [IDLE-365] 스케줄러 시간 02시로 설정 * [IDLE-366] spring batch selenium 크롤링을 위한 빌드 스크립트 수정 * [IDLE-366] worknet 사이트가 고용 24 사이트로 통합됨에 따라, 크롤링 스크립트 수정 * [IDLE-366] 크롤러 동작 스케줄링 시간 변경 * [IDLE-366] 스프링 초기 실행 시, spring batch 자동 실행 방지 옵션 추가 * [IDLE-366] spring batch 5 버전에서 업데이트 된 변경사항 적용 및 별도의 JobLauncher 구현 * [IDLE-366] 불필요 의존성 및 옵션 제거 * [IDLE-366] 크롤링 조회 API 내 entity status 필드 추가 및 쿼리 수정 * [IDLE-358] 운영 환경 CD 구축 및 운영 환경 profile 설정 추가 * [IDLE-358] 운영 환경 docker run 실행 시 예외 처리 * [IDLE-000] 크롤링 전체 조회 DTO 생성자 추가 * [IDLE-000] 공고 전체 조회 fetchJoin() 중복 이슈 해결을 위한 subquery 분리 * [IDLE-000] AI 코드리뷰 coderabbit 도입 * [IDLE-000] 크롤링 공고 반경범위 조회 필터를 위한 where절 추가 * [IDLE-000] TimeZone 설정이 적용되지 않는 문제 해결 * [IDLE-000] TimeZone 지정 및 @EnableScheduling 설정 * [IDLE-000] TimeZone 설정 제거 * [IDLE-000] 공고 전체 조회 쿼리 롤백 * [IDLE-000] 기존 공고 내 location을 기반으로 위.경도 값을 decoding하도록 변경 * [IDLE-000] 배포 전 최종 QA * [IDLE-000] 크롤링 공고 생성일자 필드 type 변경(timestamp -> date) * [IDLE-000] Redis 비밀번호 설정 추가 (#171) * [IDLE-000] Redis 비밀번호 설정 추가 * [IDLE-000] yaml 파일에 password 필드 추가 * [IDLE-000] redis local default password 설정 * [IDLE-000] compose 파일 내, 비밀번호 지정 command 설정 * [IDLE-000] Redis 볼륨 설정 * [IDLE-000] ci triggering branch 임시 변경 * [IDLE-000] ci triggering branch 롤백 * [IDLE-000] 테스트 심사 통과를 위한 전화번호 검증 로직 추가 * [IDLE-000] 테스트 심사 통과를 위한 전화번호 검증 로직 추가 * [IDLE-389] 센터 인증 요청 이벤트 발생 시, 디스코드 웹훅 알림을 전송하는 로직 작성 * [IDLE-389] 사업자 등록번호 client properties 클래스명 변경 * [IDLE-389] 코드 리뷰 반영 * [IDLE-000] 트랜잭션 전파 레벨 변경(REQUIRED -> REQUIRES_NEW) * [IDLE-396] FCM 모듈 추가 및 firebase 의존성 설정 * readme 제목 수정 * readme 제목 수정 * [IDLE-399] FCM Device Token 관리 API * [IDLE-399] 알림 도메인 설계 * [IDLE-000] fcm service 설정값 주입을 위한 디렉토리 구조 변경 * [IDLE-000] fcm service 설정값 주입을 위한 디렉토리 구조 변경 * [IDLE-400] 채용 공고 지원자 발생 시, 센터 관리자에게 알림을 발송한다. * [IDLE-400] fcm 모듈 설정 추가 * [IDLE-400] 공고 지원자 발생 시, 모든 센터 관리자들에게 다중 알림을 발송한다. * [IDLE-415] 알림 조회 처리 API * [IDLE-417] 읽지 않은 알림 수 집계 API * [IDLE-418] 알림 목록 조회 API * [IDLE-418] 피드백 반영 * [IDLE-423] soft-delete가 적용된 즐겨찾기 entity에서, 즐겨찾기 해제 후 다시 설정하는 경우 발생하는 버그를 해결한다. * [IDLE-424] 요양 보호사 공고 전체 조회 시, 삭제된 공고가 함께 보이는 문제 해결 * [IDLE-400] 채용 공고 지원자 발생 시, 센터 관리자에게 알림을 발송한다. (#183) * [IDLE-400] 채용 공고 지원자 발생 시, 센터 관리자에게 알림을 발송한다. * [IDLE-400] fcm 모듈 설정 추가 * [IDLE-400] 공고 지원자 발생 시, 모든 센터 관리자들에게 다중 알림을 발송한다. * [IDLE-400] 채용 공고 지원자 발생 시, 센터 관리자에게 알림을 발송한다. * [IDLE-400] fcm 모듈 설정 추가 * [IDLE-400] 공고 지원자 발생 시, 모든 센터 관리자들에게 다중 알림을 발송한다. * [IDLE-415] 알림 조회 처리 API * [IDLE-417] 읽지 않은 알림 수 집계 API * [IDLE-418] 알림 목록 조회 API * [IDLE-418] 피드백 반영 * [IDLE-423] soft-delete가 적용된 즐겨찾기 entity에서, 즐겨찾기 해제 후 다시 설정하는 경우 발생하는 버그를 해결한다. * [IDLE-424] 요양 보호사 공고 전체 조회 시, 삭제된 공고가 함께 보이는 문제 해결 * [IDLE-400] 알림 명세 변경 * [IDLE-400] fcm 설정 파일 디렉토리 path 변경 * [IDLE-400] ddl 옵션 변경 * [IDLE-400] ci/cd 옵션 변경 * [IDLE-000] ci triggering branch 복구 * [IDLE-000] develop 환경에서 fcm service 설정 파일 path 수정 * [IDLE-000] fcm service json 파일명 변경 * [IDLE-000] firebase service key 설정 경로 체크를 위해, cd 스크립트를 수정합니다. * Update README.md * [IDLE-000] fcm service key 경로를 class path 경로로 수정 시도 * [IDLE-000] ci triggering branch 임시 변경 * [IDLE-000] firebaseApp 초기화 임시 비활성화 * [IDLE-000] firebaseApp 초기화 임시 비활성화 * [IDLE-000] firebaseApp 초기화 임시 비활성화 * [IDLE-000] file path 앞에 ./ 제외 * [IDLE-000] 절대 경로로 변경 시도 * [IDLE-000] fcm service key 생성 path 수정 * [IDLE-000] fcm service key json file 생성 스크립트 작성 * [IDLE-000] ci triggering branch develop으로 롤백 * [IDLE-000] 불필요 스크립트 제거 * [IDLE-000] firebase config의 현재 경로를 출력하도록 print문 추가 (#197) * [IDLE-000] firebase config의 현재 경로를 출력하도록 print문 추가 * [IDLE-000] ci triggering branch 수정 * [IDLE-000] ci triggering branch 수정 * [IDLE-000] firebase app 초기화 로직 주석 처리 * [IDLE-000] firebase app 초기화 로직 주석 처리 * [IDLE-000] firebase app 초기화 로직 주석 처리 * [IDLE-000] file 대신 string으로 주입받아 초기화하는 방식으로 전환 * [IDLE-000] 일반 string 대신 base64 인코딩 된 문자열을 주입하도록 처리 * [IDLE-000] 일반 string 주입으로 rollback * [IDLE-000] json string log 추가 * [IDLE-000] base64 문자열로 재 변경 * [IDLE-000] firebase config의 현재 경로를 출력하도록 print문 추가 * [IDLE-429] DB 형상관리를 위한 Flyway 적용 * [IDLE-429] Flyway latest version으로 설정 * [IDLE-429] 피드백 반영 * [IDLE-000] firebase config의 현재 경로를 출력하도록 print문 추가 * [IDLE-000] 알림 조회 처리 로직에 @transactional 추가 * [IDLE-000] 알림 조회 시, 생성 시각 기준이 아닌 uuid v7 id 기준으로 내림차순 정렬하도록 변경 * [IDLE-000] CI 트리거 브랜치 복구 * [IDLE-454] 테스트를 위한 크롤링 수행 시각 변경 및 로깅 추가 * [IDLE-000] 공고 범위 검색 내 중복 데이터 발생 방지 * [IDLE-000] ci 트리거 브랜치 변경 * [IDLE-000] ci 트리거 브랜치 롤백 * [IDLE-000] monitoring 모듈 추가 및 actuator, prometheus 의존성 추가 * [IDLE-456] monitoring.yml 작성 * [IDLE-456] monitoring profile 추가 * [IDLE-456] actuator dependency group name 수정 * [IDLE-000] 크롤링 주기 하루 2회로 변경 * [IDLE-000] 불필요 로그 제거 * [IDLE-000] 인증번호 SMS 내용 수정 * [IDLE-000] classPath 하위 yaml 파일 확장자 모두 .yml로 통일 * [IDLE-000] 즐겨찾기 facade service에 트랜잭션 추가 (#206) * [IDLE-000] firebase config의 현재 경로를 출력하도록 print문 추가 * [IDLE-000] facade service에 transaction 추가 * [IDLE-461] 유저가 다중 디바이스에서 알림을 받을 수 있도록 개선한다. (#207) * [IDLE-000] firebase config의 현재 경로를 출력하도록 print문 추가 * [IDLE-461] 한 유저가 다중 디바이스 설정이 가능하도록 한다. * [IDLE-000] firebase config의 현재 경로를 출력하도록 print문 추가 * [IDLE-000] presentation module의 gradle 파일에 monitoring 모듈 dependency 추가 * [IDLE-000] deviceToken 서비스에서 트랜잭션 어노테이션 추가 * [IDLE-000] batch 테스트를 위해 30분마다 동작하도록 변경 * [IDLE-475] 채팅, 채팅방 도메인 설계 * [IDLE-475] 채팅 메세지 최소, 최대 길이 제한 설정 * [IDLE-000] Batch 메타데이터 테이블 스크립트 변경 및 크롤링 수행 주기 설정 * [IDLE-000] 운영 환경 CD 스크립트에서 불필요한 step 제거 * [IDLE-000] 도텐브 파일 공백 제거 스크립트 작성, 크롤링 대상일자 전날 등록된 공고로 변경 * [IDLE-000] 크롤링 기준 시각 15시로 임시 변경 * [IDLE-000] cd env 파일 생성 스크립트 변경 * [IDLE-492] 동일 유저가 여러 개의 디바이스를 사용 시, 알림이 중복해서 누적되는 현상 * [IDLE-493] flyway 스크립트 오탈자 수정 * [IDLE-493] flyway 스크립트 오탈자 수정 * [IDLE-494] 요양 보호사 및 센터 프로필에서 긴 텍스트를 입력 가능한 항목을 TEXT 컬럼으로 지정한다. * [IDLE-495] 요양 보호사는 마감된 공고에 지원이 불가능하다. * [IDLE-495] 공고 마감 처리 메서드명 변경 complete -> completed * [IDLE-496] 스프링 프로파일 지정을 위한 환경변수 주입 * [IDLE-496] 로그 일부 수정 * [IDLE-000] 안드로이드 app link를 위한 asset 추가 * [IDLE-190] 센터 관리자 인증 요청 목록 조회 API * [IDLE-000] 크롤링 주기 변경 및 테스트용 에러 로그 추가 * [IDLE-000] 크롤링 대상 사이트에 알림창(alert)이 뜨는 케이스에 대한 처리 * [IDLE-509] 크롤링 전체 조회 시, 공고가 중복 노출되는 현상 해결 * [IDLE-509] 피드백 반영 * [IDLE-509] 사용하지 않는 하위 서비스 의존성 제거 * [IDLE-000] 크롤링 진행 시각 저녁 11시로 변경
* [IDLE-000] Production CI 스크립트 작성 * [IDLE-000] 센터 공고 수정 API 내 접수 방법 null 비허용 * [IDLE-000] 공고 지원자 조회 시, 삭제된 유저는 조회되지 않도록 수정 * [IDLE-363] 센터 관리자 전화 인증 요청 API * [IDLE-363] 개발 환경 ddl-auto 옵션 임시로 create 옵션으로 변경 * [IDLE-365] 공고 크롤러 selenium 로직 수정 및 로컬 동작 확인 * [IDLE-365] 테스트를 위한 스케줄러 기준 시각 변경 * [IDLE-365] batch job enable 옵션 비활성화 * [IDLE-365] ddl-auto update로 변경 * [IDLE-365] 크롤링 공고 필드 null 비허용 * [IDLE-365] 스케줄러 시간 02시로 설정 * [IDLE-366] spring batch selenium 크롤링을 위한 빌드 스크립트 수정 * [IDLE-366] worknet 사이트가 고용 24 사이트로 통합됨에 따라, 크롤링 스크립트 수정 * [IDLE-366] 크롤러 동작 스케줄링 시간 변경 * [IDLE-366] 스프링 초기 실행 시, spring batch 자동 실행 방지 옵션 추가 * [IDLE-366] spring batch 5 버전에서 업데이트 된 변경사항 적용 및 별도의 JobLauncher 구현 * [IDLE-366] 불필요 의존성 및 옵션 제거 * [IDLE-366] 크롤링 조회 API 내 entity status 필드 추가 및 쿼리 수정 * [IDLE-358] 운영 환경 CD 구축 및 운영 환경 profile 설정 추가 * [IDLE-358] 운영 환경 docker run 실행 시 예외 처리 * [IDLE-000] 크롤링 전체 조회 DTO 생성자 추가 * [IDLE-000] 공고 전체 조회 fetchJoin() 중복 이슈 해결을 위한 subquery 분리 * [IDLE-000] AI 코드리뷰 coderabbit 도입 * [IDLE-000] 크롤링 공고 반경범위 조회 필터를 위한 where절 추가 * [IDLE-000] TimeZone 설정이 적용되지 않는 문제 해결 * [IDLE-000] TimeZone 지정 및 @EnableScheduling 설정 * [IDLE-000] TimeZone 설정 제거 * [IDLE-000] 공고 전체 조회 쿼리 롤백 * [IDLE-000] 기존 공고 내 location을 기반으로 위.경도 값을 decoding하도록 변경 * [IDLE-000] 배포 전 최종 QA * [IDLE-000] 크롤링 공고 생성일자 필드 type 변경(timestamp -> date) * [IDLE-000] Redis 비밀번호 설정 추가 (#171) * [IDLE-000] Redis 비밀번호 설정 추가 * [IDLE-000] yaml 파일에 password 필드 추가 * [IDLE-000] redis local default password 설정 * [IDLE-000] compose 파일 내, 비밀번호 지정 command 설정 * [IDLE-000] Redis 볼륨 설정 * [IDLE-000] ci triggering branch 임시 변경 * [IDLE-000] ci triggering branch 롤백 * [IDLE-000] 테스트 심사 통과를 위한 전화번호 검증 로직 추가 * [IDLE-000] 테스트 심사 통과를 위한 전화번호 검증 로직 추가 * [IDLE-389] 센터 인증 요청 이벤트 발생 시, 디스코드 웹훅 알림을 전송하는 로직 작성 * [IDLE-389] 사업자 등록번호 client properties 클래스명 변경 * [IDLE-389] 코드 리뷰 반영 * [IDLE-000] 트랜잭션 전파 레벨 변경(REQUIRED -> REQUIRES_NEW) * [IDLE-396] FCM 모듈 추가 및 firebase 의존성 설정 * readme 제목 수정 * readme 제목 수정 * [IDLE-399] FCM Device Token 관리 API * [IDLE-399] 알림 도메인 설계 * [IDLE-000] fcm service 설정값 주입을 위한 디렉토리 구조 변경 * [IDLE-000] fcm service 설정값 주입을 위한 디렉토리 구조 변경 * [IDLE-400] 채용 공고 지원자 발생 시, 센터 관리자에게 알림을 발송한다. * [IDLE-400] fcm 모듈 설정 추가 * [IDLE-400] 공고 지원자 발생 시, 모든 센터 관리자들에게 다중 알림을 발송한다. * [IDLE-415] 알림 조회 처리 API * [IDLE-417] 읽지 않은 알림 수 집계 API * [IDLE-418] 알림 목록 조회 API * [IDLE-418] 피드백 반영 * [IDLE-423] soft-delete가 적용된 즐겨찾기 entity에서, 즐겨찾기 해제 후 다시 설정하는 경우 발생하는 버그를 해결한다. * [IDLE-424] 요양 보호사 공고 전체 조회 시, 삭제된 공고가 함께 보이는 문제 해결 * [IDLE-400] 채용 공고 지원자 발생 시, 센터 관리자에게 알림을 발송한다. (#183) * [IDLE-400] 채용 공고 지원자 발생 시, 센터 관리자에게 알림을 발송한다. * [IDLE-400] fcm 모듈 설정 추가 * [IDLE-400] 공고 지원자 발생 시, 모든 센터 관리자들에게 다중 알림을 발송한다. * [IDLE-400] 채용 공고 지원자 발생 시, 센터 관리자에게 알림을 발송한다. * [IDLE-400] fcm 모듈 설정 추가 * [IDLE-400] 공고 지원자 발생 시, 모든 센터 관리자들에게 다중 알림을 발송한다. * [IDLE-415] 알림 조회 처리 API * [IDLE-417] 읽지 않은 알림 수 집계 API * [IDLE-418] 알림 목록 조회 API * [IDLE-418] 피드백 반영 * [IDLE-423] soft-delete가 적용된 즐겨찾기 entity에서, 즐겨찾기 해제 후 다시 설정하는 경우 발생하는 버그를 해결한다. * [IDLE-424] 요양 보호사 공고 전체 조회 시, 삭제된 공고가 함께 보이는 문제 해결 * [IDLE-400] 알림 명세 변경 * [IDLE-400] fcm 설정 파일 디렉토리 path 변경 * [IDLE-400] ddl 옵션 변경 * [IDLE-400] ci/cd 옵션 변경 * [IDLE-000] ci triggering branch 복구 * [IDLE-000] develop 환경에서 fcm service 설정 파일 path 수정 * [IDLE-000] fcm service json 파일명 변경 * [IDLE-000] firebase service key 설정 경로 체크를 위해, cd 스크립트를 수정합니다. * Update README.md * [IDLE-000] fcm service key 경로를 class path 경로로 수정 시도 * [IDLE-000] ci triggering branch 임시 변경 * [IDLE-000] firebaseApp 초기화 임시 비활성화 * [IDLE-000] firebaseApp 초기화 임시 비활성화 * [IDLE-000] firebaseApp 초기화 임시 비활성화 * [IDLE-000] file path 앞에 ./ 제외 * [IDLE-000] 절대 경로로 변경 시도 * [IDLE-000] fcm service key 생성 path 수정 * [IDLE-000] fcm service key json file 생성 스크립트 작성 * [IDLE-000] ci triggering branch develop으로 롤백 * [IDLE-000] 불필요 스크립트 제거 * [IDLE-000] firebase config의 현재 경로를 출력하도록 print문 추가 (#197) * [IDLE-000] firebase config의 현재 경로를 출력하도록 print문 추가 * [IDLE-000] ci triggering branch 수정 * [IDLE-000] ci triggering branch 수정 * [IDLE-000] firebase app 초기화 로직 주석 처리 * [IDLE-000] firebase app 초기화 로직 주석 처리 * [IDLE-000] firebase app 초기화 로직 주석 처리 * [IDLE-000] file 대신 string으로 주입받아 초기화하는 방식으로 전환 * [IDLE-000] 일반 string 대신 base64 인코딩 된 문자열을 주입하도록 처리 * [IDLE-000] 일반 string 주입으로 rollback * [IDLE-000] json string log 추가 * [IDLE-000] base64 문자열로 재 변경 * [IDLE-000] firebase config의 현재 경로를 출력하도록 print문 추가 * [IDLE-429] DB 형상관리를 위한 Flyway 적용 * [IDLE-429] Flyway latest version으로 설정 * [IDLE-429] 피드백 반영 * [IDLE-000] firebase config의 현재 경로를 출력하도록 print문 추가 * [IDLE-000] 알림 조회 처리 로직에 @transactional 추가 * [IDLE-000] 알림 조회 시, 생성 시각 기준이 아닌 uuid v7 id 기준으로 내림차순 정렬하도록 변경 * [IDLE-000] CI 트리거 브랜치 복구 * [IDLE-454] 테스트를 위한 크롤링 수행 시각 변경 및 로깅 추가 * [IDLE-000] 공고 범위 검색 내 중복 데이터 발생 방지 * [IDLE-000] ci 트리거 브랜치 변경 * [IDLE-000] ci 트리거 브랜치 롤백 * [IDLE-000] monitoring 모듈 추가 및 actuator, prometheus 의존성 추가 * [IDLE-456] monitoring.yml 작성 * [IDLE-456] monitoring profile 추가 * [IDLE-456] actuator dependency group name 수정 * [IDLE-000] 크롤링 주기 하루 2회로 변경 * [IDLE-000] 불필요 로그 제거 * [IDLE-000] 인증번호 SMS 내용 수정 * [IDLE-000] classPath 하위 yaml 파일 확장자 모두 .yml로 통일 * [IDLE-000] 즐겨찾기 facade service에 트랜잭션 추가 (#206) * [IDLE-000] firebase config의 현재 경로를 출력하도록 print문 추가 * [IDLE-000] facade service에 transaction 추가 * [IDLE-461] 유저가 다중 디바이스에서 알림을 받을 수 있도록 개선한다. (#207) * [IDLE-000] firebase config의 현재 경로를 출력하도록 print문 추가 * [IDLE-461] 한 유저가 다중 디바이스 설정이 가능하도록 한다. * [IDLE-000] firebase config의 현재 경로를 출력하도록 print문 추가 * [IDLE-000] presentation module의 gradle 파일에 monitoring 모듈 dependency 추가 * [IDLE-000] deviceToken 서비스에서 트랜잭션 어노테이션 추가 * [IDLE-000] batch 테스트를 위해 30분마다 동작하도록 변경 * [IDLE-475] 채팅, 채팅방 도메인 설계 * [IDLE-475] 채팅 메세지 최소, 최대 길이 제한 설정 * [IDLE-000] Batch 메타데이터 테이블 스크립트 변경 및 크롤링 수행 주기 설정 * [IDLE-000] 운영 환경 CD 스크립트에서 불필요한 step 제거 * [IDLE-000] 도텐브 파일 공백 제거 스크립트 작성, 크롤링 대상일자 전날 등록된 공고로 변경 * [IDLE-000] 크롤링 기준 시각 15시로 임시 변경 * [IDLE-000] cd env 파일 생성 스크립트 변경 * [IDLE-492] 동일 유저가 여러 개의 디바이스를 사용 시, 알림이 중복해서 누적되는 현상 * [IDLE-493] flyway 스크립트 오탈자 수정 * [IDLE-493] flyway 스크립트 오탈자 수정 * [IDLE-494] 요양 보호사 및 센터 프로필에서 긴 텍스트를 입력 가능한 항목을 TEXT 컬럼으로 지정한다. * [IDLE-495] 요양 보호사는 마감된 공고에 지원이 불가능하다. * [IDLE-495] 공고 마감 처리 메서드명 변경 complete -> completed * [IDLE-496] 스프링 프로파일 지정을 위한 환경변수 주입 * [IDLE-496] 로그 일부 수정 * [IDLE-000] 안드로이드 app link를 위한 asset 추가 * [IDLE-190] 센터 관리자 인증 요청 목록 조회 API * [IDLE-000] 크롤링 주기 변경 및 테스트용 에러 로그 추가 * [IDLE-000] 크롤링 대상 사이트에 알림창(alert)이 뜨는 케이스에 대한 처리 * [IDLE-509] 크롤링 전체 조회 시, 공고가 중복 노출되는 현상 해결 * [IDLE-509] 피드백 반영 * [IDLE-509] 사용하지 않는 하위 서비스 의존성 제거 * [IDLE-000] 크롤링 진행 시각 저녁 11시로 변경 * [IDLE-000] 크롤링 공고 즐겨찾기 조회 로직 버그 수정
* [IDLE-000] Production CI 스크립트 작성 * [IDLE-000] 센터 공고 수정 API 내 접수 방법 null 비허용 * [IDLE-000] 공고 지원자 조회 시, 삭제된 유저는 조회되지 않도록 수정 * [IDLE-363] 센터 관리자 전화 인증 요청 API * [IDLE-363] 개발 환경 ddl-auto 옵션 임시로 create 옵션으로 변경 * [IDLE-365] 공고 크롤러 selenium 로직 수정 및 로컬 동작 확인 * [IDLE-365] 테스트를 위한 스케줄러 기준 시각 변경 * [IDLE-365] batch job enable 옵션 비활성화 * [IDLE-365] ddl-auto update로 변경 * [IDLE-365] 크롤링 공고 필드 null 비허용 * [IDLE-365] 스케줄러 시간 02시로 설정 * [IDLE-366] spring batch selenium 크롤링을 위한 빌드 스크립트 수정 * [IDLE-366] worknet 사이트가 고용 24 사이트로 통합됨에 따라, 크롤링 스크립트 수정 * [IDLE-366] 크롤러 동작 스케줄링 시간 변경 * [IDLE-366] 스프링 초기 실행 시, spring batch 자동 실행 방지 옵션 추가 * [IDLE-366] spring batch 5 버전에서 업데이트 된 변경사항 적용 및 별도의 JobLauncher 구현 * [IDLE-366] 불필요 의존성 및 옵션 제거 * [IDLE-366] 크롤링 조회 API 내 entity status 필드 추가 및 쿼리 수정 * [IDLE-358] 운영 환경 CD 구축 및 운영 환경 profile 설정 추가 * [IDLE-358] 운영 환경 docker run 실행 시 예외 처리 * [IDLE-000] 크롤링 전체 조회 DTO 생성자 추가 * [IDLE-000] 공고 전체 조회 fetchJoin() 중복 이슈 해결을 위한 subquery 분리 * [IDLE-000] AI 코드리뷰 coderabbit 도입 * [IDLE-000] 크롤링 공고 반경범위 조회 필터를 위한 where절 추가 * [IDLE-000] TimeZone 설정이 적용되지 않는 문제 해결 * [IDLE-000] TimeZone 지정 및 @EnableScheduling 설정 * [IDLE-000] TimeZone 설정 제거 * [IDLE-000] 공고 전체 조회 쿼리 롤백 * [IDLE-000] 기존 공고 내 location을 기반으로 위.경도 값을 decoding하도록 변경 * [IDLE-000] 배포 전 최종 QA * [IDLE-000] 크롤링 공고 생성일자 필드 type 변경(timestamp -> date) * [IDLE-000] Redis 비밀번호 설정 추가 (#171) * [IDLE-000] Redis 비밀번호 설정 추가 * [IDLE-000] yaml 파일에 password 필드 추가 * [IDLE-000] redis local default password 설정 * [IDLE-000] compose 파일 내, 비밀번호 지정 command 설정 * [IDLE-000] Redis 볼륨 설정 * [IDLE-000] ci triggering branch 임시 변경 * [IDLE-000] ci triggering branch 롤백 * [IDLE-000] 테스트 심사 통과를 위한 전화번호 검증 로직 추가 * [IDLE-000] 테스트 심사 통과를 위한 전화번호 검증 로직 추가 * [IDLE-389] 센터 인증 요청 이벤트 발생 시, 디스코드 웹훅 알림을 전송하는 로직 작성 * [IDLE-389] 사업자 등록번호 client properties 클래스명 변경 * [IDLE-389] 코드 리뷰 반영 * [IDLE-000] 트랜잭션 전파 레벨 변경(REQUIRED -> REQUIRES_NEW) * [IDLE-396] FCM 모듈 추가 및 firebase 의존성 설정 * readme 제목 수정 * readme 제목 수정 * [IDLE-399] FCM Device Token 관리 API * [IDLE-399] 알림 도메인 설계 * [IDLE-000] fcm service 설정값 주입을 위한 디렉토리 구조 변경 * [IDLE-000] fcm service 설정값 주입을 위한 디렉토리 구조 변경 * [IDLE-400] 채용 공고 지원자 발생 시, 센터 관리자에게 알림을 발송한다. * [IDLE-400] fcm 모듈 설정 추가 * [IDLE-400] 공고 지원자 발생 시, 모든 센터 관리자들에게 다중 알림을 발송한다. * [IDLE-415] 알림 조회 처리 API * [IDLE-417] 읽지 않은 알림 수 집계 API * [IDLE-418] 알림 목록 조회 API * [IDLE-418] 피드백 반영 * [IDLE-423] soft-delete가 적용된 즐겨찾기 entity에서, 즐겨찾기 해제 후 다시 설정하는 경우 발생하는 버그를 해결한다. * [IDLE-424] 요양 보호사 공고 전체 조회 시, 삭제된 공고가 함께 보이는 문제 해결 * [IDLE-400] 채용 공고 지원자 발생 시, 센터 관리자에게 알림을 발송한다. (#183) * [IDLE-400] 채용 공고 지원자 발생 시, 센터 관리자에게 알림을 발송한다. * [IDLE-400] fcm 모듈 설정 추가 * [IDLE-400] 공고 지원자 발생 시, 모든 센터 관리자들에게 다중 알림을 발송한다. * [IDLE-400] 채용 공고 지원자 발생 시, 센터 관리자에게 알림을 발송한다. * [IDLE-400] fcm 모듈 설정 추가 * [IDLE-400] 공고 지원자 발생 시, 모든 센터 관리자들에게 다중 알림을 발송한다. * [IDLE-415] 알림 조회 처리 API * [IDLE-417] 읽지 않은 알림 수 집계 API * [IDLE-418] 알림 목록 조회 API * [IDLE-418] 피드백 반영 * [IDLE-423] soft-delete가 적용된 즐겨찾기 entity에서, 즐겨찾기 해제 후 다시 설정하는 경우 발생하는 버그를 해결한다. * [IDLE-424] 요양 보호사 공고 전체 조회 시, 삭제된 공고가 함께 보이는 문제 해결 * [IDLE-400] 알림 명세 변경 * [IDLE-400] fcm 설정 파일 디렉토리 path 변경 * [IDLE-400] ddl 옵션 변경 * [IDLE-400] ci/cd 옵션 변경 * [IDLE-000] ci triggering branch 복구 * [IDLE-000] develop 환경에서 fcm service 설정 파일 path 수정 * [IDLE-000] fcm service json 파일명 변경 * [IDLE-000] firebase service key 설정 경로 체크를 위해, cd 스크립트를 수정합니다. * Update README.md * [IDLE-000] fcm service key 경로를 class path 경로로 수정 시도 * [IDLE-000] ci triggering branch 임시 변경 * [IDLE-000] firebaseApp 초기화 임시 비활성화 * [IDLE-000] firebaseApp 초기화 임시 비활성화 * [IDLE-000] firebaseApp 초기화 임시 비활성화 * [IDLE-000] file path 앞에 ./ 제외 * [IDLE-000] 절대 경로로 변경 시도 * [IDLE-000] fcm service key 생성 path 수정 * [IDLE-000] fcm service key json file 생성 스크립트 작성 * [IDLE-000] ci triggering branch develop으로 롤백 * [IDLE-000] 불필요 스크립트 제거 * [IDLE-000] firebase config의 현재 경로를 출력하도록 print문 추가 (#197) * [IDLE-000] firebase config의 현재 경로를 출력하도록 print문 추가 * [IDLE-000] ci triggering branch 수정 * [IDLE-000] ci triggering branch 수정 * [IDLE-000] firebase app 초기화 로직 주석 처리 * [IDLE-000] firebase app 초기화 로직 주석 처리 * [IDLE-000] firebase app 초기화 로직 주석 처리 * [IDLE-000] file 대신 string으로 주입받아 초기화하는 방식으로 전환 * [IDLE-000] 일반 string 대신 base64 인코딩 된 문자열을 주입하도록 처리 * [IDLE-000] 일반 string 주입으로 rollback * [IDLE-000] json string log 추가 * [IDLE-000] base64 문자열로 재 변경 * [IDLE-000] firebase config의 현재 경로를 출력하도록 print문 추가 * [IDLE-429] DB 형상관리를 위한 Flyway 적용 * [IDLE-429] Flyway latest version으로 설정 * [IDLE-429] 피드백 반영 * [IDLE-000] firebase config의 현재 경로를 출력하도록 print문 추가 * [IDLE-000] 알림 조회 처리 로직에 @transactional 추가 * [IDLE-000] 알림 조회 시, 생성 시각 기준이 아닌 uuid v7 id 기준으로 내림차순 정렬하도록 변경 * [IDLE-000] CI 트리거 브랜치 복구 * [IDLE-454] 테스트를 위한 크롤링 수행 시각 변경 및 로깅 추가 * [IDLE-000] 공고 범위 검색 내 중복 데이터 발생 방지 * [IDLE-000] ci 트리거 브랜치 변경 * [IDLE-000] ci 트리거 브랜치 롤백 * [IDLE-000] monitoring 모듈 추가 및 actuator, prometheus 의존성 추가 * [IDLE-456] monitoring.yml 작성 * [IDLE-456] monitoring profile 추가 * [IDLE-456] actuator dependency group name 수정 * [IDLE-000] 크롤링 주기 하루 2회로 변경 * [IDLE-000] 불필요 로그 제거 * [IDLE-000] 인증번호 SMS 내용 수정 * [IDLE-000] classPath 하위 yaml 파일 확장자 모두 .yml로 통일 * [IDLE-000] 즐겨찾기 facade service에 트랜잭션 추가 (#206) * [IDLE-000] firebase config의 현재 경로를 출력하도록 print문 추가 * [IDLE-000] facade service에 transaction 추가 * [IDLE-461] 유저가 다중 디바이스에서 알림을 받을 수 있도록 개선한다. (#207) * [IDLE-000] firebase config의 현재 경로를 출력하도록 print문 추가 * [IDLE-461] 한 유저가 다중 디바이스 설정이 가능하도록 한다. * [IDLE-000] firebase config의 현재 경로를 출력하도록 print문 추가 * [IDLE-000] presentation module의 gradle 파일에 monitoring 모듈 dependency 추가 * [IDLE-000] deviceToken 서비스에서 트랜잭션 어노테이션 추가 * [IDLE-000] batch 테스트를 위해 30분마다 동작하도록 변경 * [IDLE-475] 채팅, 채팅방 도메인 설계 * [IDLE-475] 채팅 메세지 최소, 최대 길이 제한 설정 * [IDLE-000] Batch 메타데이터 테이블 스크립트 변경 및 크롤링 수행 주기 설정 * [IDLE-000] 운영 환경 CD 스크립트에서 불필요한 step 제거 * [IDLE-000] 도텐브 파일 공백 제거 스크립트 작성, 크롤링 대상일자 전날 등록된 공고로 변경 * [IDLE-000] 크롤링 기준 시각 15시로 임시 변경 * [IDLE-000] cd env 파일 생성 스크립트 변경 * [IDLE-492] 동일 유저가 여러 개의 디바이스를 사용 시, 알림이 중복해서 누적되는 현상 * [IDLE-493] flyway 스크립트 오탈자 수정 * [IDLE-493] flyway 스크립트 오탈자 수정 * [IDLE-494] 요양 보호사 및 센터 프로필에서 긴 텍스트를 입력 가능한 항목을 TEXT 컬럼으로 지정한다. * [IDLE-495] 요양 보호사는 마감된 공고에 지원이 불가능하다. * [IDLE-495] 공고 마감 처리 메서드명 변경 complete -> completed * [IDLE-496] 스프링 프로파일 지정을 위한 환경변수 주입 * [IDLE-496] 로그 일부 수정 * [IDLE-000] 안드로이드 app link를 위한 asset 추가 * [IDLE-190] 센터 관리자 인증 요청 목록 조회 API * [IDLE-000] 크롤링 주기 변경 및 테스트용 에러 로그 추가 * [IDLE-000] 크롤링 대상 사이트에 알림창(alert)이 뜨는 케이스에 대한 처리 * [IDLE-509] 크롤링 전체 조회 시, 공고가 중복 노출되는 현상 해결 * [IDLE-509] 피드백 반영 * [IDLE-509] 사용하지 않는 하위 서비스 의존성 제거 * [IDLE-000] 크롤링 진행 시각 저녁 11시로 변경 * [IDLE-000] 크롤링 공고 즐겨찾기 조회 로직 버그 수정 * [IDLE-000] 요양 보호사 및 센터 관리자 전화번호 컬럼에 unique index 추가 * [IDLE-512] 센터 관리자 인증 요청 event 변경 및 NotificationInfo 인터페이스 패키지 이동 * [IDLE-512] 센터 관리자 인증 요청 event 변경 및 NotificationInfo 인터페이스 패키지 이동 * [IDLE-513] 요양 보호사 location 필드 추가 및 기존 데이터 마이그레이션 * [IDLE-513] 센터 관리자 공고 등록 시, 주변 요양보호사에게 FCM 알림을 일괄 전송한다. * [IDLE-513] 센터 관리자 공고 등록 시, 주변 요양보호사에게 FCM 알림을 일괄 전송한다. * [IDLE-000] notification type enum 속성 추가 * [IDLE-000] 센터 공고 등록 알림 제목 및 프로필 url null로 수정 * [IDLE-000] 크롤러 에러 로그 추가 * [IDLE-000] 컴파일 에러 해결
* [IDLE-000] Production CI 스크립트 작성 * [IDLE-000] 센터 공고 수정 API 내 접수 방법 null 비허용 * [IDLE-000] 공고 지원자 조회 시, 삭제된 유저는 조회되지 않도록 수정 * [IDLE-363] 센터 관리자 전화 인증 요청 API * [IDLE-363] 개발 환경 ddl-auto 옵션 임시로 create 옵션으로 변경 * [IDLE-365] 공고 크롤러 selenium 로직 수정 및 로컬 동작 확인 * [IDLE-365] 테스트를 위한 스케줄러 기준 시각 변경 * [IDLE-365] batch job enable 옵션 비활성화 * [IDLE-365] ddl-auto update로 변경 * [IDLE-365] 크롤링 공고 필드 null 비허용 * [IDLE-365] 스케줄러 시간 02시로 설정 * [IDLE-366] spring batch selenium 크롤링을 위한 빌드 스크립트 수정 * [IDLE-366] worknet 사이트가 고용 24 사이트로 통합됨에 따라, 크롤링 스크립트 수정 * [IDLE-366] 크롤러 동작 스케줄링 시간 변경 * [IDLE-366] 스프링 초기 실행 시, spring batch 자동 실행 방지 옵션 추가 * [IDLE-366] spring batch 5 버전에서 업데이트 된 변경사항 적용 및 별도의 JobLauncher 구현 * [IDLE-366] 불필요 의존성 및 옵션 제거 * [IDLE-366] 크롤링 조회 API 내 entity status 필드 추가 및 쿼리 수정 * [IDLE-358] 운영 환경 CD 구축 및 운영 환경 profile 설정 추가 * [IDLE-358] 운영 환경 docker run 실행 시 예외 처리 * [IDLE-000] 크롤링 전체 조회 DTO 생성자 추가 * [IDLE-000] 공고 전체 조회 fetchJoin() 중복 이슈 해결을 위한 subquery 분리 * [IDLE-000] AI 코드리뷰 coderabbit 도입 * [IDLE-000] 크롤링 공고 반경범위 조회 필터를 위한 where절 추가 * [IDLE-000] TimeZone 설정이 적용되지 않는 문제 해결 * [IDLE-000] TimeZone 지정 및 @EnableScheduling 설정 * [IDLE-000] TimeZone 설정 제거 * [IDLE-000] 공고 전체 조회 쿼리 롤백 * [IDLE-000] 기존 공고 내 location을 기반으로 위.경도 값을 decoding하도록 변경 * [IDLE-000] 배포 전 최종 QA * [IDLE-000] 크롤링 공고 생성일자 필드 type 변경(timestamp -> date) * [IDLE-000] Redis 비밀번호 설정 추가 (#171) * [IDLE-000] Redis 비밀번호 설정 추가 * [IDLE-000] yaml 파일에 password 필드 추가 * [IDLE-000] redis local default password 설정 * [IDLE-000] compose 파일 내, 비밀번호 지정 command 설정 * [IDLE-000] Redis 볼륨 설정 * [IDLE-000] ci triggering branch 임시 변경 * [IDLE-000] ci triggering branch 롤백 * [IDLE-000] 테스트 심사 통과를 위한 전화번호 검증 로직 추가 * [IDLE-000] 테스트 심사 통과를 위한 전화번호 검증 로직 추가 * [IDLE-389] 센터 인증 요청 이벤트 발생 시, 디스코드 웹훅 알림을 전송하는 로직 작성 * [IDLE-389] 사업자 등록번호 client properties 클래스명 변경 * [IDLE-389] 코드 리뷰 반영 * [IDLE-000] 트랜잭션 전파 레벨 변경(REQUIRED -> REQUIRES_NEW) * [IDLE-396] FCM 모듈 추가 및 firebase 의존성 설정 * readme 제목 수정 * readme 제목 수정 * [IDLE-399] FCM Device Token 관리 API * [IDLE-399] 알림 도메인 설계 * [IDLE-000] fcm service 설정값 주입을 위한 디렉토리 구조 변경 * [IDLE-000] fcm service 설정값 주입을 위한 디렉토리 구조 변경 * [IDLE-400] 채용 공고 지원자 발생 시, 센터 관리자에게 알림을 발송한다. * [IDLE-400] fcm 모듈 설정 추가 * [IDLE-400] 공고 지원자 발생 시, 모든 센터 관리자들에게 다중 알림을 발송한다. * [IDLE-415] 알림 조회 처리 API * [IDLE-417] 읽지 않은 알림 수 집계 API * [IDLE-418] 알림 목록 조회 API * [IDLE-418] 피드백 반영 * [IDLE-423] soft-delete가 적용된 즐겨찾기 entity에서, 즐겨찾기 해제 후 다시 설정하는 경우 발생하는 버그를 해결한다. * [IDLE-424] 요양 보호사 공고 전체 조회 시, 삭제된 공고가 함께 보이는 문제 해결 * [IDLE-400] 채용 공고 지원자 발생 시, 센터 관리자에게 알림을 발송한다. (#183) * [IDLE-400] 채용 공고 지원자 발생 시, 센터 관리자에게 알림을 발송한다. * [IDLE-400] fcm 모듈 설정 추가 * [IDLE-400] 공고 지원자 발생 시, 모든 센터 관리자들에게 다중 알림을 발송한다. * [IDLE-400] 채용 공고 지원자 발생 시, 센터 관리자에게 알림을 발송한다. * [IDLE-400] fcm 모듈 설정 추가 * [IDLE-400] 공고 지원자 발생 시, 모든 센터 관리자들에게 다중 알림을 발송한다. * [IDLE-415] 알림 조회 처리 API * [IDLE-417] 읽지 않은 알림 수 집계 API * [IDLE-418] 알림 목록 조회 API * [IDLE-418] 피드백 반영 * [IDLE-423] soft-delete가 적용된 즐겨찾기 entity에서, 즐겨찾기 해제 후 다시 설정하는 경우 발생하는 버그를 해결한다. * [IDLE-424] 요양 보호사 공고 전체 조회 시, 삭제된 공고가 함께 보이는 문제 해결 * [IDLE-400] 알림 명세 변경 * [IDLE-400] fcm 설정 파일 디렉토리 path 변경 * [IDLE-400] ddl 옵션 변경 * [IDLE-400] ci/cd 옵션 변경 * [IDLE-000] ci triggering branch 복구 * [IDLE-000] develop 환경에서 fcm service 설정 파일 path 수정 * [IDLE-000] fcm service json 파일명 변경 * [IDLE-000] firebase service key 설정 경로 체크를 위해, cd 스크립트를 수정합니다. * Update README.md * [IDLE-000] fcm service key 경로를 class path 경로로 수정 시도 * [IDLE-000] ci triggering branch 임시 변경 * [IDLE-000] firebaseApp 초기화 임시 비활성화 * [IDLE-000] firebaseApp 초기화 임시 비활성화 * [IDLE-000] firebaseApp 초기화 임시 비활성화 * [IDLE-000] file path 앞에 ./ 제외 * [IDLE-000] 절대 경로로 변경 시도 * [IDLE-000] fcm service key 생성 path 수정 * [IDLE-000] fcm service key json file 생성 스크립트 작성 * [IDLE-000] ci triggering branch develop으로 롤백 * [IDLE-000] 불필요 스크립트 제거 * [IDLE-000] firebase config의 현재 경로를 출력하도록 print문 추가 (#197) * [IDLE-000] firebase config의 현재 경로를 출력하도록 print문 추가 * [IDLE-000] ci triggering branch 수정 * [IDLE-000] ci triggering branch 수정 * [IDLE-000] firebase app 초기화 로직 주석 처리 * [IDLE-000] firebase app 초기화 로직 주석 처리 * [IDLE-000] firebase app 초기화 로직 주석 처리 * [IDLE-000] file 대신 string으로 주입받아 초기화하는 방식으로 전환 * [IDLE-000] 일반 string 대신 base64 인코딩 된 문자열을 주입하도록 처리 * [IDLE-000] 일반 string 주입으로 rollback * [IDLE-000] json string log 추가 * [IDLE-000] base64 문자열로 재 변경 * [IDLE-000] firebase config의 현재 경로를 출력하도록 print문 추가 * [IDLE-429] DB 형상관리를 위한 Flyway 적용 * [IDLE-429] Flyway latest version으로 설정 * [IDLE-429] 피드백 반영 * [IDLE-000] firebase config의 현재 경로를 출력하도록 print문 추가 * [IDLE-000] 알림 조회 처리 로직에 @transactional 추가 * [IDLE-000] 알림 조회 시, 생성 시각 기준이 아닌 uuid v7 id 기준으로 내림차순 정렬하도록 변경 * [IDLE-000] CI 트리거 브랜치 복구 * [IDLE-454] 테스트를 위한 크롤링 수행 시각 변경 및 로깅 추가 * [IDLE-000] 공고 범위 검색 내 중복 데이터 발생 방지 * [IDLE-000] ci 트리거 브랜치 변경 * [IDLE-000] ci 트리거 브랜치 롤백 * [IDLE-000] monitoring 모듈 추가 및 actuator, prometheus 의존성 추가 * [IDLE-456] monitoring.yml 작성 * [IDLE-456] monitoring profile 추가 * [IDLE-456] actuator dependency group name 수정 * [IDLE-000] 크롤링 주기 하루 2회로 변경 * [IDLE-000] 불필요 로그 제거 * [IDLE-000] 인증번호 SMS 내용 수정 * [IDLE-000] classPath 하위 yaml 파일 확장자 모두 .yml로 통일 * [IDLE-000] 즐겨찾기 facade service에 트랜잭션 추가 (#206) * [IDLE-000] firebase config의 현재 경로를 출력하도록 print문 추가 * [IDLE-000] facade service에 transaction 추가 * [IDLE-461] 유저가 다중 디바이스에서 알림을 받을 수 있도록 개선한다. (#207) * [IDLE-000] firebase config의 현재 경로를 출력하도록 print문 추가 * [IDLE-461] 한 유저가 다중 디바이스 설정이 가능하도록 한다. * [IDLE-000] firebase config의 현재 경로를 출력하도록 print문 추가 * [IDLE-000] presentation module의 gradle 파일에 monitoring 모듈 dependency 추가 * [IDLE-000] deviceToken 서비스에서 트랜잭션 어노테이션 추가 * [IDLE-000] batch 테스트를 위해 30분마다 동작하도록 변경 * [IDLE-475] 채팅, 채팅방 도메인 설계 * [IDLE-475] 채팅 메세지 최소, 최대 길이 제한 설정 * [IDLE-000] Batch 메타데이터 테이블 스크립트 변경 및 크롤링 수행 주기 설정 * [IDLE-000] 운영 환경 CD 스크립트에서 불필요한 step 제거 * [IDLE-000] 도텐브 파일 공백 제거 스크립트 작성, 크롤링 대상일자 전날 등록된 공고로 변경 * [IDLE-000] 크롤링 기준 시각 15시로 임시 변경 * [IDLE-000] cd env 파일 생성 스크립트 변경 * [IDLE-492] 동일 유저가 여러 개의 디바이스를 사용 시, 알림이 중복해서 누적되는 현상 * [IDLE-493] flyway 스크립트 오탈자 수정 * [IDLE-493] flyway 스크립트 오탈자 수정 * [IDLE-494] 요양 보호사 및 센터 프로필에서 긴 텍스트를 입력 가능한 항목을 TEXT 컬럼으로 지정한다. * [IDLE-495] 요양 보호사는 마감된 공고에 지원이 불가능하다. * [IDLE-495] 공고 마감 처리 메서드명 변경 complete -> completed * [IDLE-496] 스프링 프로파일 지정을 위한 환경변수 주입 * [IDLE-496] 로그 일부 수정 * [IDLE-000] 안드로이드 app link를 위한 asset 추가 * [IDLE-190] 센터 관리자 인증 요청 목록 조회 API * [IDLE-000] 크롤링 주기 변경 및 테스트용 에러 로그 추가 * [IDLE-000] 크롤링 대상 사이트에 알림창(alert)이 뜨는 케이스에 대한 처리 * [IDLE-509] 크롤링 전체 조회 시, 공고가 중복 노출되는 현상 해결 * [IDLE-509] 피드백 반영 * [IDLE-509] 사용하지 않는 하위 서비스 의존성 제거 * [IDLE-000] 크롤링 진행 시각 저녁 11시로 변경 * [IDLE-000] 크롤링 공고 즐겨찾기 조회 로직 버그 수정 * [IDLE-000] 요양 보호사 및 센터 관리자 전화번호 컬럼에 unique index 추가 * [IDLE-512] 센터 관리자 인증 요청 event 변경 및 NotificationInfo 인터페이스 패키지 이동 * [IDLE-512] 센터 관리자 인증 요청 event 변경 및 NotificationInfo 인터페이스 패키지 이동 * [IDLE-513] 요양 보호사 location 필드 추가 및 기존 데이터 마이그레이션 * [IDLE-513] 센터 관리자 공고 등록 시, 주변 요양보호사에게 FCM 알림을 일괄 전송한다. * [IDLE-513] 센터 관리자 공고 등록 시, 주변 요양보호사에게 FCM 알림을 일괄 전송한다. * [IDLE-000] notification type enum 속성 추가 * [IDLE-000] 센터 공고 등록 알림 제목 및 프로필 url null로 수정 * [IDLE-000] 크롤러 에러 로그 추가 * [IDLE-000] 컴파일 에러 해결 * [IDLE-000] 미사용 클래스 제거
* [IDLE-000] Production CI 스크립트 작성 * [IDLE-000] 센터 공고 수정 API 내 접수 방법 null 비허용 * [IDLE-000] 공고 지원자 조회 시, 삭제된 유저는 조회되지 않도록 수정 * [IDLE-363] 센터 관리자 전화 인증 요청 API * [IDLE-363] 개발 환경 ddl-auto 옵션 임시로 create 옵션으로 변경 * [IDLE-365] 공고 크롤러 selenium 로직 수정 및 로컬 동작 확인 * [IDLE-365] 테스트를 위한 스케줄러 기준 시각 변경 * [IDLE-365] batch job enable 옵션 비활성화 * [IDLE-365] ddl-auto update로 변경 * [IDLE-365] 크롤링 공고 필드 null 비허용 * [IDLE-365] 스케줄러 시간 02시로 설정 * [IDLE-366] spring batch selenium 크롤링을 위한 빌드 스크립트 수정 * [IDLE-366] worknet 사이트가 고용 24 사이트로 통합됨에 따라, 크롤링 스크립트 수정 * [IDLE-366] 크롤러 동작 스케줄링 시간 변경 * [IDLE-366] 스프링 초기 실행 시, spring batch 자동 실행 방지 옵션 추가 * [IDLE-366] spring batch 5 버전에서 업데이트 된 변경사항 적용 및 별도의 JobLauncher 구현 * [IDLE-366] 불필요 의존성 및 옵션 제거 * [IDLE-366] 크롤링 조회 API 내 entity status 필드 추가 및 쿼리 수정 * [IDLE-358] 운영 환경 CD 구축 및 운영 환경 profile 설정 추가 * [IDLE-358] 운영 환경 docker run 실행 시 예외 처리 * [IDLE-000] 크롤링 전체 조회 DTO 생성자 추가 * [IDLE-000] 공고 전체 조회 fetchJoin() 중복 이슈 해결을 위한 subquery 분리 * [IDLE-000] AI 코드리뷰 coderabbit 도입 * [IDLE-000] 크롤링 공고 반경범위 조회 필터를 위한 where절 추가 * [IDLE-000] TimeZone 설정이 적용되지 않는 문제 해결 * [IDLE-000] TimeZone 지정 및 @EnableScheduling 설정 * [IDLE-000] TimeZone 설정 제거 * [IDLE-000] 공고 전체 조회 쿼리 롤백 * [IDLE-000] 기존 공고 내 location을 기반으로 위.경도 값을 decoding하도록 변경 * [IDLE-000] 배포 전 최종 QA * [IDLE-000] 크롤링 공고 생성일자 필드 type 변경(timestamp -> date) * [IDLE-000] Redis 비밀번호 설정 추가 (#171) * [IDLE-000] Redis 비밀번호 설정 추가 * [IDLE-000] yaml 파일에 password 필드 추가 * [IDLE-000] redis local default password 설정 * [IDLE-000] compose 파일 내, 비밀번호 지정 command 설정 * [IDLE-000] Redis 볼륨 설정 * [IDLE-000] ci triggering branch 임시 변경 * [IDLE-000] ci triggering branch 롤백 * [IDLE-000] 테스트 심사 통과를 위한 전화번호 검증 로직 추가 * [IDLE-000] 테스트 심사 통과를 위한 전화번호 검증 로직 추가 * [IDLE-389] 센터 인증 요청 이벤트 발생 시, 디스코드 웹훅 알림을 전송하는 로직 작성 * [IDLE-389] 사업자 등록번호 client properties 클래스명 변경 * [IDLE-389] 코드 리뷰 반영 * [IDLE-000] 트랜잭션 전파 레벨 변경(REQUIRED -> REQUIRES_NEW) * [IDLE-396] FCM 모듈 추가 및 firebase 의존성 설정 * readme 제목 수정 * readme 제목 수정 * [IDLE-399] FCM Device Token 관리 API * [IDLE-399] 알림 도메인 설계 * [IDLE-000] fcm service 설정값 주입을 위한 디렉토리 구조 변경 * [IDLE-000] fcm service 설정값 주입을 위한 디렉토리 구조 변경 * [IDLE-400] 채용 공고 지원자 발생 시, 센터 관리자에게 알림을 발송한다. * [IDLE-400] fcm 모듈 설정 추가 * [IDLE-400] 공고 지원자 발생 시, 모든 센터 관리자들에게 다중 알림을 발송한다. * [IDLE-415] 알림 조회 처리 API * [IDLE-417] 읽지 않은 알림 수 집계 API * [IDLE-418] 알림 목록 조회 API * [IDLE-418] 피드백 반영 * [IDLE-423] soft-delete가 적용된 즐겨찾기 entity에서, 즐겨찾기 해제 후 다시 설정하는 경우 발생하는 버그를 해결한다. * [IDLE-424] 요양 보호사 공고 전체 조회 시, 삭제된 공고가 함께 보이는 문제 해결 * [IDLE-400] 채용 공고 지원자 발생 시, 센터 관리자에게 알림을 발송한다. (#183) * [IDLE-400] 채용 공고 지원자 발생 시, 센터 관리자에게 알림을 발송한다. * [IDLE-400] fcm 모듈 설정 추가 * [IDLE-400] 공고 지원자 발생 시, 모든 센터 관리자들에게 다중 알림을 발송한다. * [IDLE-400] 채용 공고 지원자 발생 시, 센터 관리자에게 알림을 발송한다. * [IDLE-400] fcm 모듈 설정 추가 * [IDLE-400] 공고 지원자 발생 시, 모든 센터 관리자들에게 다중 알림을 발송한다. * [IDLE-415] 알림 조회 처리 API * [IDLE-417] 읽지 않은 알림 수 집계 API * [IDLE-418] 알림 목록 조회 API * [IDLE-418] 피드백 반영 * [IDLE-423] soft-delete가 적용된 즐겨찾기 entity에서, 즐겨찾기 해제 후 다시 설정하는 경우 발생하는 버그를 해결한다. * [IDLE-424] 요양 보호사 공고 전체 조회 시, 삭제된 공고가 함께 보이는 문제 해결 * [IDLE-400] 알림 명세 변경 * [IDLE-400] fcm 설정 파일 디렉토리 path 변경 * [IDLE-400] ddl 옵션 변경 * [IDLE-400] ci/cd 옵션 변경 * [IDLE-000] ci triggering branch 복구 * [IDLE-000] develop 환경에서 fcm service 설정 파일 path 수정 * [IDLE-000] fcm service json 파일명 변경 * [IDLE-000] firebase service key 설정 경로 체크를 위해, cd 스크립트를 수정합니다. * Update README.md * [IDLE-000] fcm service key 경로를 class path 경로로 수정 시도 * [IDLE-000] ci triggering branch 임시 변경 * [IDLE-000] firebaseApp 초기화 임시 비활성화 * [IDLE-000] firebaseApp 초기화 임시 비활성화 * [IDLE-000] firebaseApp 초기화 임시 비활성화 * [IDLE-000] file path 앞에 ./ 제외 * [IDLE-000] 절대 경로로 변경 시도 * [IDLE-000] fcm service key 생성 path 수정 * [IDLE-000] fcm service key json file 생성 스크립트 작성 * [IDLE-000] ci triggering branch develop으로 롤백 * [IDLE-000] 불필요 스크립트 제거 * [IDLE-000] firebase config의 현재 경로를 출력하도록 print문 추가 (#197) * [IDLE-000] firebase config의 현재 경로를 출력하도록 print문 추가 * [IDLE-000] ci triggering branch 수정 * [IDLE-000] ci triggering branch 수정 * [IDLE-000] firebase app 초기화 로직 주석 처리 * [IDLE-000] firebase app 초기화 로직 주석 처리 * [IDLE-000] firebase app 초기화 로직 주석 처리 * [IDLE-000] file 대신 string으로 주입받아 초기화하는 방식으로 전환 * [IDLE-000] 일반 string 대신 base64 인코딩 된 문자열을 주입하도록 처리 * [IDLE-000] 일반 string 주입으로 rollback * [IDLE-000] json string log 추가 * [IDLE-000] base64 문자열로 재 변경 * [IDLE-000] firebase config의 현재 경로를 출력하도록 print문 추가 * [IDLE-429] DB 형상관리를 위한 Flyway 적용 * [IDLE-429] Flyway latest version으로 설정 * [IDLE-429] 피드백 반영 * [IDLE-000] firebase config의 현재 경로를 출력하도록 print문 추가 * [IDLE-000] 알림 조회 처리 로직에 @transactional 추가 * [IDLE-000] 알림 조회 시, 생성 시각 기준이 아닌 uuid v7 id 기준으로 내림차순 정렬하도록 변경 * [IDLE-000] CI 트리거 브랜치 복구 * [IDLE-454] 테스트를 위한 크롤링 수행 시각 변경 및 로깅 추가 * [IDLE-000] 공고 범위 검색 내 중복 데이터 발생 방지 * [IDLE-000] ci 트리거 브랜치 변경 * [IDLE-000] ci 트리거 브랜치 롤백 * [IDLE-000] monitoring 모듈 추가 및 actuator, prometheus 의존성 추가 * [IDLE-456] monitoring.yml 작성 * [IDLE-456] monitoring profile 추가 * [IDLE-456] actuator dependency group name 수정 * [IDLE-000] 크롤링 주기 하루 2회로 변경 * [IDLE-000] 불필요 로그 제거 * [IDLE-000] 인증번호 SMS 내용 수정 * [IDLE-000] classPath 하위 yaml 파일 확장자 모두 .yml로 통일 * [IDLE-000] 즐겨찾기 facade service에 트랜잭션 추가 (#206) * [IDLE-000] firebase config의 현재 경로를 출력하도록 print문 추가 * [IDLE-000] facade service에 transaction 추가 * [IDLE-461] 유저가 다중 디바이스에서 알림을 받을 수 있도록 개선한다. (#207) * [IDLE-000] firebase config의 현재 경로를 출력하도록 print문 추가 * [IDLE-461] 한 유저가 다중 디바이스 설정이 가능하도록 한다. * [IDLE-000] firebase config의 현재 경로를 출력하도록 print문 추가 * [IDLE-000] presentation module의 gradle 파일에 monitoring 모듈 dependency 추가 * [IDLE-000] deviceToken 서비스에서 트랜잭션 어노테이션 추가 * [IDLE-000] batch 테스트를 위해 30분마다 동작하도록 변경 * [IDLE-475] 채팅, 채팅방 도메인 설계 * [IDLE-475] 채팅 메세지 최소, 최대 길이 제한 설정 * [IDLE-000] Batch 메타데이터 테이블 스크립트 변경 및 크롤링 수행 주기 설정 * [IDLE-000] 운영 환경 CD 스크립트에서 불필요한 step 제거 * [IDLE-000] 도텐브 파일 공백 제거 스크립트 작성, 크롤링 대상일자 전날 등록된 공고로 변경 * [IDLE-000] 크롤링 기준 시각 15시로 임시 변경 * [IDLE-000] cd env 파일 생성 스크립트 변경 * [IDLE-492] 동일 유저가 여러 개의 디바이스를 사용 시, 알림이 중복해서 누적되는 현상 * [IDLE-493] flyway 스크립트 오탈자 수정 * [IDLE-493] flyway 스크립트 오탈자 수정 * [IDLE-494] 요양 보호사 및 센터 프로필에서 긴 텍스트를 입력 가능한 항목을 TEXT 컬럼으로 지정한다. * [IDLE-495] 요양 보호사는 마감된 공고에 지원이 불가능하다. * [IDLE-495] 공고 마감 처리 메서드명 변경 complete -> completed * [IDLE-496] 스프링 프로파일 지정을 위한 환경변수 주입 * [IDLE-496] 로그 일부 수정 * [IDLE-000] 안드로이드 app link를 위한 asset 추가 * [IDLE-190] 센터 관리자 인증 요청 목록 조회 API * [IDLE-000] 크롤링 주기 변경 및 테스트용 에러 로그 추가 * [IDLE-000] 크롤링 대상 사이트에 알림창(alert)이 뜨는 케이스에 대한 처리 * [IDLE-509] 크롤링 전체 조회 시, 공고가 중복 노출되는 현상 해결 * [IDLE-509] 피드백 반영 * [IDLE-509] 사용하지 않는 하위 서비스 의존성 제거 * [IDLE-000] 크롤링 진행 시각 저녁 11시로 변경 * [IDLE-000] 크롤링 공고 즐겨찾기 조회 로직 버그 수정 * [IDLE-000] 요양 보호사 및 센터 관리자 전화번호 컬럼에 unique index 추가 * [IDLE-512] 센터 관리자 인증 요청 event 변경 및 NotificationInfo 인터페이스 패키지 이동 * [IDLE-512] 센터 관리자 인증 요청 event 변경 및 NotificationInfo 인터페이스 패키지 이동 * [IDLE-513] 요양 보호사 location 필드 추가 및 기존 데이터 마이그레이션 * [IDLE-513] 센터 관리자 공고 등록 시, 주변 요양보호사에게 FCM 알림을 일괄 전송한다. * [IDLE-513] 센터 관리자 공고 등록 시, 주변 요양보호사에게 FCM 알림을 일괄 전송한다. * [IDLE-000] notification type enum 속성 추가 * [IDLE-000] 센터 공고 등록 알림 제목 및 프로필 url null로 수정 * [IDLE-000] Readme 업데이트 * [IDLE-504] 센터 관리자 인증 승인 및 거절 API * [IDLE-456] prometheus, grafana 설정을 위한 monitoring.yml 설정
* [IDLE-000] Production CI 스크립트 작성 * [IDLE-000] 센터 공고 수정 API 내 접수 방법 null 비허용 * [IDLE-000] 공고 지원자 조회 시, 삭제된 유저는 조회되지 않도록 수정 * [IDLE-363] 센터 관리자 전화 인증 요청 API * [IDLE-363] 개발 환경 ddl-auto 옵션 임시로 create 옵션으로 변경 * [IDLE-365] 공고 크롤러 selenium 로직 수정 및 로컬 동작 확인 * [IDLE-365] 테스트를 위한 스케줄러 기준 시각 변경 * [IDLE-365] batch job enable 옵션 비활성화 * [IDLE-365] ddl-auto update로 변경 * [IDLE-365] 크롤링 공고 필드 null 비허용 * [IDLE-365] 스케줄러 시간 02시로 설정 * [IDLE-366] spring batch selenium 크롤링을 위한 빌드 스크립트 수정 * [IDLE-366] worknet 사이트가 고용 24 사이트로 통합됨에 따라, 크롤링 스크립트 수정 * [IDLE-366] 크롤러 동작 스케줄링 시간 변경 * [IDLE-366] 스프링 초기 실행 시, spring batch 자동 실행 방지 옵션 추가 * [IDLE-366] spring batch 5 버전에서 업데이트 된 변경사항 적용 및 별도의 JobLauncher 구현 * [IDLE-366] 불필요 의존성 및 옵션 제거 * [IDLE-366] 크롤링 조회 API 내 entity status 필드 추가 및 쿼리 수정 * [IDLE-358] 운영 환경 CD 구축 및 운영 환경 profile 설정 추가 * [IDLE-358] 운영 환경 docker run 실행 시 예외 처리 * [IDLE-000] 크롤링 전체 조회 DTO 생성자 추가 * [IDLE-000] 공고 전체 조회 fetchJoin() 중복 이슈 해결을 위한 subquery 분리 * [IDLE-000] AI 코드리뷰 coderabbit 도입 * [IDLE-000] 크롤링 공고 반경범위 조회 필터를 위한 where절 추가 * [IDLE-000] TimeZone 설정이 적용되지 않는 문제 해결 * [IDLE-000] TimeZone 지정 및 @EnableScheduling 설정 * [IDLE-000] TimeZone 설정 제거 * [IDLE-000] 공고 전체 조회 쿼리 롤백 * [IDLE-000] 기존 공고 내 location을 기반으로 위.경도 값을 decoding하도록 변경 * [IDLE-000] 배포 전 최종 QA * [IDLE-000] 크롤링 공고 생성일자 필드 type 변경(timestamp -> date) * [IDLE-000] Redis 비밀번호 설정 추가 (#171) * [IDLE-000] Redis 비밀번호 설정 추가 * [IDLE-000] yaml 파일에 password 필드 추가 * [IDLE-000] redis local default password 설정 * [IDLE-000] compose 파일 내, 비밀번호 지정 command 설정 * [IDLE-000] Redis 볼륨 설정 * [IDLE-000] ci triggering branch 임시 변경 * [IDLE-000] ci triggering branch 롤백 * [IDLE-000] 테스트 심사 통과를 위한 전화번호 검증 로직 추가 * [IDLE-000] 테스트 심사 통과를 위한 전화번호 검증 로직 추가 * [IDLE-389] 센터 인증 요청 이벤트 발생 시, 디스코드 웹훅 알림을 전송하는 로직 작성 * [IDLE-389] 사업자 등록번호 client properties 클래스명 변경 * [IDLE-389] 코드 리뷰 반영 * [IDLE-000] 트랜잭션 전파 레벨 변경(REQUIRED -> REQUIRES_NEW) * [IDLE-396] FCM 모듈 추가 및 firebase 의존성 설정 * readme 제목 수정 * readme 제목 수정 * [IDLE-399] FCM Device Token 관리 API * [IDLE-399] 알림 도메인 설계 * [IDLE-000] fcm service 설정값 주입을 위한 디렉토리 구조 변경 * [IDLE-000] fcm service 설정값 주입을 위한 디렉토리 구조 변경 * [IDLE-400] 채용 공고 지원자 발생 시, 센터 관리자에게 알림을 발송한다. * [IDLE-400] fcm 모듈 설정 추가 * [IDLE-400] 공고 지원자 발생 시, 모든 센터 관리자들에게 다중 알림을 발송한다. * [IDLE-415] 알림 조회 처리 API * [IDLE-417] 읽지 않은 알림 수 집계 API * [IDLE-418] 알림 목록 조회 API * [IDLE-418] 피드백 반영 * [IDLE-423] soft-delete가 적용된 즐겨찾기 entity에서, 즐겨찾기 해제 후 다시 설정하는 경우 발생하는 버그를 해결한다. * [IDLE-424] 요양 보호사 공고 전체 조회 시, 삭제된 공고가 함께 보이는 문제 해결 * [IDLE-400] 채용 공고 지원자 발생 시, 센터 관리자에게 알림을 발송한다. (#183) * [IDLE-400] 채용 공고 지원자 발생 시, 센터 관리자에게 알림을 발송한다. * [IDLE-400] fcm 모듈 설정 추가 * [IDLE-400] 공고 지원자 발생 시, 모든 센터 관리자들에게 다중 알림을 발송한다. * [IDLE-400] 채용 공고 지원자 발생 시, 센터 관리자에게 알림을 발송한다. * [IDLE-400] fcm 모듈 설정 추가 * [IDLE-400] 공고 지원자 발생 시, 모든 센터 관리자들에게 다중 알림을 발송한다. * [IDLE-415] 알림 조회 처리 API * [IDLE-417] 읽지 않은 알림 수 집계 API * [IDLE-418] 알림 목록 조회 API * [IDLE-418] 피드백 반영 * [IDLE-423] soft-delete가 적용된 즐겨찾기 entity에서, 즐겨찾기 해제 후 다시 설정하는 경우 발생하는 버그를 해결한다. * [IDLE-424] 요양 보호사 공고 전체 조회 시, 삭제된 공고가 함께 보이는 문제 해결 * [IDLE-400] 알림 명세 변경 * [IDLE-400] fcm 설정 파일 디렉토리 path 변경 * [IDLE-400] ddl 옵션 변경 * [IDLE-400] ci/cd 옵션 변경 * [IDLE-000] ci triggering branch 복구 * [IDLE-000] develop 환경에서 fcm service 설정 파일 path 수정 * [IDLE-000] fcm service json 파일명 변경 * [IDLE-000] firebase service key 설정 경로 체크를 위해, cd 스크립트를 수정합니다. * Update README.md * [IDLE-000] fcm service key 경로를 class path 경로로 수정 시도 * [IDLE-000] ci triggering branch 임시 변경 * [IDLE-000] firebaseApp 초기화 임시 비활성화 * [IDLE-000] firebaseApp 초기화 임시 비활성화 * [IDLE-000] firebaseApp 초기화 임시 비활성화 * [IDLE-000] file path 앞에 ./ 제외 * [IDLE-000] 절대 경로로 변경 시도 * [IDLE-000] fcm service key 생성 path 수정 * [IDLE-000] fcm service key json file 생성 스크립트 작성 * [IDLE-000] ci triggering branch develop으로 롤백 * [IDLE-000] 불필요 스크립트 제거 * [IDLE-000] firebase config의 현재 경로를 출력하도록 print문 추가 (#197) * [IDLE-000] firebase config의 현재 경로를 출력하도록 print문 추가 * [IDLE-000] ci triggering branch 수정 * [IDLE-000] ci triggering branch 수정 * [IDLE-000] firebase app 초기화 로직 주석 처리 * [IDLE-000] firebase app 초기화 로직 주석 처리 * [IDLE-000] firebase app 초기화 로직 주석 처리 * [IDLE-000] file 대신 string으로 주입받아 초기화하는 방식으로 전환 * [IDLE-000] 일반 string 대신 base64 인코딩 된 문자열을 주입하도록 처리 * [IDLE-000] 일반 string 주입으로 rollback * [IDLE-000] json string log 추가 * [IDLE-000] base64 문자열로 재 변경 * [IDLE-000] firebase config의 현재 경로를 출력하도록 print문 추가 * [IDLE-429] DB 형상관리를 위한 Flyway 적용 * [IDLE-429] Flyway latest version으로 설정 * [IDLE-429] 피드백 반영 * [IDLE-000] firebase config의 현재 경로를 출력하도록 print문 추가 * [IDLE-000] 알림 조회 처리 로직에 @transactional 추가 * [IDLE-000] 알림 조회 시, 생성 시각 기준이 아닌 uuid v7 id 기준으로 내림차순 정렬하도록 변경 * [IDLE-000] CI 트리거 브랜치 복구 * [IDLE-454] 테스트를 위한 크롤링 수행 시각 변경 및 로깅 추가 * [IDLE-000] 공고 범위 검색 내 중복 데이터 발생 방지 * [IDLE-000] ci 트리거 브랜치 변경 * [IDLE-000] ci 트리거 브랜치 롤백 * [IDLE-000] monitoring 모듈 추가 및 actuator, prometheus 의존성 추가 * [IDLE-456] monitoring.yml 작성 * [IDLE-456] monitoring profile 추가 * [IDLE-456] actuator dependency group name 수정 * [IDLE-000] 크롤링 주기 하루 2회로 변경 * [IDLE-000] 불필요 로그 제거 * [IDLE-000] 인증번호 SMS 내용 수정 * [IDLE-000] classPath 하위 yaml 파일 확장자 모두 .yml로 통일 * [IDLE-000] 즐겨찾기 facade service에 트랜잭션 추가 (#206) * [IDLE-000] firebase config의 현재 경로를 출력하도록 print문 추가 * [IDLE-000] facade service에 transaction 추가 * [IDLE-461] 유저가 다중 디바이스에서 알림을 받을 수 있도록 개선한다. (#207) * [IDLE-000] firebase config의 현재 경로를 출력하도록 print문 추가 * [IDLE-461] 한 유저가 다중 디바이스 설정이 가능하도록 한다. * [IDLE-000] firebase config의 현재 경로를 출력하도록 print문 추가 * [IDLE-000] presentation module의 gradle 파일에 monitoring 모듈 dependency 추가 * [IDLE-000] deviceToken 서비스에서 트랜잭션 어노테이션 추가 * [IDLE-000] batch 테스트를 위해 30분마다 동작하도록 변경 * [IDLE-475] 채팅, 채팅방 도메인 설계 * [IDLE-475] 채팅 메세지 최소, 최대 길이 제한 설정 * [IDLE-000] Batch 메타데이터 테이블 스크립트 변경 및 크롤링 수행 주기 설정 * [IDLE-000] 운영 환경 CD 스크립트에서 불필요한 step 제거 * [IDLE-000] 도텐브 파일 공백 제거 스크립트 작성, 크롤링 대상일자 전날 등록된 공고로 변경 * [IDLE-000] 크롤링 기준 시각 15시로 임시 변경 * [IDLE-000] cd env 파일 생성 스크립트 변경 * [IDLE-492] 동일 유저가 여러 개의 디바이스를 사용 시, 알림이 중복해서 누적되는 현상 * [IDLE-493] flyway 스크립트 오탈자 수정 * [IDLE-493] flyway 스크립트 오탈자 수정 * [IDLE-494] 요양 보호사 및 센터 프로필에서 긴 텍스트를 입력 가능한 항목을 TEXT 컬럼으로 지정한다. * [IDLE-495] 요양 보호사는 마감된 공고에 지원이 불가능하다. * [IDLE-495] 공고 마감 처리 메서드명 변경 complete -> completed * [IDLE-496] 스프링 프로파일 지정을 위한 환경변수 주입 * [IDLE-496] 로그 일부 수정 * [IDLE-000] 안드로이드 app link를 위한 asset 추가 * [IDLE-190] 센터 관리자 인증 요청 목록 조회 API * [IDLE-000] 크롤링 주기 변경 및 테스트용 에러 로그 추가 * [IDLE-000] 크롤링 대상 사이트에 알림창(alert)이 뜨는 케이스에 대한 처리 * [IDLE-509] 크롤링 전체 조회 시, 공고가 중복 노출되는 현상 해결 * [IDLE-509] 피드백 반영 * [IDLE-509] 사용하지 않는 하위 서비스 의존성 제거 * [IDLE-000] 크롤링 진행 시각 저녁 11시로 변경 * [IDLE-000] 크롤링 공고 즐겨찾기 조회 로직 버그 수정 * [IDLE-000] 요양 보호사 및 센터 관리자 전화번호 컬럼에 unique index 추가 * [IDLE-512] 센터 관리자 인증 요청 event 변경 및 NotificationInfo 인터페이스 패키지 이동 * [IDLE-512] 센터 관리자 인증 요청 event 변경 및 NotificationInfo 인터페이스 패키지 이동 * [IDLE-513] 요양 보호사 location 필드 추가 및 기존 데이터 마이그레이션 * [IDLE-513] 센터 관리자 공고 등록 시, 주변 요양보호사에게 FCM 알림을 일괄 전송한다. * [IDLE-513] 센터 관리자 공고 등록 시, 주변 요양보호사에게 FCM 알림을 일괄 전송한다. * [IDLE-000] notification type enum 속성 추가 * [IDLE-000] 센터 공고 등록 알림 제목 및 프로필 url null로 수정 * [IDLE-000] Readme 업데이트 * [IDLE-504] 센터 관리자 인증 승인 및 거절 API * [IDLE-456] prometheus, grafana 설정을 위한 monitoring.yml 설정 * [IDLE-476] 웹소켓, Redis pub/sub을 이용한 채팅 전송 기능 (#217) * [IDLE-476] 웹소켓 dependency 추가 * [IDLE-476] 웹소켓, Redis pub/sub을 이용한 채팅 전송 기능 * [IDLE-476] 불필요 클래스 제거 * [IDLE-476] 채팅 메세지 생성 책임을 하위 도메인에서 생성하도록 수정 * [IDLE-476] hash 역직렬화 시 필요한 처리를 Serializer 설정 추가 * [IDLE-476] json 역직렬화 시, 특수문자 허용 * [IDLE-476] websocket stomp 엔드포인트 노출 설정 변경 * [IDLE-476] 채팅 메세지 길이 정책 적용 * [IDLE-518] bastion서버를 통해 production 서버로 접근 후, 배포하도록 설정 (#252) * [IDLE-518] ECR 레파지토리 변경 (#254) * [IDLE-518] bastion서버를 통해 production 서버로 접근 후, 배포하도록 설정 * [IDLE-518] ECR 레파지토리 변경 * [IDLE-518] docker-compose 파일 위치 변경 (#256) * [IDLE-518] bastion서버를 통해 production 서버로 접근 후, 배포하도록 설정 * [IDLE-518] ECR 레파지토리 변경 * [IDLE-518] docker-compose 파일 경로 변경 * [IDLE-518] 소스파일 경로 변경 * [IDLE-518] target 경로 변경 * [IDLE-518] 소스파일 경로 변경 * [IDLE-518] 타겟파일 경로 원상복구 * [IDLE-518] 타겟파일 경로 수정 * [IDLE-518] compose 파일 실행 경로 수정 * [IDLE-518] 하드코딩된 변수를 secrets로 변경 * [IDLE-518] 하드코딩된 변수를 secrets로 변경 * [IDLE-518] 하드코딩된 변수를 secrets로 변경 * [IDLE-518] Configuration Env file 스탭 추가 * [IDLE-518] secrets로 변경 * [IDLE-518] CI/CD재가동 전, 수동 실행으로 변경 (#257) * [IDLE-518] bastion서버를 통해 production 서버로 접근 후, 배포하도록 설정 * [IDLE-518] ECR 레파지토리 변경 * [IDLE-518] docker-compose 파일 경로 변경 * [IDLE-518] 소스파일 경로 변경 * [IDLE-518] target 경로 변경 * [IDLE-518] 소스파일 경로 변경 * [IDLE-518] 타겟파일 경로 원상복구 * [IDLE-518] 타겟파일 경로 수정 * [IDLE-518] compose 파일 실행 경로 수정 * [IDLE-518] 하드코딩된 변수를 secrets로 변경 * [IDLE-518] 하드코딩된 변수를 secrets로 변경 * [IDLE-518] 하드코딩된 변수를 secrets로 변경 * [IDLE-518] Configuration Env file 스탭 추가 * [IDLE-518] secrets로 변경 * [IDLE-518] CI/CD 재가동 전 수동으로 수정 * [IDLE-518] CI/CD 재가동 전 수동으로 수정 * [IDLE-518] ECR 레파지토리 작성 * [IDLE-518] 서버 재구축 및 CI/CD 재가동 (#258) * [IDLE-518] bastion서버를 통해 production 서버로 접근 후, 배포하도록 설정 * [IDLE-518] ECR 레파지토리 변경 * [IDLE-518] docker-compose 파일 경로 변경 * [IDLE-518] 소스파일 경로 변경 * [IDLE-518] target 경로 변경 * [IDLE-518] 소스파일 경로 변경 * [IDLE-518] 타겟파일 경로 원상복구 * [IDLE-518] 타겟파일 경로 수정 * [IDLE-518] compose 파일 실행 경로 수정 * [IDLE-518] 하드코딩된 변수를 secrets로 변경 * [IDLE-518] 하드코딩된 변수를 secrets로 변경 * [IDLE-518] 하드코딩된 변수를 secrets로 변경 * [IDLE-518] Configuration Env file 스탭 추가 * [IDLE-518] secrets로 변경 * [IDLE-518] CI/CD 재가동 전 수동으로 수정 * [IDLE-518] CI/CD 재가동 전 수동으로 수정 * [IDLE-518] ECR 레파지토리 작성 * [IDLE-518] .env 파일 경로 변경 * [IDLE-518] 레지스트리 내용 변경 * [IDLE-518] DB 이름을 caremeet으로 변경 * [IDLE-518] 서비스 간 통신을 위한 컨테이너간 네트워크 설정 추가 * [IDLE-518] ddl create 적용 * [IDLE-518] private_key.pem 파일을 통해 접근하도록 수정 * [IDLE-518] 호스트키 체크 우회 수정 * [IDLE-518] SSH 세션에 터미널을 할당하도록 옵션 추가 * [IDLE-518] 터널링 방법을 수정 * [IDLE-518] Private Subnet에 존재하는 서버의 22번 포트를 로컬 2222 포트로 연결 * [IDLE-518] .env파일 생성하는 명령어 수정 * [IDLE-518] 들여쓰기 수정 * [IDLE-518] INPUT_으로 시작하는 항목, .env 파일에 제외 * [IDLE-518] null 값을 제외하는 처리를 추가 * [IDLE-518] 병합 전에 null 값을 제외하는 처리를 추가 * [IDLE-518] context 출력문 추가 * [IDLE-518] JSON 형식으로 변환한 후, SSH 스크립트 내부에서 이를 파일로 저장 * [IDLE-518] .env 파일에 INSTANCE_PEM_KEY가 들어가지 않도록 수정 * [IDLE-518] ddl을 validate으로 수정 * [IDLE-518] 브랜치 push시에 동작하도록 수정 --------- Co-authored-by: wonjunYou <youwjune@gmail.com> Co-authored-by: Wonjun You <59856002+wonjunYou@users.noreply.github.com>
* [IDLE-000] Production CI 스크립트 작성 * [IDLE-000] 센터 공고 수정 API 내 접수 방법 null 비허용 * [IDLE-000] 공고 지원자 조회 시, 삭제된 유저는 조회되지 않도록 수정 * [IDLE-363] 센터 관리자 전화 인증 요청 API * [IDLE-363] 개발 환경 ddl-auto 옵션 임시로 create 옵션으로 변경 * [IDLE-365] 공고 크롤러 selenium 로직 수정 및 로컬 동작 확인 * [IDLE-365] 테스트를 위한 스케줄러 기준 시각 변경 * [IDLE-365] batch job enable 옵션 비활성화 * [IDLE-365] ddl-auto update로 변경 * [IDLE-365] 크롤링 공고 필드 null 비허용 * [IDLE-365] 스케줄러 시간 02시로 설정 * [IDLE-366] spring batch selenium 크롤링을 위한 빌드 스크립트 수정 * [IDLE-366] worknet 사이트가 고용 24 사이트로 통합됨에 따라, 크롤링 스크립트 수정 * [IDLE-366] 크롤러 동작 스케줄링 시간 변경 * [IDLE-366] 스프링 초기 실행 시, spring batch 자동 실행 방지 옵션 추가 * [IDLE-366] spring batch 5 버전에서 업데이트 된 변경사항 적용 및 별도의 JobLauncher 구현 * [IDLE-366] 불필요 의존성 및 옵션 제거 * [IDLE-366] 크롤링 조회 API 내 entity status 필드 추가 및 쿼리 수정 * [IDLE-358] 운영 환경 CD 구축 및 운영 환경 profile 설정 추가 * [IDLE-358] 운영 환경 docker run 실행 시 예외 처리 * [IDLE-000] 크롤링 전체 조회 DTO 생성자 추가 * [IDLE-000] 공고 전체 조회 fetchJoin() 중복 이슈 해결을 위한 subquery 분리 * [IDLE-000] AI 코드리뷰 coderabbit 도입 * [IDLE-000] 크롤링 공고 반경범위 조회 필터를 위한 where절 추가 * [IDLE-000] TimeZone 설정이 적용되지 않는 문제 해결 * [IDLE-000] TimeZone 지정 및 @EnableScheduling 설정 * [IDLE-000] TimeZone 설정 제거 * [IDLE-000] 공고 전체 조회 쿼리 롤백 * [IDLE-000] 기존 공고 내 location을 기반으로 위.경도 값을 decoding하도록 변경 * [IDLE-000] 배포 전 최종 QA * [IDLE-000] 크롤링 공고 생성일자 필드 type 변경(timestamp -> date) * [IDLE-000] Redis 비밀번호 설정 추가 (#171) * [IDLE-000] Redis 비밀번호 설정 추가 * [IDLE-000] yaml 파일에 password 필드 추가 * [IDLE-000] redis local default password 설정 * [IDLE-000] compose 파일 내, 비밀번호 지정 command 설정 * [IDLE-000] Redis 볼륨 설정 * [IDLE-000] ci triggering branch 임시 변경 * [IDLE-000] ci triggering branch 롤백 * [IDLE-000] 테스트 심사 통과를 위한 전화번호 검증 로직 추가 * [IDLE-000] 테스트 심사 통과를 위한 전화번호 검증 로직 추가 * [IDLE-389] 센터 인증 요청 이벤트 발생 시, 디스코드 웹훅 알림을 전송하는 로직 작성 * [IDLE-389] 사업자 등록번호 client properties 클래스명 변경 * [IDLE-389] 코드 리뷰 반영 * [IDLE-000] 트랜잭션 전파 레벨 변경(REQUIRED -> REQUIRES_NEW) * [IDLE-396] FCM 모듈 추가 및 firebase 의존성 설정 * readme 제목 수정 * readme 제목 수정 * [IDLE-399] FCM Device Token 관리 API * [IDLE-399] 알림 도메인 설계 * [IDLE-000] fcm service 설정값 주입을 위한 디렉토리 구조 변경 * [IDLE-000] fcm service 설정값 주입을 위한 디렉토리 구조 변경 * [IDLE-400] 채용 공고 지원자 발생 시, 센터 관리자에게 알림을 발송한다. * [IDLE-400] fcm 모듈 설정 추가 * [IDLE-400] 공고 지원자 발생 시, 모든 센터 관리자들에게 다중 알림을 발송한다. * [IDLE-415] 알림 조회 처리 API * [IDLE-417] 읽지 않은 알림 수 집계 API * [IDLE-418] 알림 목록 조회 API * [IDLE-418] 피드백 반영 * [IDLE-423] soft-delete가 적용된 즐겨찾기 entity에서, 즐겨찾기 해제 후 다시 설정하는 경우 발생하는 버그를 해결한다. * [IDLE-424] 요양 보호사 공고 전체 조회 시, 삭제된 공고가 함께 보이는 문제 해결 * [IDLE-400] 채용 공고 지원자 발생 시, 센터 관리자에게 알림을 발송한다. (#183) * [IDLE-400] 채용 공고 지원자 발생 시, 센터 관리자에게 알림을 발송한다. * [IDLE-400] fcm 모듈 설정 추가 * [IDLE-400] 공고 지원자 발생 시, 모든 센터 관리자들에게 다중 알림을 발송한다. * [IDLE-400] 채용 공고 지원자 발생 시, 센터 관리자에게 알림을 발송한다. * [IDLE-400] fcm 모듈 설정 추가 * [IDLE-400] 공고 지원자 발생 시, 모든 센터 관리자들에게 다중 알림을 발송한다. * [IDLE-415] 알림 조회 처리 API * [IDLE-417] 읽지 않은 알림 수 집계 API * [IDLE-418] 알림 목록 조회 API * [IDLE-418] 피드백 반영 * [IDLE-423] soft-delete가 적용된 즐겨찾기 entity에서, 즐겨찾기 해제 후 다시 설정하는 경우 발생하는 버그를 해결한다. * [IDLE-424] 요양 보호사 공고 전체 조회 시, 삭제된 공고가 함께 보이는 문제 해결 * [IDLE-400] 알림 명세 변경 * [IDLE-400] fcm 설정 파일 디렉토리 path 변경 * [IDLE-400] ddl 옵션 변경 * [IDLE-400] ci/cd 옵션 변경 * [IDLE-000] ci triggering branch 복구 * [IDLE-000] develop 환경에서 fcm service 설정 파일 path 수정 * [IDLE-000] fcm service json 파일명 변경 * [IDLE-000] firebase service key 설정 경로 체크를 위해, cd 스크립트를 수정합니다. * Update README.md * [IDLE-000] fcm service key 경로를 class path 경로로 수정 시도 * [IDLE-000] ci triggering branch 임시 변경 * [IDLE-000] firebaseApp 초기화 임시 비활성화 * [IDLE-000] firebaseApp 초기화 임시 비활성화 * [IDLE-000] firebaseApp 초기화 임시 비활성화 * [IDLE-000] file path 앞에 ./ 제외 * [IDLE-000] 절대 경로로 변경 시도 * [IDLE-000] fcm service key 생성 path 수정 * [IDLE-000] fcm service key json file 생성 스크립트 작성 * [IDLE-000] ci triggering branch develop으로 롤백 * [IDLE-000] 불필요 스크립트 제거 * [IDLE-000] firebase config의 현재 경로를 출력하도록 print문 추가 (#197) * [IDLE-000] firebase config의 현재 경로를 출력하도록 print문 추가 * [IDLE-000] ci triggering branch 수정 * [IDLE-000] ci triggering branch 수정 * [IDLE-000] firebase app 초기화 로직 주석 처리 * [IDLE-000] firebase app 초기화 로직 주석 처리 * [IDLE-000] firebase app 초기화 로직 주석 처리 * [IDLE-000] file 대신 string으로 주입받아 초기화하는 방식으로 전환 * [IDLE-000] 일반 string 대신 base64 인코딩 된 문자열을 주입하도록 처리 * [IDLE-000] 일반 string 주입으로 rollback * [IDLE-000] json string log 추가 * [IDLE-000] base64 문자열로 재 변경 * [IDLE-000] firebase config의 현재 경로를 출력하도록 print문 추가 * [IDLE-429] DB 형상관리를 위한 Flyway 적용 * [IDLE-429] Flyway latest version으로 설정 * [IDLE-429] 피드백 반영 * [IDLE-000] firebase config의 현재 경로를 출력하도록 print문 추가 * [IDLE-000] 알림 조회 처리 로직에 @transactional 추가 * [IDLE-000] 알림 조회 시, 생성 시각 기준이 아닌 uuid v7 id 기준으로 내림차순 정렬하도록 변경 * [IDLE-000] CI 트리거 브랜치 복구 * [IDLE-454] 테스트를 위한 크롤링 수행 시각 변경 및 로깅 추가 * [IDLE-000] 공고 범위 검색 내 중복 데이터 발생 방지 * [IDLE-000] ci 트리거 브랜치 변경 * [IDLE-000] ci 트리거 브랜치 롤백 * [IDLE-000] monitoring 모듈 추가 및 actuator, prometheus 의존성 추가 * [IDLE-456] monitoring.yml 작성 * [IDLE-456] monitoring profile 추가 * [IDLE-456] actuator dependency group name 수정 * [IDLE-000] 크롤링 주기 하루 2회로 변경 * [IDLE-000] 불필요 로그 제거 * [IDLE-000] 인증번호 SMS 내용 수정 * [IDLE-000] classPath 하위 yaml 파일 확장자 모두 .yml로 통일 * [IDLE-000] 즐겨찾기 facade service에 트랜잭션 추가 (#206) * [IDLE-000] firebase config의 현재 경로를 출력하도록 print문 추가 * [IDLE-000] facade service에 transaction 추가 * [IDLE-461] 유저가 다중 디바이스에서 알림을 받을 수 있도록 개선한다. (#207) * [IDLE-000] firebase config의 현재 경로를 출력하도록 print문 추가 * [IDLE-461] 한 유저가 다중 디바이스 설정이 가능하도록 한다. * [IDLE-000] firebase config의 현재 경로를 출력하도록 print문 추가 * [IDLE-000] presentation module의 gradle 파일에 monitoring 모듈 dependency 추가 * [IDLE-000] deviceToken 서비스에서 트랜잭션 어노테이션 추가 * [IDLE-000] batch 테스트를 위해 30분마다 동작하도록 변경 * [IDLE-475] 채팅, 채팅방 도메인 설계 * [IDLE-475] 채팅 메세지 최소, 최대 길이 제한 설정 * [IDLE-000] Batch 메타데이터 테이블 스크립트 변경 및 크롤링 수행 주기 설정 * [IDLE-000] 운영 환경 CD 스크립트에서 불필요한 step 제거 * [IDLE-000] 도텐브 파일 공백 제거 스크립트 작성, 크롤링 대상일자 전날 등록된 공고로 변경 * [IDLE-000] 크롤링 기준 시각 15시로 임시 변경 * [IDLE-000] cd env 파일 생성 스크립트 변경 * [IDLE-492] 동일 유저가 여러 개의 디바이스를 사용 시, 알림이 중복해서 누적되는 현상 * [IDLE-493] flyway 스크립트 오탈자 수정 * [IDLE-493] flyway 스크립트 오탈자 수정 * [IDLE-494] 요양 보호사 및 센터 프로필에서 긴 텍스트를 입력 가능한 항목을 TEXT 컬럼으로 지정한다. * [IDLE-495] 요양 보호사는 마감된 공고에 지원이 불가능하다. * [IDLE-495] 공고 마감 처리 메서드명 변경 complete -> completed * [IDLE-496] 스프링 프로파일 지정을 위한 환경변수 주입 * [IDLE-496] 로그 일부 수정 * [IDLE-000] 안드로이드 app link를 위한 asset 추가 * [IDLE-190] 센터 관리자 인증 요청 목록 조회 API * [IDLE-000] 크롤링 주기 변경 및 테스트용 에러 로그 추가 * [IDLE-000] 크롤링 대상 사이트에 알림창(alert)이 뜨는 케이스에 대한 처리 * [IDLE-509] 크롤링 전체 조회 시, 공고가 중복 노출되는 현상 해결 * [IDLE-509] 피드백 반영 * [IDLE-509] 사용하지 않는 하위 서비스 의존성 제거 * [IDLE-000] 크롤링 진행 시각 저녁 11시로 변경 * [IDLE-000] 크롤링 공고 즐겨찾기 조회 로직 버그 수정 * [IDLE-000] 요양 보호사 및 센터 관리자 전화번호 컬럼에 unique index 추가 * [IDLE-512] 센터 관리자 인증 요청 event 변경 및 NotificationInfo 인터페이스 패키지 이동 * [IDLE-512] 센터 관리자 인증 요청 event 변경 및 NotificationInfo 인터페이스 패키지 이동 * [IDLE-513] 요양 보호사 location 필드 추가 및 기존 데이터 마이그레이션 * [IDLE-513] 센터 관리자 공고 등록 시, 주변 요양보호사에게 FCM 알림을 일괄 전송한다. * [IDLE-513] 센터 관리자 공고 등록 시, 주변 요양보호사에게 FCM 알림을 일괄 전송한다. * [IDLE-000] notification type enum 속성 추가 * [IDLE-000] 센터 공고 등록 알림 제목 및 프로필 url null로 수정 * [IDLE-000] Readme 업데이트 * [IDLE-504] 센터 관리자 인증 승인 및 거절 API * [IDLE-456] prometheus, grafana 설정을 위한 monitoring.yml 설정 * [IDLE-476] 웹소켓, Redis pub/sub을 이용한 채팅 전송 기능 (#217) * [IDLE-476] 웹소켓 dependency 추가 * [IDLE-476] 웹소켓, Redis pub/sub을 이용한 채팅 전송 기능 * [IDLE-476] 불필요 클래스 제거 * [IDLE-476] 채팅 메세지 생성 책임을 하위 도메인에서 생성하도록 수정 * [IDLE-476] hash 역직렬화 시 필요한 처리를 Serializer 설정 추가 * [IDLE-476] json 역직렬화 시, 특수문자 허용 * [IDLE-476] websocket stomp 엔드포인트 노출 설정 변경 * [IDLE-476] 채팅 메세지 길이 정책 적용 * [IDLE-518] bastion서버를 통해 production 서버로 접근 후, 배포하도록 설정 (#252) * [IDLE-518] ECR 레파지토리 변경 (#254) * [IDLE-518] bastion서버를 통해 production 서버로 접근 후, 배포하도록 설정 * [IDLE-518] ECR 레파지토리 변경 * [IDLE-518] docker-compose 파일 위치 변경 (#256) * [IDLE-518] bastion서버를 통해 production 서버로 접근 후, 배포하도록 설정 * [IDLE-518] ECR 레파지토리 변경 * [IDLE-518] docker-compose 파일 경로 변경 * [IDLE-518] 소스파일 경로 변경 * [IDLE-518] target 경로 변경 * [IDLE-518] 소스파일 경로 변경 * [IDLE-518] 타겟파일 경로 원상복구 * [IDLE-518] 타겟파일 경로 수정 * [IDLE-518] compose 파일 실행 경로 수정 * [IDLE-518] 하드코딩된 변수를 secrets로 변경 * [IDLE-518] 하드코딩된 변수를 secrets로 변경 * [IDLE-518] 하드코딩된 변수를 secrets로 변경 * [IDLE-518] Configuration Env file 스탭 추가 * [IDLE-518] secrets로 변경 * [IDLE-518] CI/CD재가동 전, 수동 실행으로 변경 (#257) * [IDLE-518] bastion서버를 통해 production 서버로 접근 후, 배포하도록 설정 * [IDLE-518] ECR 레파지토리 변경 * [IDLE-518] docker-compose 파일 경로 변경 * [IDLE-518] 소스파일 경로 변경 * [IDLE-518] target 경로 변경 * [IDLE-518] 소스파일 경로 변경 * [IDLE-518] 타겟파일 경로 원상복구 * [IDLE-518] 타겟파일 경로 수정 * [IDLE-518] compose 파일 실행 경로 수정 * [IDLE-518] 하드코딩된 변수를 secrets로 변경 * [IDLE-518] 하드코딩된 변수를 secrets로 변경 * [IDLE-518] 하드코딩된 변수를 secrets로 변경 * [IDLE-518] Configuration Env file 스탭 추가 * [IDLE-518] secrets로 변경 * [IDLE-518] CI/CD 재가동 전 수동으로 수정 * [IDLE-518] CI/CD 재가동 전 수동으로 수정 * [IDLE-518] ECR 레파지토리 작성 * [IDLE-518] 서버 재구축 및 CI/CD 재가동 (#258) * [IDLE-518] bastion서버를 통해 production 서버로 접근 후, 배포하도록 설정 * [IDLE-518] ECR 레파지토리 변경 * [IDLE-518] docker-compose 파일 경로 변경 * [IDLE-518] 소스파일 경로 변경 * [IDLE-518] target 경로 변경 * [IDLE-518] 소스파일 경로 변경 * [IDLE-518] 타겟파일 경로 원상복구 * [IDLE-518] 타겟파일 경로 수정 * [IDLE-518] compose 파일 실행 경로 수정 * [IDLE-518] 하드코딩된 변수를 secrets로 변경 * [IDLE-518] 하드코딩된 변수를 secrets로 변경 * [IDLE-518] 하드코딩된 변수를 secrets로 변경 * [IDLE-518] Configuration Env file 스탭 추가 * [IDLE-518] secrets로 변경 * [IDLE-518] CI/CD 재가동 전 수동으로 수정 * [IDLE-518] CI/CD 재가동 전 수동으로 수정 * [IDLE-518] ECR 레파지토리 작성 * [IDLE-518] .env 파일 경로 변경 * [IDLE-518] 레지스트리 내용 변경 * [IDLE-518] DB 이름을 caremeet으로 변경 * [IDLE-518] 서비스 간 통신을 위한 컨테이너간 네트워크 설정 추가 * [IDLE-518] ddl create 적용 * [IDLE-518] private_key.pem 파일을 통해 접근하도록 수정 * [IDLE-518] 호스트키 체크 우회 수정 * [IDLE-518] SSH 세션에 터미널을 할당하도록 옵션 추가 * [IDLE-518] 터널링 방법을 수정 * [IDLE-518] Private Subnet에 존재하는 서버의 22번 포트를 로컬 2222 포트로 연결 * [IDLE-518] .env파일 생성하는 명령어 수정 * [IDLE-518] 들여쓰기 수정 * [IDLE-518] INPUT_으로 시작하는 항목, .env 파일에 제외 * [IDLE-518] null 값을 제외하는 처리를 추가 * [IDLE-518] 병합 전에 null 값을 제외하는 처리를 추가 * [IDLE-518] context 출력문 추가 * [IDLE-518] JSON 형식으로 변환한 후, SSH 스크립트 내부에서 이를 파일로 저장 * [IDLE-518] .env 파일에 INSTANCE_PEM_KEY가 들어가지 않도록 수정 * [IDLE-518] ddl을 validate으로 수정 * [IDLE-518] 브랜치 push시에 동작하도록 수정 * [IDLE-531] 배치 작업 정상화 (#260) * [IDLE-534] Flayway 재설정 및 배치 메타데이터 테이블 생성 * [IDLE-548] Tasklet을 Chunk로 변경 * [IDLE-549] 배치 실행 API 추가 * [IDLE-533] GeoCodeService 전환 메서드 static으로 전환 * [IDLE-533] 책임별 클래스 분리 * [IDLE-547] 멀티스레드 적용 및 공유자원 분리 * [IDLE-531] 크롤링 기준 날짜 변경 --------- Co-authored-by: wonjunYou <youwjune@gmail.com> Co-authored-by: Wonjun You <59856002+wonjunYou@users.noreply.github.com>
1. 📄 Summary
REQUIRES_NEW
로 설정하여 알림 전송 실패에 따른 비즈니스 로직의 트랜잭션 롤백을 방지했습니다.Summary by CodeRabbit
New Features
CarerApplyEventPublisher
서비스 클래스 추가로 신청 이벤트 발행 기능 제공.CarerApplyService
의create
메서드가 신청 엔티티를 반환하도록 변경.DeviceTokenService
에 사용자 ID로 장치 토큰을 검색하는 메서드 추가.ApplyEvent
데이터 클래스 추가로 신청 이벤트 정보를 구조화.CarerApplyEventListener
및CarerApplyEventService
추가로 신청 이벤트 처리 및 알림 전송 기능 구현.FcmClient
클래스 추가로 Firebase Cloud Messaging을 통한 메시지 전송 기능 제공.DestinationType
열거형 추가로 목적지 유형을 구조화.findAllByCenterBusinessRegistrationNumber
를 통해 센터 관리자 검색 기능 추가.CrawlingJobScheduler
클래스를 추가하여 정기적인 작업 실행 기능 제공.NotificationService
및NotificationFacadeService
추가로 알림 관리 기능 제공.NotificationApi
및NotificationController
추가로 RESTful 알림 관리 인터페이스 제공.NotificationScrollResponse
및UnreadNotificationCountResponse
데이터 클래스 추가로 알림 응답 구조화.CarerApplyNotificationInfo
데이터 클래스 추가로 신청 관련 알림 정보 구조화.Notification
클래스에 이미지 URL 및 알림 유형을 추가하여 알림 정보 확장.Bug Fixes
createApply
메서드의 로직 개선으로 사용자 인증 및 신청 생성 처리 개선.Refactor
FcmConfig
클래스를 인터페이스로 변경하여 구성 관리 개선.JobPostingQueryRepository
에서 활성 상태의 구직 게시물만 반환하도록 쿼리 조건 추가.