Skip to content

[IDLE-577] 채팅 시스템 및 크롤링 공고 조회 최적화#275

Merged
mjj111 merged 32 commits intodevelopfrom
refactor/IDLE-577
May 25, 2025
Merged

[IDLE-577] 채팅 시스템 및 크롤링 공고 조회 최적화#275
mjj111 merged 32 commits intodevelopfrom
refactor/IDLE-577

Conversation

@mjj111
Copy link
Member

@mjj111 mjj111 commented May 25, 2025

1. 📄 Summary

📦 공고 수집 및 조회 개선 (IDLE-578, IDLE-580)

  • 배치 저장 시 Redis에 TTL 13일로 공고 ID를 캐싱
  • 수집 시 날짜 파라미터를 받도록 수정하여 유연한 스케줄링 가능
  • 사용자 위치 기반으로 Redis에서 공고 ID 조회
  • 공고 ID 기반으로 MySQL에서 상세 데이터 조회하도록 변경
  • 공고 최대 개수 제한 (limit 적용)
  • Request/Response 포맷 정비 및 PointConverter 활용 스타일 개선

💬 채팅 기능 개선 (IDLE-581, IDLE-582, IDLE-584)

  • 메시지 전송 시 Redis에서 시퀀스 조회 후 MySQL 저장
  • 채팅방 조회 시 Redis로 unread 정보 기반 조회
  • Read 요청 시 해당 chatroom의 read sequence 갱신 및 unread 정보 삭제
  • 응답 값에서 시퀀스 네이밍 통일 및 일관성 있게 반환 (sequence 필드 추가)

🧹 기타 리팩토링 및 안정화

  • 사용하지 않는 파일/Import 삭제
  • 채팅방, 디바이스 토큰에 유니크 인덱스 추가
  • message sequence 반환 타입을 Long으로 수정

2. 🤔 고민했던 점

이번 작업에서는 Redis를 어떻게 활용할지에 대한 고민이 많았습니다. 단순한 캐시로만 사용할지, 아니면 데이터 흐름의 핵심 일부로 적극 활용할지를 두고 여러 방향을 검토했습니다. 특히, 위치 기반 공고 조회나 채팅 시퀀스 관리처럼 실시간성과 데이터 정합성이 중요한 기능에서는 Redis가 단순 캐시를 넘어서 핵심 저장소로써 어떤 역할을 해야 할지 판단이 필요했습니다. TTL을 설정할 때에도 만료 이후의 처리 로직이나, 예상치 못한 삭제로 인한 fallback 전략이 함께 고려되어야 했습니다. Redis 특성상 빠른 속도와 유연함을 제공하지만, 반대로 운영 중 발생할 수 있는 예외 상황에 대한 고민도 함께 이루어졌습니다.

3. 💡 알게된 점

이번 경험을 통해 Redis가 단순히 자주 조회되는 데이터를 캐시하는 용도만이 아니라, 시퀀스 저장소나 사용자별 상태(예: 안 읽은 메시지 상태) 관리 등 실시간성을 요구하는 로직에서 핵심적인 역할을 할 수 있다는 점을 새롭게 인식하게 되었습니다. 또한 TTL을 활용한 데이터 보존 전략이 실제 서비스에서 어떤 의미를 가지는지, 그리고 데이터가 만료되었을 때의 처리 방안이 얼마나 중요한지도 체감할 수 있었습니다. Redis와 RDB 간의 정합성 유지 문제나, 캐시가 아닌 준-영속 저장소로 사용할 때 생길 수 있는 데이터 소실 위험에 대해서도 더 깊이 공부할 필요성을 느꼈습니다. 특히 채팅처럼 데이터 순서와 정확성이 중요한 기능에서는 Redis를 어떻게 안전하게 설계하고 운영할지에 대한 고민이 앞으로도 계속 이어질 것 같습니다.

Summary by CodeRabbit

  • 신규 기능

    • 채팅과 잡포스팅에 Redis 기반 위치 검색 및 메시지 시퀀스 관리 기능이 도입되었습니다.
    • 크롤링 잡포스팅 검색에 거리 기반 확장, 스크롤 페이징 기능이 추가되었습니다.
    • 채팅 메시지 및 읽음 알림에 시퀀스 기반 처리와 통합 API가 적용되었습니다.
    • 새로운 크롤링 잡포스팅 서비스 및 페이서드가 도입되어 사용자 위치 기반 검색이 개선되었습니다.
    • 채팅 메시지 정보 및 소켓 응답 모델이 확장되어 시퀀스와 메시지 리스트를 포함하도록 변경되었습니다.
    • Redis를 활용한 채팅방 읽음 시퀀스 및 미확인 메시지 관리 리포지토리가 추가되었습니다.
    • 배치 작업에 날짜 오프셋 파라미터가 도입되어 유연한 크롤링 날짜 설정이 가능해졌습니다.
  • 기능 개선

    • 채팅방 목록과 최근 메시지에 상대방 정보, 읽음 상태, 메시지 시퀀스가 포함되어 정확한 읽음 처리와 알림이 가능해졌습니다.
    • 잡포스팅 API가 위치 기반 거리 단위와 페이징 방식으로 개선되었습니다.
    • 채팅 메시지 전송 및 읽기 API가 역할별 구분 없이 통합되어 일관성이 향상되었습니다.
    • 배치 작업의 Redis 연동 및 위치 인덱싱 로직이 강화되고, 의존성 주입 및 파라미터화가 개선되었습니다.
    • 채팅방 조회 쿼리가 단순화되고, 읽지 않은 메시지 수 계산 로직이 Redis 기반으로 변경되었습니다.
    • API 요청/응답 모델과 스웨거 문서가 거리 단위 및 페이징 방식 변경에 맞춰 업데이트되었습니다.
  • 버그 수정

    • 채팅 메시지 읽음 처리 및 채팅방 요약 정보의 읽지 않은 메시지 수 계산이 정확하게 동작하도록 수정되었습니다.
  • DB 마이그레이션

    • 채팅 메시지 테이블에 시퀀스 컬럼 추가 및 읽음 컬럼 제거, 채팅방의 carer/center 조합 유니크 제약 추가, 디바이스 토큰 유니크 인덱스 추가 등 스키마 변경이 반영되었습니다.
  • 리팩터링/정리

    • 중복된 서비스, 컨트롤러, 파사드 클래스와 불필요한 테스트 및 설정 파일이 정리되었습니다.
    • 네이밍 및 파라미터 일관성 개선과 코드 구조 최적화가 이루어졌습니다.
    • Redis 관련 클래스가 리포지토리 형태로 변경되고, 배치 및 크롤링 관련 코드가 모듈화되었습니다.
    • 채팅 및 잡포스팅 관련 서비스들이 역할 구분 없이 통합되고, 공통 로직이 재구성되었습니다.
    • 컨트롤러에서 사용자 인증 및 위치 정보 추출 로직이 간소화되었습니다.
  • 문서화

    • API 요청/응답 모델, 거리 단위, 페이징 관련 스웨거/오픈API 문서가 최신화되었습니다.

@mjj111 mjj111 self-assigned this May 25, 2025
@mjj111 mjj111 added the 🎯리팩토링 리팩토링 및 고도화 이슈 label May 25, 2025
@coderabbitai
Copy link

coderabbitai bot commented May 25, 2025

"""

Walkthrough

이 PR은 채팅, 크롤링 일자리, 잡포스팅 등 주요 도메인에서 Redis 기반의 데이터 처리와 시퀀스 기반 메시지 읽기/쓰기 등 새로운 기능을 도입하며, 관련 서비스, 컨트롤러, DTO, 레포지토리, 배치 잡 구성을 대대적으로 리팩터링합니다. 여러 API 시그니처와 데이터 모델이 변경되고, Redis를 활용한 지오스페이셜 쿼리 및 채팅 읽음 처리, 메시지 시퀀스 관리가 추가되었습니다.

Changes

파일/경로 요약 변경 내용 요약
.../chat/domain/ChatMessageService.kt, .../ChatMessageRepository.kt, .../ChatRoomService.kt, .../ChatRoomRepository.kt, .../vo/ChatRoomSummaryInfo.kt, .../vo/ChatRoomSummaryInfoProjection.kt, .../vo/ReadMessage.kt, .../entity/jpa/ChatMessage.kt 채팅 메시지의 시퀀스 기반 저장 및 읽음 처리로 구조 변경, 기존 isRead 필드 및 관련 메서드 제거, ChatRoomSummaryInfo/Projection 구조 변경, ChatRoomRepository 쿼리 단순화
.../chat/facade/ChatFacadeService.kt, .../presentation/chat/controller/ChatCarerController.kt, .../controller/ChatCenterController.kt, .../controller/ChatSocketController.kt, .../api/ChatCarerApi.kt, .../api/ChatCenterApi.kt, .../handler/ChatHandler.kt 채팅 메시지 송수신/읽기 메서드 통합 및 리팩터링, 최근 메시지 반환 타입 변경, 소켓 메시지 응답 구조 변경
.../chat/repository/ChatRedisRepository.kt, .../chat/event/ChatRedisPublisher.kt, .../chat/event/ChatRedisSubscriber.kt Redis 기반 채팅 메시지 읽음/시퀀스/세션 관리 저장소 신규 도입, RedisPublisher/Subscriber 역할 분리 및 메서드 정리
.../common/converter/PointConverter.kt, .../jobposting/domain/CrawlingJobPostingService.kt, .../jobposting/repository/redis/RedisJobPostingRepository.kt, .../jobposting/repository/querydsl/CrawlingJobPostingSpatialQueryRepository.kt 지오스페이셜 쿼리 Redis 기반으로 전환, Point 변환기 리팩터링, 기존 QueryDSL 공간 쿼리 레포지토리 삭제
.../jobposting/facade/CarerPostingFacadeService.kt, .../jobposting/facade/CenterPostingFacadeService.kt, .../jobposting/facade/CrawlingPostingFacadeService.kt, .../jobposting/facade/CrawlingJobPostingFacadeService.kt 잡포스팅/크롤링 잡포스팅 파사드 서비스 리팩터링 및 클래스명 통일, 사용자/위치 정보 일원화, 페이징/거리 기반 검색 개선, 기존 크롤링 잡포스팅 파사드 삭제 및 신규 도입
.../user/carer/domain/CarerService.kt, .../user/center/service/domain/CenterService.kt 다중 ID로 사용자(센터/케어러) 엔티티 조회 메서드 추가
.../batch/common/launcher/CrawlingJobLauncher.kt, .../batch/job/JobConfig.kt, .../batch/step/PostingReader.kt, .../batch/step/PostingWriter.kt, .../batch/crawler/WorknetPageParser.kt, .../build.gradle.kts 배치 잡 파라미터화(day), Redis 연동, Writer/Reader/Processor 파라미터화, 잡 실행 시각 및 파라미터 변경, Redis 저장소 의존성 추가
.../presentation/batch/api/BatchApi.kt, .../presentation/batch/controller/BatchController.kt 배치 실행 API에 day 파라미터 추가
.../presentation/jobposting/controller/CarerJobPostingController.kt, .../controller/CenterJobPostingController.kt, .../controller/CrawlingJobPostingController.kt, .../jobposting/api/CrawlingJobPostingApi.kt 컨트롤러에서 사용자/위치 정보 추출 제거, 파사드 서비스 호출 방식 단순화, 크롤링 잡포스팅 요청 DTO 변경
.../transfer/chat/ChatMessageResponse.kt, .../transfer/chat/ChatMessageInfo.kt, .../transfer/chat/ChatMessageSocketResponse.kt, .../transfer/chat/ReadNoti.kt, .../transfer/chat/ReadChatMessageRequest.kt 채팅 메시지 응답/소켓/읽음 DTO 구조 변경 및 시퀀스 필드 추가, 메시지 정보 구조화, 읽음 요청 DTO 오타 수정 및 시퀀스 필드 추가
.../transfer/common/CrawlingCursorScrollRequest.kt, .../transfer/common/CrawlingScrollRequest.kt, .../transfer/common/CrawlingScrollResponse.kt 크롤링 잡포스팅 스크롤 요청/응답용 추상 클래스 및 DTO 신규 도입
.../transfer/jobposting/carer/CrawlingJobPostingScrollResponse.kt, .../transfer/jobposting/common/CrawlingJobPostingResponse.kt 크롤링 잡포스팅 응답 구조 변경, 거리 단위 및 필드 의미 변경, 파라미터/팩토리 메서드 수정
.../resources/db/migration/V4__add_device_token_index.sql, .../V5__change_chat_message_sequence.sql, .../V6__add_chat_room_unique_index.sql DB 마이그레이션: device_token 유니크 인덱스, chat_message 시퀀스 컬럼 추가 및 is_read 제거, chat_room 유니크 인덱스 추가
.../presentation/chat/config/ChatHandshakeInterceptor.kt, .../presentation/chat/config/WebSocketDisconnectListener.kt Redis 세션 관리 의존성 ChatRedisTemplate → ChatRedisRepository로 변경
.../test/kotlin/com/swm/idle/ChatTest.kt, .../test/kotlin/com/swm/idle/config/DomainTestApplication.kt, .../test/kotlin/com/swm/idle/config/EmbeddedRedisConfig.kt, .../test/kotlin/com/swm/idle/config/ProjectConfig.kt, .../test/resources/application-test.yml 테스트 관련 파일, 임베디드 Redis 설정, 테스트용 yml 등 삭제
.../application/notification/domain/DeviceTokenService.kt, .../application/notification/facade/DeviceTokenFacadeService.kt, .../domain/notification/jpa/DeviceToken.kt 디바이스 토큰 업데이트 로직 변경: userId 업데이트 → 토큰 문자열 업데이트

Sequence Diagram(s)

sequenceDiagram
    participant Client
    participant ChatSocketController
    participant ChatFacadeService
    participant ChatMessageService
    participant ChatRedisRepository
    participant ChatRoomService

    Client->>ChatSocketController: send(request, userId, isCarer)
    ChatSocketController->>ChatFacadeService: send(request, userId, isCarer)
    ChatFacadeService->>ChatRoomService: getById(chatRoomId)
    ChatFacadeService->>ChatRedisRepository: getChatRoomSequence(chatRoomId)
    ChatFacadeService->>ChatMessageService: save(request, userId, sequence)
    ChatFacadeService->>ChatRedisRepository: addUnreadChatRoom(receiverId, chatRoomId)
    ChatFacadeService->>ChatRedisRepository: updateReadSequence(chatRoomId, sequence, senderId)
    ChatFacadeService->>ChatRedisRepository: publish(ChatMessage)
    ChatFacadeService->>ChatFacadeService: sendNotification(...)
    ChatFacadeService-->>ChatSocketController: (no return)
Loading
sequenceDiagram
    participant Client
    participant ChatSocketController
    participant ChatFacadeService
    participant ChatRedisRepository

    Client->>ChatSocketController: read(request, userId, isCarer)
    ChatSocketController->>ChatFacadeService: read(request, userId, isCarer)
    ChatFacadeService->>ChatRedisRepository: removeUnreadChatRoom(userId, chatRoomId)
    ChatFacadeService->>ChatRedisRepository: updateReadSequence(chatRoomId, sequence, userId)
    ChatFacadeService->>ChatRedisRepository: publish(ReadMessage)
    ChatFacadeService-->>ChatSocketController: (no return)
Loading
sequenceDiagram
    participant Client
    participant CrawlingPostingFacadeService
    participant CrawlingJobPostingService
    participant RedisJobPostingRepository

    Client->>CrawlingPostingFacadeService: getCrawlingPostingsInRange(request)
    CrawlingPostingFacadeService->>CrawlingJobPostingService: findAllInRange(next, location, distance, limit)
    CrawlingJobPostingService->>RedisJobPostingRepository: findByLocationAndDistance(location, distance, limit, next)
    RedisJobPostingRepository-->>CrawlingJobPostingService: List<postingIds>
    CrawlingJobPostingService->>CrawlingJobPostingService: get postings by IDs, map to DTOs
    CrawlingJobPostingService-->>CrawlingPostingFacadeService: List<DTOs>
    CrawlingPostingFacadeService-->>Client: CrawlingJobPostingScrollResponse
Loading

Possibly related PRs

  • 3IDLES/idle-server#272: 채팅 송수신/읽기 메서드를 역할별로 분리했던 PR로, 본 PR은 이를 통합 및 리팩터링하여 직접적으로 코드가 겹침.
  • 3IDLES/idle-server#262: ChatMessageService의 save/read 메서드 시그니처 변경 및 기능 추가 관련 PR로, 본 PR이 해당 기능을 확장 및 리팩터링함.
  • 3IDLES/idle-server#179: 디바이스 토큰 관련 서비스 로직 변경 PR로, 본 PR의 DeviceTokenService 및 DeviceTokenFacadeService 변경과 관련됨.

Suggested labels

✨기능
"""

✨ Finishing Touches
  • 📝 Generate Docstrings

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ 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.
    • Explain this complex logic.
    • 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 explain this code block.
    • @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 explain its main purpose.
    • @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.

Support

Need help? Create a ticket on our support page for assistance with any issues or questions.

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 generate docstrings to generate docstrings for this PR.
  • @coderabbitai generate sequence diagram to generate a sequence diagram of the changes in this 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.

@mjj111 mjj111 changed the title [IDLE-577] 채팅 시스템 및 읽음 [IDLE-577] 채팅 시스템 및 크롤링 공고 조회 최적화 May 25, 2025
coderabbitai[bot]

This comment was marked as resolved.

@3IDLES 3IDLES deleted a comment from coderabbitai bot May 25, 2025
coderabbitai bot added a commit that referenced this pull request May 25, 2025
Docstrings generation was requested by @mjj111.

* #275 (comment)

The following files were modified:

* `idle-application/src/main/kotlin/com/swm/idle/application/chat/domain/ChatMessageService.kt`
* `idle-application/src/main/kotlin/com/swm/idle/application/chat/domain/ChatRoomService.kt`
* `idle-application/src/main/kotlin/com/swm/idle/application/chat/facade/ChatFacadeService.kt`
* `idle-application/src/main/kotlin/com/swm/idle/application/common/converter/PointConverter.kt`
* `idle-application/src/main/kotlin/com/swm/idle/application/jobposting/domain/CrawlingJobPostingService.kt`
* `idle-application/src/main/kotlin/com/swm/idle/application/jobposting/facade/CarerPostingFacadeService.kt`
* `idle-application/src/main/kotlin/com/swm/idle/application/jobposting/facade/CenterPostingFacadeService.kt`
* `idle-application/src/main/kotlin/com/swm/idle/application/jobposting/facade/CrawlingPostingFacadeService.kt`
* `idle-application/src/main/kotlin/com/swm/idle/application/user/carer/domain/CarerService.kt`
* `idle-application/src/main/kotlin/com/swm/idle/application/user/center/service/domain/CenterService.kt`
* `idle-batch/src/main/kotlin/com/swm/idle/batch/common/launcher/CrawlingJobLauncher.kt`
* `idle-batch/src/main/kotlin/com/swm/idle/batch/crawler/WorknetPageParser.kt`
* `idle-batch/src/main/kotlin/com/swm/idle/batch/job/JobConfig.kt`
* `idle-batch/src/main/kotlin/com/swm/idle/batch/step/PostingReader.kt`
* `idle-batch/src/main/kotlin/com/swm/idle/batch/step/PostingWriter.kt`
* `idle-domain/src/main/kotlin/com/swm/idle/domain/chat/event/ChatRedisTemplate.kt`
* `idle-domain/src/main/kotlin/com/swm/idle/domain/chat/repository/ChatMessageRepository.kt`
* `idle-domain/src/main/kotlin/com/swm/idle/domain/chat/repository/ChatRoomRepository.kt`
* `idle-domain/src/main/kotlin/com/swm/idle/domain/chat/vo/ChatRoomSummaryInfo.kt`
* `idle-domain/src/main/kotlin/com/swm/idle/domain/chat/vo/ChatRoomSummaryInfoProjection.kt`
* `idle-domain/src/main/kotlin/com/swm/idle/domain/jobposting/repository/redis/RedisJobPostingRepository.kt`
* `idle-presentation/src/main/kotlin/com/swm/idle/presentation/batch/api/BatchApi.kt`
* `idle-presentation/src/main/kotlin/com/swm/idle/presentation/batch/controller/BatchController.kt`
* `idle-presentation/src/main/kotlin/com/swm/idle/presentation/chat/api/ChatCarerApi.kt`
* `idle-presentation/src/main/kotlin/com/swm/idle/presentation/chat/api/ChatCenterApi.kt`
* `idle-presentation/src/main/kotlin/com/swm/idle/presentation/chat/controller/ChatCarerController.kt`
* `idle-presentation/src/main/kotlin/com/swm/idle/presentation/chat/controller/ChatCenterController.kt`
* `idle-presentation/src/main/kotlin/com/swm/idle/presentation/chat/controller/ChatSocketController.kt`
* `idle-presentation/src/main/kotlin/com/swm/idle/presentation/chat/handler/ChatHandler.kt`
* `idle-presentation/src/main/kotlin/com/swm/idle/presentation/jobposting/api/CrawlingJobPostingApi.kt`
* `idle-presentation/src/main/kotlin/com/swm/idle/presentation/jobposting/controller/CarerJobPostingController.kt`
* `idle-presentation/src/main/kotlin/com/swm/idle/presentation/jobposting/controller/CenterJobPostingController.kt`
* `idle-presentation/src/main/kotlin/com/swm/idle/presentation/jobposting/controller/CrawlingJobPostingController.kt`
* `idle-support/transfer/src/main/kotlin/com/swm/idle/support/transfer/jobposting/carer/CrawlingJobPostingScrollResponse.kt`
* `idle-support/transfer/src/main/kotlin/com/swm/idle/support/transfer/jobposting/common/CrawlingJobPostingResponse.kt`
@3IDLES 3IDLES deleted a comment from coderabbitai bot May 25, 2025
@3IDLES 3IDLES deleted a comment from coderabbitai bot May 25, 2025
@3IDLES 3IDLES deleted a comment from coderabbitai bot May 25, 2025
@3IDLES 3IDLES deleted a comment from coderabbitai bot May 25, 2025
@3IDLES 3IDLES deleted a comment from coderabbitai bot May 25, 2025
@3IDLES 3IDLES deleted a comment from coderabbitai bot May 25, 2025
@3IDLES 3IDLES deleted a comment from coderabbitai bot May 25, 2025
coderabbitai[bot]

This comment was marked as resolved.

@3IDLES 3IDLES deleted a comment from coderabbitai bot May 25, 2025
coderabbitai[bot]

This comment was marked as resolved.

coderabbitai[bot]

This comment was marked as resolved.

@sonarqubecloud
Copy link

coderabbitai[bot]

This comment was marked as resolved.

@mjj111 mjj111 merged commit d10fbe8 into develop May 25, 2025
7 checks passed
@mjj111 mjj111 deleted the refactor/IDLE-577 branch May 25, 2025 19:56
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