-
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-476] 웹소켓, Redis pub/sub을 이용한 채팅 전송 기능 #217
Conversation
Walkthrough이 변경 사항은 Changes
Possibly related PRs
Suggested labels
Warning Rate limit exceeded@wonjunYou has exceeded the limit for the number of commits or files that can be reviewed per hour. Please wait 2 minutes and 6 seconds before requesting another review. ⌛ How to resolve this issue?After the wait time has elapsed, a review can be triggered using the We recommend that you space out your commits to avoid hitting the rate limit. 🚦 How do rate limits work?CodeRabbit enforces hourly rate limits for each developer per organization. Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout. Please see our FAQ for further information. 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: 12
🧹 Outside diff range and nitpick comments (18)
idle-support/transfer/src/main/kotlin/com/swm/idle/support/transfer/chat/SendChatMessageRequest.kt (2)
5-7
: 문서화 및 유효성 검사 개선이 필요합니다.
다음 사항들을 고려해 주시기 바랍니다:
- 클래스와 프로퍼티에 대한 KDoc 문서화가 필요합니다.
- contents 리스트에 대한 유효성 검사가 없습니다.
- contents가 비어있는 경우에 대한 처리가 필요합니다.
다음과 같이 개선하는 것을 제안드립니다:
+/**
+ * 채팅 메시지 전송을 위한 요청 객체
+ *
+ * @property contents 전송할 채팅 메시지 내용 목록
+ */
data class SendChatMessageRequest(
+ @field:NotEmpty(message = "메시지 내용은 비어있을 수 없습니다")
val contents: List<ChatMessage.Content>,
)
추가로 필요한 import:
import javax.validation.constraints.NotEmpty
3-3
: 도메인 의존성 검토가 필요합니다.
transfer 모듈에서 직접적으로 domain 엔티티를 참조하는 것은 계층 간 결합도를 높일 수 있습니다. ChatMessage.Content를 DTO로 분리하는 것을 고려해보시기 바랍니다.
idle-application/src/main/kotlin/com/swm/idle/application/chat/event/ChatMessagePublisher.kt (2)
12-14
: 로깅 추가를 고려해보세요.
디버깅과 모니터링을 위해 메시지 발행 시점에 로깅을 추가하는 것이 좋습니다.
다음과 같이 로깅을 추가하는 것을 제안합니다:
+ private val log = LoggerFactory.getLogger(javaClass)
fun publish(chatMessage: ChatMessage) {
+ log.debug("Publishing chat message: {}", chatMessage)
eventPublisher.publishEvent(chatMessage)
+ log.debug("Successfully published chat message")
}
1-16
: 클래스 수준의 KDoc 문서화가 필요합니다.
이벤트 발행자의 역할과 사용 방법에 대한 문서화를 추가하면 좋겠습니다.
다음과 같은 문서화를 제안합니다:
/**
* 채팅 메시지 이벤트를 발행하는 컴포넌트입니다.
*
* 이 클래스는 채팅 메시지를 Spring ApplicationEvent로 발행하여
* 애플리케이션 내의 다른 컴포넌트들이 비동기적으로 처리할 수 있도록 합니다.
*
* @property eventPublisher Spring의 이벤트 발행을 위한 ApplicationEventPublisher
*/
idle-application/src/main/kotlin/com/swm/idle/application/chat/domain/ChatMessageService.kt (2)
8-9
: 클래스 문서화 필요
서비스의 역할과 책임을 명확히 하기 위해 KDoc 문서화를 추가해 주세요.
+/**
+ * 채팅 메시지 생성 및 발행을 담당하는 서비스
+ *
+ * 사용자로부터 전송된 채팅 메시지를 생성하고 발행하는 책임을 가집니다.
+ */
@Service
class ChatMessageService {
1-24
: 아키텍처 관련 제안
현재 서비스는 도메인 패키지에 위치하고 있지만, Redis 발행 책임도 함께 가지고 있습니다. SOLID 원칙을 고려하여 다음과 같은 구조 개선을 제안드립니다:
ChatMessageService
는 순수하게 메시지 생성 책임만 가지도록 합니다.- 메시지 발행은 별도의
ChatMessagePublisher
인터페이스를 만들고, Redis 구현체를 infrastruture 레이어에 둡니다.
리팩토링에 도움이 필요하시다면 관련 코드를 생성해드릴 수 있습니다. 원하시나요?
🧰 Tools
🪛 detekt
[warning] 20-22: This empty block of code can be removed.
(detekt.empty-blocks.EmptyFunctionBlock)
idle-domain/src/main/kotlin/com/swm/idle/domain/chat/event/ChatMessageRedisPublisher.kt (1)
17-17
: 로그 메시지를 더 구체적으로 개선해주세요.
현재 로그 메시지가 너무 간단합니다. 메시지 ID나 채팅방 정보와 같은 중요 정보를 포함하면 디버깅에 도움이 될 것 같습니다.
다음과 같은 로그 메시지를 제안드립니다:
-logger.info { "RedisPublisher 도달 " }
+logger.info { "채팅 메시지 발행 시작 - 메시지 ID: ${chatMessage.id}, 채팅방: ${chatMessage.roomId}" }
idle-presentation/src/main/kotlin/com/swm/idle/presentation/chat/controller/ChatMessageHandler.kt (2)
1-14
: 클래스 문서화 필요
클래스의 책임과 동작 방식에 대한 KDoc 문서화가 필요합니다. WebSocket 메시지 처리와 관련된 중요한 컴포넌트이므로, 다른 개발자들이 쉽게 이해하고 유지보수할 수 있도록 문서화가 필요합니다.
다음과 같이 KDoc을 추가해주세요:
+/**
+ * WebSocket을 통해 수신된 채팅 메시지를 처리하는 핸들러
+ *
+ * @property simpMessageSendingOperations WebSocket 메시지 브로드캐스팅을 위한 유틸리티
+ * @property chatMessageFacadeService 채팅 메시지 저장을 위한 서비스
+ */
@Controller
class ChatMessageHandler(
private val simpMessageSendingOperations: SimpMessageSendingOperations,
private val chatMessageFacadeService: ChatMessageFacadeService,
)
1-30
: 성능 모니터링 추가 고려
채팅 시스템의 성능과 안정성을 모니터링하기 위해 메트릭 수집을 고려해보시기 바랍니다.
다음과 같은 메트릭 수집을 추천드립니다:
- 메시지 처리 시간
- 메시지 처리 성공/실패율
- 채팅방별 메시지 처리량
Micrometer를 사용하여 구현하실 수 있습니다. 필요하시다면 구체적인 구현 예시를 제공해드리겠습니다.
idle-domain/src/main/kotlin/com/swm/idle/domain/chat/event/ChatMessageRedisConsumer.kt (2)
18-18
: 로거 선언 위치 개선이 필요합니다.
companion object 내부로 로거를 이동하는 것이 Kotlin 베스트 프랙티스에 더 부합합니다.
- val logger = KotlinLogging.logger {}
+ companion object {
+ private val logger = KotlinLogging.logger {}
+ }
1-30
: 동시성 처리 관련 문서화가 필요합니다.
Redis pub/sub의 메시지 처리가 다중 스레드 환경에서 어떻게 동작하는지, 그리고 이벤트 발행의 순서가 보장되는지에 대한 문서화가 필요합니다.
클래스 상단에 다음과 같은 문서화를 추가하는 것을 제안드립니다:
+/**
+ * Redis pub/sub을 통해 수신된 채팅 메시지를 처리하는 컨슈머입니다.
+ *
+ * 주의사항:
+ * 1. Redis의 메시지는 별도의 스레드 풀에서 처리됩니다.
+ * 2. 메시지 처리 순서는 수신 순서를 따르나, 이벤트 발행 후의 처리 순서는 보장되지 않습니다.
+ * 3. 실패한 메시지에 대한 재처리 로직은 구현되어 있지 않습니다.
+ */
@Component
class ChatMessageRedisConsumer(
idle-application/src/main/kotlin/com/swm/idle/application/chat/facade/ChatMessageFacadeService.kt (1)
1-35
: 아키텍처 관련 제안사항
현재 구조에서 다음과 같은 개선사항을 고려해보시면 좋을 것 같습니다:
- 메시지 발행 실패 시 재시도 메커니즘 도입
- 메시지 저장 시 비동기 처리 고려
- 채팅방 참여자 검증 로직 추가
이러한 기능들은 시스템의 안정성과 확장성을 높이는데 도움이 될 것입니다. 구체적인 구현 방안에 대해 논의가 필요하시다면 도움을 드리겠습니다.
idle-presentation/src/main/kotlin/com/swm/idle/presentation/chat/controller/ChatWebSocketController.kt (1)
1-15
: 클래스 구조 및 의존성 주입이 적절합니다.
컨트롤러의 기본 구조와 의존성 주입이 Spring 웹소켓 표준을 잘 따르고 있습니다. 하지만 API 문서화가 필요해 보입니다.
다음과 같이 클래스 레벨 문서를 추가하는 것을 추천드립니다:
+/**
+ * 웹소켓을 통한 실시간 채팅 메시지를 처리하는 컨트롤러
+ *
+ * STOMP 프로토콜을 사용하여 채팅방별 메시지 라우팅을 처리합니다.
+ */
@Controller
class ChatWebSocketController(
private val chatMessageService: ChatMessageFacadeService,
)
idle-presentation/src/main/kotlin/com/swm/idle/presentation/chat/config/WebSocketConfig.kt (2)
24-27
: 메시지 브로커 설정에 대한 문서화가 필요합니다.
설정된 prefix들의 용도와 선택 이유에 대한 설명이 있으면 좋겠습니다.
다음과 같이 문서화를 추가하는 것을 제안합니다:
override fun configureMessageBroker(registry: MessageBrokerRegistry) {
+ // /topic: 구독 기반의 브로드캐스트 메시지를 위한 prefix
registry.enableSimpleBroker("/topic")
+ // /app: 클라이언트에서 서버로의 메시지 전송을 위한 prefix
registry.setApplicationDestinationPrefixes("/app")
}
1-29
: 아키텍처 관련 제안사항이
현재 Simple Broker를 사용하고 있는데, 프로덕션 환경에서는 다음 사항들을 고려해보시기 바랍니다:
- 확장성을 위해 RabbitMQ나 ActiveMQ와 같은 외부 메시지 브로커 도입 검토
- 연결 상태 모니터링과 에러 처리 전략 수립
- WebSocket 세션 관리 정책 수립
idle-domain/src/main/kotlin/com/swm/idle/domain/chat/config/ChatMessageRedisConfig.kt (2)
30-33
: 채널 토픽 상수의 의미를 더 명확하게 표현하면 좋을 것 같습니다.
현재 "chat_message"라는 상수명이 다소 일반적입니다. 시스템 내에서의 용도나 목적을 더 잘 표현할 수 있을 것 같습니다.
상수명을 다음과 같이 변경하는 것을 고려해보세요:
-const val CHAT_MESSAGE = "chat_message"
+const val CHAT_MESSAGE_CHANNEL = "idle:chat:message:channel"
35-39
: 상수에 대한 문서화가 필요합니다.
companion object 내의 상수에 대한 설명이 없어 용도 파악이 어렵습니다.
KDoc 문서를 추가하는 것을 추천드립니다:
companion object {
+ /**
+ * Redis pub/sub 채널명
+ * 채팅 메시지 전송을 위한 채널을 식별하는 상수입니다.
+ */
const val CHAT_MESSAGE = "chat_message"
}
idle-domain/src/main/kotlin/com/swm/idle/domain/common/config/RedisConfig.kt (1)
Redis 보안 설정 강화가 필요합니다
현재 Redis 구성에서 다음과 같은 보안 취약점이 발견되었습니다:
- SSL/TLS 암호화가 설정되어 있지 않아 데이터가 평문으로 전송됩니다
- Redis 접속 정보가 기본 설정값(localhost:6379)을 사용하고 있습니다
- Redis 패스워드가 단순한 문자열('redis')로 설정되어 있습니다
권장 조치사항:
- SSL/TLS 암호화 설정 추가
- 운영 환경에서는 기본 포트(6379) 대신 사용자 지정 포트 사용
- 강력한 패스워드 정책 적용 (최소 길이, 복잡도 등)
- IP 화이트리스트 설정 검토
🔗 Analysis chain
Line range hint 1-50
: Redis 보안 설정 검증이 필요합니다
현재 구성에서 Redis 연결의 보안 설정을 확인해야 합니다.
다음 스크립트로 Redis 보안 설정을 확인하겠습니다:
Let me check the Redis configuration in the application-domain.yml file:
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Redis 보안 관련 설정 확인
echo "Checking Redis security configurations..."
# Redis 속성 파일 검색
fd --type f "application.*properties|application.*yml" --exec grep -l "redis" {} \;
# SSL/TLS 설정 확인
rg -l "ssl|tls|lettuce.*ssl"
Length of output: 335
Script:
#!/bin/bash
# Redis 설정 파일 내용 확인
cat ./idle-domain/src/main/resources/application-domain.yml
# Redis 관련 보안 설정 검색
rg -i "redis.*security|redis.*ssl|redis.*tls" ./idle-domain/src/main/resources/
Length of output: 1064
📜 Review details
Configuration used: .coderabbit.yaml
Review profile: CHILL
📒 Files selected for processing (14)
- gradle/libs.versions.toml (1 hunks)
- idle-application/src/main/kotlin/com/swm/idle/application/chat/domain/ChatMessageService.kt (1 hunks)
- idle-application/src/main/kotlin/com/swm/idle/application/chat/event/ChatMessagePublisher.kt (1 hunks)
- idle-application/src/main/kotlin/com/swm/idle/application/chat/facade/ChatMessageFacadeService.kt (1 hunks)
- idle-application/src/main/kotlin/com/swm/idle/application/chat/facade/ChatRoomFacadeService.kt (1 hunks)
- idle-domain/src/main/kotlin/com/swm/idle/domain/chat/config/ChatMessageRedisConfig.kt (1 hunks)
- idle-domain/src/main/kotlin/com/swm/idle/domain/chat/event/ChatMessageRedisConsumer.kt (1 hunks)
- idle-domain/src/main/kotlin/com/swm/idle/domain/chat/event/ChatMessageRedisPublisher.kt (1 hunks)
- idle-domain/src/main/kotlin/com/swm/idle/domain/common/config/RedisConfig.kt (3 hunks)
- idle-presentation/build.gradle.kts (1 hunks)
- idle-presentation/src/main/kotlin/com/swm/idle/presentation/chat/config/WebSocketConfig.kt (1 hunks)
- idle-presentation/src/main/kotlin/com/swm/idle/presentation/chat/controller/ChatMessageHandler.kt (1 hunks)
- idle-presentation/src/main/kotlin/com/swm/idle/presentation/chat/controller/ChatWebSocketController.kt (1 hunks)
- idle-support/transfer/src/main/kotlin/com/swm/idle/support/transfer/chat/SendChatMessageRequest.kt (1 hunks)
🧰 Additional context used
🪛 detekt
idle-application/src/main/kotlin/com/swm/idle/application/chat/domain/ChatMessageService.kt
[warning] 20-22: This empty block of code can be removed.
(detekt.empty-blocks.EmptyFunctionBlock)
idle-application/src/main/kotlin/com/swm/idle/application/chat/facade/ChatRoomFacadeService.kt
[warning] 6-7: The class or object ChatRoomFacadeService is empty.
(detekt.empty-blocks.EmptyClassBlock)
🔇 Additional comments (12)
idle-application/src/main/kotlin/com/swm/idle/application/chat/event/ChatMessagePublisher.kt (1)
7-10
: 기본 구현이 잘 되어있습니다.
Spring의 이벤트 발행 패턴을 잘 따르고 있으며, 의존성 주입이 올바르게 구현되어 있습니다.
idle-application/src/main/kotlin/com/swm/idle/application/chat/domain/ChatMessageService.kt (1)
20-22
:
미구현된 publish 메서드
PR의 목적이 Redis pub/sub을 이용한 채팅 전송 기능 구현인데, publish 메서드가 비어있습니다. 메시지 발행 로직을 구현해주세요.
Redis 발행 구현 여부를 확인하기 위해 관련 코드를 검색합니다:
🧰 Tools
🪛 detekt
[warning] 20-22: This empty block of code can be removed.
(detekt.empty-blocks.EmptyFunctionBlock)
idle-domain/src/main/kotlin/com/swm/idle/domain/chat/event/ChatMessageRedisPublisher.kt (1)
9-12
: 의존성 주입 방식이 적절합니다.
생성자 기반 의존성 주입을 사용하여 RedisTemplate
을 주입받고 있어 좋습니다. 불변성을 보장하고 테스트하기 쉬운 구조입니다.
idle-presentation/build.gradle.kts (1)
16-16
: WebSocket 의존성 추가가 적절히 이루어졌습니다.
WebSocket 기능 구현을 위한 필수 의존성이 올바르게 추가되었습니다. 다만, STOMP나 SockJS와 같은 추가적인 WebSocket 관련 기능이 필요한지 검토해보시기 바랍니다.
다음 스크립트를 실행하여 현재 프로젝트의 WebSocket 관련 의존성을 확인해보세요:
✅ Verification successful
WebSocket 의존성이 적절하게 구성되어 있습니다.
Spring Boot WebSocket 스타터 의존성이 버전 카탈로그에 올바르게 정의되어 있으며, 기본적인 WebSocket 기능 구현에 필요한 모든 의존성이 포함되어 있습니다. STOMP나 SockJS는 이 스타터 패키지에 이미 포함되어 있으므로 추가 의존성이 필요하지 않습니다.
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# WebSocket 관련 의존성 검사
rg -l "websocket|stomp|sockjs" gradle/
Length of output: 66
Script:
#!/bin/bash
# Check the content of libs.versions.toml for WebSocket dependencies
cat gradle/libs.versions.toml
Length of output: 7016
idle-domain/src/main/kotlin/com/swm/idle/domain/chat/event/ChatMessageRedisConsumer.kt (1)
12-16
: 의존성 주입 및 클래스 구조가 적절합니다.
클래스의 책임이 명확하고 필요한 의존성이 적절하게 주입되어 있습니다.
idle-application/src/main/kotlin/com/swm/idle/application/chat/facade/ChatMessageFacadeService.kt (2)
11-14
: 의존성 주입 및 클래스 구조가 적절합니다.
클래스의 책임이 명확하고 의존성 주입이 잘 구현되어 있습니다.
31-33
: 메시지 저장 로직 구현이 필요합니다.
현재 TODO 주석만 있는 상태입니다. 메시지 저장은 중요한 기능이므로 우선순위를 두고 구현이 필요합니다.
메시지 저장 로직 구현을 도와드릴까요? 다음 사항들을 고려한 구현을 제안드릴 수 있습니다:
- 트랜잭션 관리
- 저장 실패 시 예외 처리
- 성능을 고려한 배치 처리
idle-presentation/src/main/kotlin/com/swm/idle/presentation/chat/controller/ChatWebSocketController.kt (1)
17-28
:
보안 및 유효성 검증이 필요합니다.
현재 구현에는 몇 가지 중요한 보안 및 안정성 이슈가 있습니다:
- 인증되지 않은 임의의 UUID 사용
- 메시지 내용 유효성 검증 부재
- 예외 처리 부재
다음과 같은 개선을 제안드립니다:
@MessageMapping("/chat-rooms/{roomId}")
@SendTo("/topic/chat-rooms/{roomId}")
fun sendTextMessage(
@DestinationVariable roomId: UUID,
request: SendChatMessageRequest,
+ principal: Principal,
) {
+ require(request.contents.isNotBlank()) { "메시지 내용은 비어있을 수 없습니다" }
+
chatMessageService.sendTextMessage(
roomId = roomId,
- senderId = UuidCreator.create(), // TODO: 토큰 인증 구현
+ senderId = UUID.fromString(principal.name),
contents = request.contents,
)
}
웹소켓 보안 설정이 되어있는지 확인이 필요합니다:
idle-presentation/src/main/kotlin/com/swm/idle/presentation/chat/config/WebSocketConfig.kt (1)
9-11
: 클래스 구성이 적절합니다.
WebSocket 메시지 브로커 구성을 위한 적절한 어노테이션과 인터페이스가 사용되었습니다.
idle-domain/src/main/kotlin/com/swm/idle/domain/chat/config/ChatMessageRedisConfig.kt (1)
1-10
: 패키지 구조와 임포트가 잘 구성되어 있습니다!
도메인 계층에 적절히 위치해 있으며, Redis 관련 필수 임포트들이 잘 정리되어 있습니다.
idle-domain/src/main/kotlin/com/swm/idle/domain/common/config/RedisConfig.kt (1)
3-5
: 새로운 직렬화 의존성 추가 검토 완료
Jackson 모듈과 Redis 직렬화 관련 의존성이 적절하게 추가되었습니다.
Also applies to: 16-17
gradle/libs.versions.toml (1)
78-78
: WebSocket 의존성 추가가 적절합니다!
WebSocket과 Redis pub/sub을 이용한 채팅 기능 구현에 필요한 spring-boot-starter-websocket
의존성이 올바르게 추가되었습니다.
의존성이 실제로 사용되는지 확인하기 위해 다음 스크립트를 실행합니다:
✅ Verification successful
WebSocket 의존성이 적절하게 구현되어 있습니다!
spring-boot-starter-websocket
의존성이 다음과 같이 올바르게 활용되고 있음을 확인했습니다:
WebSocketConfig
클래스에서 STOMP 메시지 브로커 설정 구현/websocket
엔드포인트 설정 완료ChatWebSocketController
를 통한 WebSocket 기능 구현
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Description: WebSocket 관련 클래스들이 프로젝트에서 사용되는지 확인
# WebSocket 설정 및 컨트롤러 클래스 검색
echo "WebSocket 관련 클래스 사용 확인:"
rg -l "import org.springframework.web.socket"
Length of output: 195
Script:
#!/bin/bash
# WebSocketConfig 클래스의 구현 내용 확인
echo "WebSocketConfig 구현 확인:"
rg "class WebSocketConfig" -A 10 idle-presentation/src/main/kotlin/com/idle/presentation/chat/config/WebSocketConfig.kt
# WebSocket 엔드포인트나 핸들러 검색
echo -e "\nWebSocket 핸들러/컨트롤러 검색:"
rg "implements (WebSocketHandler|WebSocketConfigurer)"
# build.gradle.kts 파일에서 websocket 의존성 사용 확인
echo -e "\nbuild.gradle.kts 의존성 확인:"
fd build.gradle.kts --exec rg "websocket"
Length of output: 583
Script:
#!/bin/bash
# 정확한 WebSocketConfig 파일 위치 찾기
echo "WebSocketConfig 파일 검색:"
fd WebSocketConfig.kt
# 찾은 파일의 내용 확인
echo -e "\nWebSocket 관련 모든 파일 내용 검색:"
rg -l "WebSocket|websocket" --type kotlin
# 발견된 파일들의 내용 표시
echo -e "\n각 파일의 WebSocket 관련 코드:"
rg "WebSocket|websocket" -B 2 -A 2 --type kotlin
Length of output: 4262
idle-application/src/main/kotlin/com/swm/idle/application/chat/domain/ChatMessageService.kt
Show resolved
Hide resolved
idle-domain/src/main/kotlin/com/swm/idle/domain/chat/event/ChatMessageRedisPublisher.kt
Show resolved
Hide resolved
idle-domain/src/main/kotlin/com/swm/idle/domain/chat/event/ChatMessageRedisPublisher.kt
Show resolved
Hide resolved
...presentation/src/main/kotlin/com/swm/idle/presentation/chat/controller/ChatMessageHandler.kt
Show resolved
Hide resolved
idle-domain/src/main/kotlin/com/swm/idle/domain/chat/event/ChatMessageRedisConsumer.kt
Show resolved
Hide resolved
idle-presentation/src/main/kotlin/com/swm/idle/presentation/chat/config/WebSocketConfig.kt
Outdated
Show resolved
Hide resolved
idle-domain/src/main/kotlin/com/swm/idle/domain/chat/config/ChatMessageRedisConfig.kt
Show resolved
Hide resolved
idle-domain/src/main/kotlin/com/swm/idle/domain/chat/config/ChatMessageRedisConfig.kt
Show resolved
Hide resolved
idle-domain/src/main/kotlin/com/swm/idle/domain/common/config/RedisConfig.kt
Show resolved
Hide resolved
idle-domain/src/main/kotlin/com/swm/idle/domain/common/config/RedisConfig.kt
Outdated
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: 18
🧹 Outside diff range and nitpick comments (12)
idle-support/transfer/src/main/kotlin/com/swm/idle/support/transfer/chat/SendChatMessageRequest.kt (1)
3-3
: 도메인 의존성 검토 필요
transfer 모듈이 domain 모듈의 엔티티를 직접 참조하는 것이 적절한지 검토가 필요합니다. DTO를 별도로 만들어 계층간 의존성을 분리하는 것을 고려해보세요.
idle-application/src/main/kotlin/com/swm/idle/application/chat/domain/ChatMessageService.kt (2)
8-9
: 클래스 문서화 필요
서비스의 책임과 역할을 명확히 하기 위해 KDoc 문서를 추가해 주세요.
+/**
+ * 채팅 메시지 생성 및 발행을 담당하는 서비스
+ */
@Service
class ChatMessageService {
1-24
: 테스트 코드 작성 필요
서비스 클래스에 대한 단위 테스트가 필요합니다. 다음 시나리오들에 대한 테스트가 포함되어야 합니다:
- 정상적인 메시지 생성
- 빈 contents로 메시지 생성 시도
- 메시지 발행 성공/실패
테스트 코드 작성을 도와드릴까요?
🧰 Tools
🪛 detekt
[warning] 20-22: This empty block of code can be removed.
(detekt.empty-blocks.EmptyFunctionBlock)
idle-domain/src/main/kotlin/com/swm/idle/domain/chat/event/ChatMessageRedisPublisher.kt (1)
14-14
: 로깅 메시지 개선이 필요합니다.
현재 로그 메시지가 너무 간단합니다. 채팅 메시지의 주요 정보(예: 메시지 ID, 발신자)를 포함하도록 개선하면 디버깅과 모니터링에 도움이 될 것 같습니다.
- logger.info { "RedisPublisher 도달 " }
+ logger.info { "채팅 메시지 발행: messageId=${chatMessage.id}, sender=${chatMessage.sender}" }
Also applies to: 17-18
idle-presentation/src/main/kotlin/com/swm/idle/presentation/chat/controller/ChatMessageHandler.kt (1)
1-30
: 테스트 코드 작성이 필요합니다.
WebSocket 메시지 처리는 중요한 기능이므로, 다음 시나리오에 대한 테스트 코드 작성을 권장드립니다:
- 정상적인 메시지 처리
- 잘못된 형식의 메시지 처리
- 네트워크 오류 상황
- 동시에 많은 메시지가 전송되는 상황
테스트 코드 작성에 도움이 필요하시다면 말씀해 주세요.
idle-domain/src/main/kotlin/com/swm/idle/domain/chat/event/ChatMessageRedisConsumer.kt (2)
1-30
: 성능 최적화 및 모니터링 개선이 필요합니다.
Redis pub/sub을 사용하는 시스템에서 중요한 몇 가지 고려사항이 있습니다:
- 메시지 처리 지연 모니터링
- 처리량 측정
- 백프레셔(backpressure) 처리
다음과 같은 개선사항을 제안드립니다:
- 메트릭 수집 추가:
@Autowired
private lateinit var meterRegistry: MeterRegistry
private val messageProcessingTimer = Timer.builder("chat.message.processing")
.description("메시지 처리 시간")
.register(meterRegistry)
- 처리량 제한을 위한 설정 추가:
@Value("\${chat.consumer.rate-limit:1000}")
private val rateLimit: Int
private val rateLimiter = RateLimiter.create(rateLimit.toDouble())
이러한 변경사항들을 적용하시겠습니까?
1-30
: 테스트 코드 작성이 필요합니다.
현재 파일에 대한 단위 테스트가 보이지 않습니다. Redis 메시지 처리는 중요한 기능이므로 철저한 테스트가 필요합니다.
다음과 같은 테스트 시나리오를 포함하는 테스트 코드를 작성해드릴까요?
- 정상적인 메시지 처리
- 잘못된 형식의 메시지 처리
- 빈 메시지 처리
- 이벤트 발행 실패 시나리오
idle-presentation/src/main/kotlin/com/swm/idle/presentation/chat/config/WebSocketConfig.kt (2)
9-11
: 클래스 문서화 필요
WebSocket 설정의 목적과 사용 방법에 대한 KDoc 문서화가 필요합니다.
다음과 같이 문서를 추가하는 것을 제안합니다:
+/**
+ * WebSocket 메시징을 위한 설정 클래스
+ *
+ * STOMP 프로토콜을 사용하여 클라이언트-서버 간 실시간 통신을 구성합니다.
+ * - 엔드포인트: /websocket
+ * - 구독 프리픽스: /topic
+ * - 메시지 전송 프리픽스: /app
+ */
@Configuration
@EnableWebSocketMessageBroker
class WebSocketConfig : WebSocketMessageBrokerConfigurer {
24-27
: 메시지 브로커 설정 개선 필요
현재 설정은 기본적인 인메모리 브로커를 사용하고 있습니다. 프로덕션 환경에서는 다음 사항들을 고려해야 합니다:
- 메시지 크기 제한
- 버퍼 크기 설정
- 하트비트 설정
다음과 같은 설정을 추가하는 것을 제안합니다:
override fun configureMessageBroker(registry: MessageBrokerRegistry) {
- registry.enableSimpleBroker("/topic")
+ registry.enableSimpleBroker("/topic")
+ .setHeartbeatValue(long[]{10000, 10000})
+ .setTaskScheduler(heartBeatScheduler())
registry.setApplicationDestinationPrefixes("/app")
+ registry.setUserDestinationPrefix("/user")
}
+
+ @Bean
+ fun heartBeatScheduler(): TaskScheduler {
+ return ThreadPoolTaskScheduler().apply {
+ poolSize = 1
+ threadNamePrefix = "ws-heartbeat-"
+ initialize()
+ }
+ }
idle-domain/src/main/kotlin/com/swm/idle/domain/chat/config/ChatMessageRedisConfig.kt (2)
25-28
: 메시지 리스너 어댑터 설정 보완 필요
현재 구현에서는 기본 핸들러 메소드 이름을 지정하지 않았습니다. ChatMessageRedisConsumer의 메시지 처리 메소드가 'handleMessage'가 아닌 경우 동작하지 않을 수 있습니다.
다음과 같이 명시적으로 핸들러 메소드를 지정하는 것이 좋습니다:
@Bean
fun messageListenerAdapter(chatMessageRedisConsumer: ChatMessageRedisConsumer): MessageListenerAdapter {
- return MessageListenerAdapter(chatMessageRedisConsumer)
+ return MessageListenerAdapter(chatMessageRedisConsumer, "onMessage")
}
30-33
: 채널 토픽 설정에 대한 문서화 제안
채널 토픽 설정이 명확하지만, 다른 개발자들을 위한 문서화가 필요합니다.
다음과 같이 KDoc을 추가하는 것이 좋습니다:
+/**
+ * Redis 채팅 메시지를 구독하기 위한 채널 토픽을 생성합니다.
+ * 채널명은 companion object에 정의된 CHAT_MESSAGE 상수를 사용합니다.
+ *
+ * @return 채팅 메시지용 ChannelTopic 인스턴스
+ */
@Bean
fun chatChannelTopic(): ChannelTopic {
return ChannelTopic(CHAT_MESSAGE)
}
idle-domain/src/main/kotlin/com/swm/idle/domain/common/config/RedisConfig.kt (1)
38-50
: 성능 최적화 고려사항
Redis 템플릿과 ObjectMapper가 매번 새로운 인스턴스를 생성하지 않도록 주의가 필요합니다.
다음 사항들을 고려해주세요:
- GenericJackson2JsonRedisSerializer 인스턴스를 재사용할 수 있도록 클래스 레벨 상수로 분리
- 대량의 채팅 메시지 처리 시 Redis connection pool 설정 최적화
- 메시지 캐싱 전략 수립 필요
📜 Review details
Configuration used: .coderabbit.yaml
Review profile: CHILL
📒 Files selected for processing (14)
- gradle/libs.versions.toml (1 hunks)
- idle-application/src/main/kotlin/com/swm/idle/application/chat/domain/ChatMessageService.kt (1 hunks)
- idle-application/src/main/kotlin/com/swm/idle/application/chat/event/ChatMessagePublisher.kt (1 hunks)
- idle-application/src/main/kotlin/com/swm/idle/application/chat/facade/ChatMessageFacadeService.kt (1 hunks)
- idle-application/src/main/kotlin/com/swm/idle/application/chat/facade/ChatRoomFacadeService.kt (1 hunks)
- idle-domain/src/main/kotlin/com/swm/idle/domain/chat/config/ChatMessageRedisConfig.kt (1 hunks)
- idle-domain/src/main/kotlin/com/swm/idle/domain/chat/event/ChatMessageRedisConsumer.kt (1 hunks)
- idle-domain/src/main/kotlin/com/swm/idle/domain/chat/event/ChatMessageRedisPublisher.kt (1 hunks)
- idle-domain/src/main/kotlin/com/swm/idle/domain/common/config/RedisConfig.kt (3 hunks)
- idle-presentation/build.gradle.kts (1 hunks)
- idle-presentation/src/main/kotlin/com/swm/idle/presentation/chat/config/WebSocketConfig.kt (1 hunks)
- idle-presentation/src/main/kotlin/com/swm/idle/presentation/chat/controller/ChatMessageHandler.kt (1 hunks)
- idle-presentation/src/main/kotlin/com/swm/idle/presentation/chat/controller/ChatWebSocketController.kt (1 hunks)
- idle-support/transfer/src/main/kotlin/com/swm/idle/support/transfer/chat/SendChatMessageRequest.kt (1 hunks)
🧰 Additional context used
🪛 detekt
idle-application/src/main/kotlin/com/swm/idle/application/chat/domain/ChatMessageService.kt
[warning] 20-22: This empty block of code can be removed.
(detekt.empty-blocks.EmptyFunctionBlock)
idle-application/src/main/kotlin/com/swm/idle/application/chat/facade/ChatRoomFacadeService.kt
[warning] 6-7: The class or object ChatRoomFacadeService is empty.
(detekt.empty-blocks.EmptyClassBlock)
🔇 Additional comments (11)
idle-application/src/main/kotlin/com/swm/idle/application/chat/event/ChatMessagePublisher.kt (1)
1-6
: 코드 구조가 깔끔하고 명확합니다
단일 책임 원칙을 잘 준수하고 있으며, Spring의 이벤트 발행 메커니즘을 적절히 활용하고 있습니다.
idle-domain/src/main/kotlin/com/swm/idle/domain/chat/event/ChatMessageRedisPublisher.kt (1)
19-19
: Redis 채널 상수 검증이 필요합니다.
ChatMessageRedisConfig.CHAT_MESSAGE
상수가 올바르게 설정되어 있는지 확인이 필요합니다.
✅ Verification successful
Let's gather more information about the CHAT_MESSAGE constant and its usage.
Let's check how this Redis channel is being used across the codebase.
Let's try one more search to see the complete context of Redis configuration and usage.
Redis 채널 상수가 정상적으로 설정되어 있습니다.
ChatMessageRedisConfig.CHAT_MESSAGE
상수는 chat_message
로 올바르게 정의되어 있으며, Redis 발행자(Publisher)에서 적절하게 사용되고 있습니다. 설정에 문제가 없습니다.
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# ChatMessageRedisConfig의 채널 설정 확인
rg -l "CHAT_MESSAGE.*=" --type kotlin
Length of output: 192
Script:
#!/bin/bash
# Check the content of files containing CHAT_MESSAGE
rg "CHAT_MESSAGE.*=" -A 5 --type kotlin
Length of output: 795
Script:
#!/bin/bash
# Check Redis channel usage
rg "CHAT_MESSAGE\"" -B 2 -A 2 --type kotlin
Length of output: 44
Script:
#!/bin/bash
# Check the complete ChatMessageRedisConfig file and its usage
rg "ChatMessageRedisConfig" -B 2 -A 2 --type kotlin
Length of output: 1773
idle-presentation/build.gradle.kts (1)
16-16
: WebSocket 의존성 추가가 적절히 이루어졌습니다.
WebSocket 기능 구현을 위한 필수 의존성이 올바르게 추가되었습니다.
버전 카탈로그에 의존성이 올바르게 정의되어 있는지 확인하겠습니다:
✅ Verification successful
WebSocket 의존성이 버전 카탈로그에 올바르게 정의되어 있습니다.
gradle/libs.versions.toml 파일에서 spring-boot-starter-websocket 의존성이 spring-boot 버전 참조와 함께 정확하게 정의되어 있음을 확인했습니다.
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Description: gradle/libs.versions.toml 파일에서 websocket 의존성 정의를 확인합니다.
# Test: websocket 의존성 정의 확인
rg "spring-boot-starter-websocket" gradle/libs.versions.toml
Length of output: 200
idle-presentation/src/main/kotlin/com/swm/idle/presentation/chat/controller/ChatMessageHandler.kt (2)
10-14
: 의존성 주입 방식이 적절합니다.
생성자 기반 의존성 주입을 사용하여 컴포넌트 결합도를 낮추고 테스트 용이성을 향상시켰습니다.
1-30
: 동시성 처리에 대한 검토가 필요합니다.
WebSocket 환경에서 다수의 메시지가 동시에 처리될 수 있으므로, 동시성 관련 고려사항을 검토해주시기 바랍니다.
다음 스크립트로 동시성 관련 코드를 확인하겠습니다:
✅ Verification successful
Let me gather more information about the chat message implementation to verify the concurrency concerns.
Let me check the Redis publisher and chat message service implementation for better understanding of the concurrency handling.
Let me check the Redis configuration to understand how the message handling is set up.
Let me check the Redis consumer implementation to complete the analysis.
현재 구현된 동시성 처리는 적절합니다
현재 구현은 Redis Pub/Sub 패턴을 활용하여 메시지를 처리하고 있습니다:
- Redis의 메시지 브로커를 통한 비동기 처리로 동시성 문제를 해결하고 있습니다
- ChatMessageRedisPublisher가 메시지를 Redis에 발행하면, Redis가 메시지 큐잉을 담당합니다
- ChatMessageRedisConsumer가 메시지를 순차적으로 소비하여 ApplicationEvent로 변환합니다
- Spring의 이벤트 시스템이 최종적으로 메시지를 처리합니다
추가 고려사항:
- saveMessage() 메서드가 아직 TODO 상태이므로, 구현 시 @transactional 어노테이션 추가를 권장합니다
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# ChatMessageFacadeService의 구현을 확인하여 동시성 처리 방식 검증
ast-grep --pattern 'class ChatMessageFacadeService {
$$$
}'
# 트랜잭션 관련 설정 확인
rg -l "@Transactional"
Length of output: 2178
Script:
#!/bin/bash
# Check ChatMessageFacadeService implementation in application layer
fd ChatMessageFacadeService.kt --exec cat {}
# Check ChatMessage related repository implementations
fd ChatMessageRepository.kt --exec cat {}
# Check if there are any concurrent collections or synchronization mechanisms used
rg -l "synchronized|ConcurrentHashMap|AtomicReference|@Synchronized"
Length of output: 1133
Script:
#!/bin/bash
# Check Redis publisher implementation
fd ChatMessageRedisPublisher.kt --exec cat {}
# Check chat message service implementation
fd ChatMessageService.kt --exec cat {}
# Check if there are any Redis configurations
rg -l "RedisTemplate|StringRedisTemplate|RedisConnectionFactory"
Length of output: 1646
Script:
#!/bin/bash
# Check Redis configurations
fd ChatMessageRedisConfig.kt --exec cat {}
fd RedisConfig.kt --exec cat {}
# Check if there are any message listeners
rg -l "MessageListener|@EventListener"
Length of output: 5498
Script:
#!/bin/bash
# Check Redis consumer implementation
fd ChatMessageRedisConsumer.kt --exec cat {}
# Check if there are any repository implementations for chat messages
rg -l "ChatMessageRepository|JpaRepository.*ChatMessage"
Length of output: 1089
idle-domain/src/main/kotlin/com/swm/idle/domain/chat/event/ChatMessageRedisConsumer.kt (1)
12-16
: 의존성 주입 및 컴포넌트 구조가 적절합니다.
Spring의 컴포넌트로 올바르게 구성되어 있으며, 필요한 의존성들이 생성자를 통해 적절히 주입되고 있습니다.
idle-application/src/main/kotlin/com/swm/idle/application/chat/facade/ChatMessageFacadeService.kt (1)
31-33
: 메시지 저장 구현이 필요합니다.
현재 TODO 주석만 있는 상태입니다. 다음 사항들을 고려하여 구현해주세요:
- 메시지 영속성 보장
- 트랜잭션 처리
- 실패 시 재시도 메커니즘
구현에 도움이 필요하시다면 상세한 구현 방안을 제시해드릴 수 있습니다.
idle-presentation/src/main/kotlin/com/swm/idle/presentation/chat/controller/ChatWebSocketController.kt (2)
1-15
: 의존성 주입 및 컨트롤러 구조가 적절합니다.
컨트롤러의 기본 구조와 의존성 주입이 잘 구현되어 있습니다.
17-22
: WebSocket 메시지 매핑이 명확하게 구현되었습니다.
@MessageMapping
과 @SendTo
어노테이션을 통한 메시지 라우팅이 잘 구성되어 있습니다.
idle-domain/src/main/kotlin/com/swm/idle/domain/chat/config/ChatMessageRedisConfig.kt (1)
1-12
: 구조가 깔끔하고 적절합니다!
클래스 구조와 import 문이 잘 정리되어 있으며, Spring Configuration 클래스로서의 역할이 명확합니다.
gradle/libs.versions.toml (1)
78-78
: WebSocket 의존성 추가가 적절히 이루어졌습니다.
spring-boot-starter-websocket 의존성이 기존 spring-boot 버전(3.2.4)을 올바르게 참조하고 있으며, 채팅 기능 구현을 위한 필수적인 의존성이 정상적으로 추가되었습니다.
의존성 버전 호환성을 확인하기 위해 다음 스크립트를 실행합니다:
✅ Verification successful
WebSocket 의존성 추가와 설정이 정상적으로 확인되었습니다.
WebSocket 설정이 Spring Boot 3.2.4 버전과 완벽하게 호환되며, WebSocketConfig 클래스에서 STOMP 프로토콜과 메시지 브로커가 올바르게 구성되어 있습니다. 의존성 추가가 적절히 이루어졌음을 확인했습니다.
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Description: WebSocket 의존성과 관련된 spring-boot 버전 호환성 검증
# spring-boot 버전 확인
rg "spring-boot = "
# WebSocket 관련 설정 파일 검색
fd -e kt -e java "WebSocket.*Config"
Length of output: 304
Script:
#!/bin/bash
# WebSocketConfig 파일의 내용 확인
cat idle-presentation/src/main/kotlin/com/swm/idle/presentation/chat/config/WebSocketConfig.kt
# spring-boot-starter-websocket 의존성을 사용하는 build.gradle.kts 파일 검색
rg "spring-boot-starter-websocket"
Length of output: 1329
...upport/transfer/src/main/kotlin/com/swm/idle/support/transfer/chat/SendChatMessageRequest.kt
Show resolved
Hide resolved
idle-application/src/main/kotlin/com/swm/idle/application/chat/event/ChatMessagePublisher.kt
Outdated
Show resolved
Hide resolved
idle-application/src/main/kotlin/com/swm/idle/application/chat/domain/ChatMessageService.kt
Outdated
Show resolved
Hide resolved
idle-application/src/main/kotlin/com/swm/idle/application/chat/domain/ChatMessageService.kt
Show resolved
Hide resolved
idle-domain/src/main/kotlin/com/swm/idle/domain/chat/event/ChatMessageRedisPublisher.kt
Show resolved
Hide resolved
idle-domain/src/main/kotlin/com/swm/idle/domain/chat/config/ChatMessageRedisConfig.kt
Show resolved
Hide resolved
idle-domain/src/main/kotlin/com/swm/idle/domain/chat/config/ChatMessageRedisConfig.kt
Show resolved
Hide resolved
idle-domain/src/main/kotlin/com/swm/idle/domain/common/config/RedisConfig.kt
Show resolved
Hide resolved
idle-domain/src/main/kotlin/com/swm/idle/domain/common/config/RedisConfig.kt
Outdated
Show resolved
Hide resolved
idle-domain/src/main/kotlin/com/swm/idle/domain/common/config/RedisConfig.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: 0
🧹 Outside diff range and nitpick comments (1)
idle-domain/src/main/kotlin/com/swm/idle/domain/common/config/RedisConfig.kt (1)
51-54
: ObjectMapper 설정 보완 필요채팅 시스템의 안정성을 위해 다음과 같은 추가 설정을 권장드립니다:
private val objectMapper = ObjectMapper().apply { registerModule(KotlinModule.Builder().build()) registerModule(JavaTimeModule()) enable(JsonReadFeature.ALLOW_UNESCAPED_CONTROL_CHARS.mappedFeature()) + // 알 수 없는 속성 처리 + configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false) + // 날짜/시간 처리 + configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false) + // 채팅 메시지 인코딩 + configure(JsonGenerator.Feature.ESCAPE_NON_ASCII, true) }
📜 Review details
Configuration used: .coderabbit.yaml
Review profile: CHILL
📒 Files selected for processing (1)
idle-domain/src/main/kotlin/com/swm/idle/domain/common/config/RedisConfig.kt
(3 hunks)
🔇 Additional comments (2)
idle-domain/src/main/kotlin/com/swm/idle/domain/common/config/RedisConfig.kt (2)
3-6
: JavaTimeModule 의존성 검증 필요
JavaTimeModule을 사용하기 위해서는 jackson-datatype-jsr310
의존성이 필요합니다. build.gradle.kts 파일에 해당 의존성이 추가되어 있는지 확인해 주세요.
#!/bin/bash
# jackson-datatype-jsr310 의존성 확인
rg -g "build.gradle*" "jackson-datatype-jsr310"
39-49
:
Null 안전성 개선 필요
RedisConnectionFactory의 강제 언래핑(!!
)은 위험할 수 있습니다. 다음과 같이 더 안전한 방식으로 처리하는 것을 권장드립니다:
-fun redisTemplate(redisConnectionFactory: RedisConnectionFactory?): RedisTemplate<String, Any> {
+fun redisTemplate(redisConnectionFactory: RedisConnectionFactory): RedisTemplate<String, Any> {
val serializer = GenericJackson2JsonRedisSerializer(objectMapper)
return RedisTemplate<String, Any>().apply {
- connectionFactory = redisConnectionFactory!!
+ connectionFactory = redisConnectionFactory
keySerializer = StringRedisSerializer()
valueSerializer = serializer
hashKeySerializer = StringRedisSerializer()
hashValueSerializer = serializer
+ afterPropertiesSet()
}
}
Likely invalid or redundant comment.
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 (2)
idle-domain/src/main/kotlin/com/swm/idle/domain/chat/entity/jpa/ChatMessage.kt (2)
47-50
: 매직 넘버를 상수로 추출하는 것이 좋습니다.검증 로직이 잘 구현되어 있습니다. 하지만 가독성과 유지보수성을 높이기 위해 500이라는 매직 넘버를 의미 있는 상수로 추출하는 것을 제안드립니다.
class ChatMessage( roomId: UUID, senderId: UUID, senderType: SenderType, contents: List<Content>, ) : BaseEntity() { + companion object { + private const val MAX_MESSAGE_LENGTH = 500 + } data class Content( val type: ContentType, val value: String, ) { init { require(value.isNotBlank()) { "채팅 메세지는 최소 1자 이상 입력해 주셔야 합니다." } - require(value.length <= 500) { "채팅 메세지는 500자를 초과할 수 없습니다." } + require(value.length <= MAX_MESSAGE_LENGTH) { "채팅 메세지는 ${MAX_MESSAGE_LENGTH}자를 초과할 수 없습니다." } } } }
47-50
: 추가적인 검증 로직 고려사항현재 구현된 기본적인 길이 검증 외에도 다음과 같은 추가 검증을 고려해보시면 좋을 것 같습니다:
- XSS 공격 방지를 위한 특수문자 필터링
- 스팸 방지를 위한 연속된 동일 문자 제한
- 욕설 필터링
이러한 보안 및 컨텐츠 품질 관련 검증이 필요하다고 판단되시면 도움을 드리겠습니다.
|
* [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 <[email protected]> Co-authored-by: Wonjun You <[email protected]>
* [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 <[email protected]> Co-authored-by: Wonjun You <[email protected]>
1. 📄 Summary
작성중입니다!
2. ✏️ Documentation
3. 🤔 고민했던 점
4. 💡 알게된 점, 궁금한 점
5. 📸 스크린샷(선택)
Summary by CodeRabbit
새로운 기능
SendChatMessageRequest
추가로 메시지 내용 전송을 용이하게 함.버그 수정