Skip to content
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-513] 센터 관리자 공고 등록 시, 주변 요양보호사에게 FCM 알림을 일괄 전송한다. #243

Merged
merged 2 commits into from
Nov 13, 2024

Conversation

wonjunYou
Copy link
Contributor

@wonjunYou wonjunYou commented Nov 13, 2024

1. 📄 Summary

  • 센터 관리자가 구인 공고를 등록한 경우, 반경 5km 이내에 거주하는 요양 보호사에게 FCM 알림을 일괄 전송합니다.

2. ✏️ Documentation

Server to FCM Request Spec


서버 → Firebase SDK 요청 스펙에 대한 명세입니다.

  • 공고 등록 알림(NEW_JOB_POSTING)

    {
      "message":{
        "notification":{
          "body" : "00시 00구 00동 0등급 00세 남자",
          "title" : "주변에 새로운 공고가 등록되었어요, 얼른 확인해 보세요!",
        },
        "data" : {
          "notificationId": "string(uuid)",
          "notificationType" : "NEW_JOB_POSTING",
          "jobPostingId" : "string(uuid)"
        }
    }

Summary by CodeRabbit

  • 신규 기능

    • 새로운 구인 공고 생성 이벤트 발행 기능이 추가되었습니다.
    • 구인 공고 생성 시 알림을 발송하는 기능이 통합되었습니다.
    • 위치 기반으로 활동 중인 간호사를 검색하는 기능이 추가되었습니다.
    • 새로운 구인 공고 알림 정보를 위한 클래스가 도입되었습니다.
    • 구인 공고 알림 이벤트 리스너가 추가되어 이벤트 처리 기능이 강화되었습니다.
  • 버그 수정

    • 간호사 계정 상태에서 'INACTIVE' 대신 'DELETED' 상태로 업데이트되었습니다.
  • 문서화

    • 코드 내 주석 및 문서화가 개선되었습니다.

@wonjunYou wonjunYou added the ✨기능 기능 개발 및 구현 label Nov 13, 2024
@wonjunYou wonjunYou self-assigned this Nov 13, 2024
Copy link

coderabbitai bot commented Nov 13, 2024

Walkthrough

이 풀 리퀘스트에서는 여러 파일에 새로운 클래스와 메서드를 추가하고 기존 클래스에 변경을 가했습니다. 주로 CreateJobPostingEventPublisher, CreateJobPostingEvent, CreateJobPostingEventListener, CreateJobPostingEventService와 관련된 알림 시스템을 개선하는 기능이 포함되어 있습니다. 또한, CarerServiceCarer 클래스에 위치 관련 기능이 추가되었으며, CarerQueryRepository가 새로 도입되었습니다. 이러한 변경 사항은 주로 작업 게시 및 알림 처리와 관련된 기능을 강화합니다.

Changes

파일 경로 변경 요약
idle-application/src/main/kotlin/com/swm/idle/application/jobposting/event/CreateJobPostingEventPublisher.kt 클래스 CreateJobPostingEventPublisher 추가, 메서드 publish 추가.
idle-application/src/main/kotlin/com/swm/idle/application/jobposting/facade/CenterJobPostingFacadeService.kt CreateJobPostingEventPublisher, DeviceTokenService, NotificationService 의존성 추가, create 메서드 수정.
idle-application/src/main/kotlin/com/swm/idle/application/jobposting/vo/CreateJobPostingNotificationInfo.kt 클래스 CreateJobPostingNotificationInfo 추가, 메서드 create 추가.
idle-application/src/main/kotlin/com/swm/idle/application/user/carer/domain/CarerService.kt CarerQueryRepository 의존성 추가, create, update 메서드 수정, findAllByLocationWithinRadius 메서드 추가.
idle-domain/src/main/kotlin/com/swm/idle/domain/jobposting/event/CreateJobPostingEvent.kt 데이터 클래스 CreateJobPostingEvent 추가, 팩토리 메서드 of 추가.
idle-domain/src/main/kotlin/com/swm/idle/domain/notification/enums/NotificationType.kt 열거형 NotificationTypeNEW_JOB_POSTING 추가.
idle-domain/src/main/kotlin/com/swm/idle/domain/user/carer/entity/jpa/Carer.kt location 속성 추가, 생성자 및 update 메서드 수정.
idle-domain/src/main/kotlin/com/swm/idle/domain/user/carer/enums/CarerAccountStatus.kt INACTIVE 상태 제거, DELETED 상태 추가.
idle-domain/src/main/kotlin/com/swm/idle/domain/user/carer/repository/jpa/CarerQueryRepository.kt CarerQueryRepository 클래스 추가, findAllByLocationWithinRadiusisExistInRange 메서드 추가.
idle-infrastructure/fcm/src/main/kotlin/com/swm/idle/infrastructure/fcm/jobposting/listener/CreateJobPostingEventListener.kt 클래스 CreateJobPostingEventListener 추가, 메서드 handleCreateJobPostingEvent 추가.
idle-infrastructure/fcm/src/main/kotlin/com/swm/idle/infrastructure/fcm/jobposting/service/CreateJobPostingEventService.kt 클래스 CreateJobPostingEventService 추가, 메서드 send, createJobPostingNotification, createMessage 추가.

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?

❤️ Share
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Generate unit testing code for this file.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai generate unit testing code for this file.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and generate unit testing code.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

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)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

Copy link

sonarcloud bot commented Nov 13, 2024

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 12

🧹 Outside diff range and nitpick comments (13)
idle-domain/src/main/kotlin/com/swm/idle/domain/user/carer/enums/CarerAccountStatus.kt (1)

3-6: 각 상태값에 대한 설명 문서화 제안

각 상태값의 의미와 사용 사례를 명확히 하기 위해 문서화를 추가하는 것이 좋습니다.

다음과 같이 각 상태값에 대한 설명을 추가하세요:

 enum class CarerAccountStatus {
+    /** 정상적으로 활성화된 계정 상태 */
     ACTIVE,
+    /** 삭제된 계정 상태 */
     DELETED;
 }
idle-domain/src/main/kotlin/com/swm/idle/domain/notification/enums/NotificationType.kt (1)

6-6: 알림 타입 추가가 적절합니다만, 문서화가 필요해 보입니다.

enum 값 추가가 PR의 목적에 잘 부합하며 기존 네이밍 컨벤션도 잘 따르고 있습니다. 다만, 각 알림 타입의 용도와 의미를 명확히 하기 위해 KDoc 문서화를 추가하면 좋을 것 같습니다.

다음과 같이 문서화를 추가하는 것을 제안드립니다:

 enum class NotificationType {
+    /** 지원자 관련 알림 */
     APPLICANT,
+    /** 센터 인증 관련 알림 */
     CENTER_AUTHENTICATION,
+    /** 새로운 구인 공고 등록 알림 */
     NEW_JOB_POSTING,
 }
idle-application/src/main/kotlin/com/swm/idle/application/jobposting/event/CreateJobPostingEventPublisher.kt (2)

12-14: 이벤트 발행 메서드에 대한 개선 제안

메서드가 간단하고 목적에 맞게 잘 구현되어 있습니다. 하지만 다음과 같은 개선사항을 고려해보시기 바랍니다:

  1. 예외 처리 추가
  2. 로깅 추가 (특히 운영 환경에서의 디버깅을 위해)

다음과 같이 개선할 수 있습니다:

    fun publish(createJobPostingEvent: CreateJobPostingEvent) {
+       try {
+           logger.info("Publishing job posting event: ${createJobPostingEvent.notificationId}")
            eventPublisher.publishEvent(createJobPostingEvent)
+           logger.debug("Successfully published job posting event: ${createJobPostingEvent.notificationId}")
+       } catch (e: Exception) {
+           logger.error("Failed to publish job posting event: ${createJobPostingEvent.notificationId}", e)
+           throw e
+       }
    }

companion object에 logger 추가:

companion object {
    private val logger = LoggerFactory.getLogger(CreateJobPostingEventPublisher::class.java)
}

1-16: 아키텍처 관련 제안

현재 구현은 이벤트 발행을 위한 기본적인 구조를 갖추고 있습니다. 다만, 다음 사항들을 고려해보시면 좋겠습니다:

  1. 대량의 FCM 알림 발송 시 성능 고려
  2. 실패한 알림에 대한 재시도 메커니즘
  3. 알림 발송 상태 모니터링

이러한 요구사항들을 구현하기 위해 다음과 같은 아키텍처 개선을 제안드립니다:

  1. 배치 처리를 위한 큐 시스템 도입 (예: Redis, RabbitMQ)
  2. 재시도 정책 구현
  3. 메트릭 수집 및 모니터링 추가

필요하시다면 이러한 기능들의 구현 예시를 제공해드릴 수 있습니다.

idle-domain/src/main/kotlin/com/swm/idle/domain/jobposting/event/CreateJobPostingEvent.kt (2)

15-25: 유효성 검사 로직 추가를 고려해보세요.

deviceTokennotificationInfo에 대한 유효성 검사를 추가하면 더 안정적인 코드가 될 것 같습니다.

예시 구현:

 fun of(
     deviceToken: DeviceToken,
     notificationId: UUID,
     notificationInfo: NotificationInfo,
 ): CreateJobPostingEvent {
+    require(deviceToken.value.isNotBlank()) { "디바이스 토큰은 비어있을 수 없습니다" }
+    requireNotNull(notificationInfo) { "알림 정보는 null일 수 없습니다" }
     return CreateJobPostingEvent(
         deviceToken = deviceToken,
         notificationId = notificationId,
         notificationInfo = notificationInfo
     )
 }

1-28: KDoc 문서화를 추가해주세요.

클래스와 팩토리 메서드에 대한 문서화를 추가하면 다른 개발자들이 코드를 이해하고 사용하는데 도움이 될 것 같습니다.

예시:

+/**
+ * 구인공고 생성 시 발생하는 이벤트를 나타내는 클래스입니다.
+ * 
+ * @property deviceToken FCM 알림을 전송할 대상 디바이스 토큰
+ * @property notificationId 알림 고유 식별자
+ * @property notificationInfo 알림에 포함될 정보
+ */
 data class CreateJobPostingEvent(
     val deviceToken: DeviceToken,
     val notificationId: UUID,
     val notificationInfo: NotificationInfo,
 ) {
     companion object {
+        /**
+         * CreateJobPostingEvent 인스턴스를 생성합니다.
+         * 
+         * @param deviceToken FCM 알림을 전송할 대상 디바이스 토큰
+         * @param notificationId 알림 고유 식별자
+         * @param notificationInfo 알림에 포함될 정보
+         * @return 생성된 CreateJobPostingEvent 인스턴스
+         */
         fun of(...)
idle-application/src/main/kotlin/com/swm/idle/application/jobposting/vo/CreateJobPostingNotificationInfo.kt (1)

19-38: Null 안전성 및 문서화 개선이 필요합니다

  1. imageUrl이 nullable이지만 이에 대한 처리 로직이 명확하지 않습니다.
  2. 메서드에 대한 KDoc 문서화가 누락되었습니다.

다음과 같이 개선하는 것을 제안합니다:

+ /**
+  * 구인공고 알림 정보를 생성합니다.
+  * @param title 알림 제목
+  * @param body 알림 내용
+  * @param receiverId 수신자 ID
+  * @param notificationType 알림 유형
+  * @param imageUrl 이미지 URL (선택사항)
+  * @param jobPostingId 구인공고 ID
+  * @return CreateJobPostingNotificationInfo 생성된 알림 정보
+  */
fun create(
    title: String,
    body: String,
    receiverId: UUID,
    notificationType: NotificationType,
    imageUrl: String?,
    jobPostingId: UUID,
): CreateJobPostingNotificationInfo {
    val notificationDetails = mapOf(
        "jobPostingId" to jobPostingId,
+       "imageUrl" to (imageUrl ?: "")
    )
idle-domain/src/main/kotlin/com/swm/idle/domain/user/carer/repository/jpa/CarerQueryRepository.kt (1)

13-16: 클래스 문서화 추가 필요

Repository 클래스의 목적과 책임을 명확히 하기 위해 KDoc 문서화를 추가하는 것이 좋겠습니다.

다음과 같이 문서화를 추가해보세요:

+/**
+ * 요양보호사의 위치 기반 쿼리를 처리하는 Repository
+ *
+ * @property jpaQueryFactory QueryDSL 쿼리 생성을 위한 팩토리
+ */
 @Repository
 class CarerQueryRepository(
     private val jpaQueryFactory: JPAQueryFactory,
 )
idle-infrastructure/fcm/src/main/kotlin/com/swm/idle/infrastructure/fcm/jobposting/service/CreateJobPostingEventService.kt (2)

1-16: 로깅 개선 제안

KotlinLogging을 사용한 로거 설정이 잘 되어있습니다. 하지만 로거 이름을 명시적으로 지정하면 로그 분석이 더욱 용이해질 것 같습니다.

다음과 같이 수정을 제안드립니다:

-    private val logger = KotlinLogging.logger {}
+    private val logger = KotlinLogging.logger("CreateJobPostingEventService")

27-32: 알림 내용 유효성 검사 추가 필요

알림 생성 로직이 깔끔하게 구현되어 있습니다. 하지만 title과 body의 유효성 검사가 없습니다.

다음과 같은 확장을 제안드립니다:

     private fun createJobPostingNotification(createJobPostingEvent: CreateJobPostingEvent): Notification {
+        require(createJobPostingEvent.notificationInfo.title.isNotBlank()) { "알림 제목은 비어있을 수 없습니다" }
+        require(createJobPostingEvent.notificationInfo.body.isNotBlank()) { "알림 내용은 비어있을 수 없습니다" }
+
         return Notification.builder()
             .setTitle(createJobPostingEvent.notificationInfo.title)
             .setBody(createJobPostingEvent.notificationInfo.body)
             .build()
     }
idle-application/src/main/kotlin/com/swm/idle/application/user/carer/domain/CarerService.kt (1)

3-3: 의존성 주입 및 임포트 검토

CarerQueryRepository의 추가는 적절해 보입니다. 하지만 위치 기반 쿼리의 성능을 고려해야 합니다.

공간 데이터 쿼리의 성능 최적화를 위해 다음 사항들을 고려해보시기 바랍니다:

  • 위치 데이터에 대한 인덱스 추가
  • 캐싱 전략 수립
  • 배치 처리 방식 검토

Also applies to: 8-8, 12-12, 22-22

idle-application/src/main/kotlin/com/swm/idle/application/jobposting/facade/CenterJobPostingFacadeService.kt (2)

78-83: jobPostingLifeAssistanceService.create를 비동기로 실행하는 것이 좋습니다

현재 coroutineScope 내에서 jobPostingLifeAssistanceService.create 함수는 비동기로 실행되지 않고 있습니다. 다른 서비스 호출들과 일관성을 유지하고 전체적인 성능 향상을 위해 launch 블록을 사용하여 비동기로 실행하는 것을 권장합니다.

 request.lifeAssistance?.let {
-    jobPostingLifeAssistanceService.create(
-        jobPostingId = jobPosting.id,
-        lifeAssistance = request.lifeAssistance!!,
-    )
+    launch {
+        jobPostingLifeAssistanceService.create(
+            jobPostingId = jobPosting.id,
+            lifeAssistance = request.lifeAssistance!!,
+        )
+    }
 }

124-124: 이벤트 발행 시 예외 처리 추가 권장

createJobPostingEventPublisher.publish(it) 호출 중 예외가 발생할 경우 전체 프로세스가 중단될 수 있습니다. 예외 상황에 대비하여 예외 처리를 추가하고 필요에 따라 로깅하여 디버깅에 도움이 되도록 하는 것이 좋습니다.

try {
    createJobPostingEventPublisher.publish(it)
} catch (e: Exception) {
    // 예외 처리 로직 추가 (예: 로깅)
}
📜 Review details

Configuration used: .coderabbit.yaml
Review profile: CHILL

📥 Commits

Reviewing files that changed from the base of the PR and between 8648e3b and 2e95ee8.

📒 Files selected for processing (11)
  • idle-application/src/main/kotlin/com/swm/idle/application/jobposting/event/CreateJobPostingEventPublisher.kt (1 hunks)
  • idle-application/src/main/kotlin/com/swm/idle/application/jobposting/facade/CenterJobPostingFacadeService.kt (3 hunks)
  • idle-application/src/main/kotlin/com/swm/idle/application/jobposting/vo/CreateJobPostingNotificationInfo.kt (1 hunks)
  • idle-application/src/main/kotlin/com/swm/idle/application/user/carer/domain/CarerService.kt (5 hunks)
  • idle-domain/src/main/kotlin/com/swm/idle/domain/jobposting/event/CreateJobPostingEvent.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/user/carer/entity/jpa/Carer.kt (5 hunks)
  • idle-domain/src/main/kotlin/com/swm/idle/domain/user/carer/enums/CarerAccountStatus.kt (1 hunks)
  • idle-domain/src/main/kotlin/com/swm/idle/domain/user/carer/repository/jpa/CarerQueryRepository.kt (1 hunks)
  • idle-infrastructure/fcm/src/main/kotlin/com/swm/idle/infrastructure/fcm/jobposting/listener/CreateJobPostingEventListener.kt (1 hunks)
  • idle-infrastructure/fcm/src/main/kotlin/com/swm/idle/infrastructure/fcm/jobposting/service/CreateJobPostingEventService.kt (1 hunks)
🧰 Additional context used
🪛 detekt
idle-infrastructure/fcm/src/main/kotlin/com/swm/idle/infrastructure/fcm/jobposting/service/CreateJobPostingEventService.kt

[warning] 22-22: The caught exception is swallowed. The original exception could be lost.

(detekt.exceptions.SwallowedException)

🔇 Additional comments (10)
idle-domain/src/main/kotlin/com/swm/idle/domain/user/carer/enums/CarerAccountStatus.kt (1)

4-5: INACTIVE 상태 제거로 인한 영향 확인 필요

INACTIVE 상태가 제거되고 DELETED 상태가 추가되었습니다. 기존 INACTIVE 상태를 사용하는 코드와 데이터베이스 레코드에 대한 마이그레이션 계획이 필요합니다.

다음 스크립트를 실행하여 INACTIVE 상태의 사용처를 확인하세요:

✅ Verification successful

INACTIVE 상태 제거 확인 완료

INACTIVE 상태를 참조하는 코드가 존재하지 않아 제거로 인한 영향이 없습니다.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# INACTIVE 상태를 참조하는 코드 검색
rg -l "INACTIVE" 

# CarerAccountStatus enum을 사용하는 모든 파일 검색
ast-grep --pattern 'CarerAccountStatus.$$$'

Length of output: 398

idle-application/src/main/kotlin/com/swm/idle/application/jobposting/event/CreateJobPostingEventPublisher.kt (1)

7-10: 클래스 구조가 잘 설계되었습니다!

Spring의 이벤트 발행 패턴을 잘 따르고 있으며, 생성자 주입을 통한 의존성 주입이 올바르게 구현되었습니다.

idle-infrastructure/fcm/src/main/kotlin/com/swm/idle/infrastructure/fcm/jobposting/listener/CreateJobPostingEventListener.kt (2)

1-7: 패키지 구조와 임포트가 적절합니다.

이벤트 리스너의 패키지 위치가 인프라스트럭처 레이어에 잘 배치되어 있으며, 필요한 의존성들이 명확하게 임포트되어 있습니다.


8-11: 컴포넌트 설계가 Spring 베스트 프랙티스를 잘 따르고 있습니다.

생성자 주입 방식을 사용하여 의존성을 관리하고 있으며, 단일 책임 원칙을 잘 준수하고 있습니다.

idle-domain/src/main/kotlin/com/swm/idle/domain/jobposting/event/CreateJobPostingEvent.kt (1)

7-11: 데이터 클래스 구조가 잘 설계되었습니다!

불변성을 보장하는 val 속성들을 사용하여 스레드 안전성을 확보했습니다.

idle-application/src/main/kotlin/com/swm/idle/application/jobposting/vo/CreateJobPostingNotificationInfo.kt (1)

8-15: ⚠️ Potential issue

클래스 반환 타입과 생성된 인스턴스 타입이 일치하지 않습니다

클래스 이름이 CreateJobPostingNotificationInfo이지만 companion object의 create 메서드는 CarerApplyNotificationInfo를 반환합니다. 이는 혼란을 야기할 수 있습니다.

다음과 같이 수정하는 것을 제안합니다:

- fun create(
-   ...
- ): CarerApplyNotificationInfo {
+ fun create(
+   ...
+ ): CreateJobPostingNotificationInfo {

Likely invalid or redundant comment.

idle-domain/src/main/kotlin/com/swm/idle/domain/user/carer/repository/jpa/CarerQueryRepository.kt (1)

1-38: 공간 쿼리 성능 검증 필요

  1. 공간 인덱스가 생성되어 있는지 확인이 필요합니다.
  2. 대량의 데이터에서 성능 테스트가 필요할 수 있습니다.

다음 스크립트로 공간 인덱스 존재 여부를 확인해보세요:

idle-application/src/main/kotlin/com/swm/idle/application/user/carer/domain/CarerService.kt (1)

110-112: 반경 내 요양보호사 조회 메소드 검증 필요

findAllByLocationWithinRadius 메소드에서 다음 사항들을 확인해주세요:

  1. 5km 반경 제한이 구현되어 있는지
  2. 활성 상태의 요양보호사만 조회되는지
  3. null 반환 대신 빈 리스트 반환이 더 적절해 보입니다
idle-domain/src/main/kotlin/com/swm/idle/domain/user/carer/entity/jpa/Carer.kt (2)

88-91: 위치 정보 컬럼 설정이 적절합니다.

SRID 4326 설정으로 WGS84 좌표계를 사용하여 위치 데이터를 정확하게 저장할 수 있습니다. 이는 5km 반경 내 요양보호사 검색에 적합한 설정입니다.


34-34: 생성자 매개변수에 위치 정보가 필수값으로 추가되었습니다.

새로운 요양보호사 등록 시 위치 정보가 필수적으로 필요하므로, 생성자에 location 파라미터를 필수값으로 추가한 것이 적절합니다.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
✨기능 기능 개발 및 구현
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant