SSE (Server-Sent Events):
SseEmitter: Spring에서 SSE 연결을 표현하는 객체입니다. 컨트롤러는 각 클라이언트마다 SseEmitter 객체를 생성하고, 이 객체를 통해 데이터를 전송(send())합니다.알림 서비스 구현 (NotificationService):
SseEmitter를 찾아 데이터를 전송하는 중앙 서비스입니다.GET /api/notifications/subscribe), NotificationController는 NotificationService를 통해 해당 사용자의 SseEmitter를 생성하고 서버 메모리에 저장합니다.WebSocketEventsListener와 같은 다른 서비스에서 특정 이벤트(e.g., "스터디룸에 새 사용자 입장")가 발생하면, NotificationService를 호출합니다. 서비스는 해당 스터디룸의 모든 참여자에게 알림을 보내도록 SseEmitter를 통해 데이터를 스트리밍합니다.Spring AI:
ChatClient라는 공통 인터페이스를 통해 코드를 작성하면, 설정을 바꾸는 것만으로 OpenAI에서 Gemini로 또는 그 반대로 쉽게 전환할 수 있습니다.ChatClient:
AIConfig 클래스에서 ChatClient를 Spring Bean으로 등록하고, application.yml에 API 키, 모델명, 온도(temperature), 최대 토큰 등 LLM의 동작을 제어하는 설정을 주입합니다.AI 서비스 및 컨트롤러 구현:
AIService: ChatClient를 주입받아 실제 AI 모델과 통신하는 비즈니스 로직을 담당합니다. "코드 리뷰를 위한 프롬프트", "개념 설명을 위한 프롬프트" 등 각 기능에 맞는 프롬프트 엔지니어링이 이 서비스에서 이루어집니다.AIController: 프론트엔드로부터 요청을 받아 AIService를 호출하고, AI 모델이 생성한 응답을 클라이언트에게 전달하는 API 엔드포인트를 제공합니다. (e.g., POST /api/ai/code-review)SSE 클라이언트 구현:
EventSource API를 사용하여 SSE 서버에 연결하고, 서버로부터 오는 이벤트를 수신합니다.NotificationStatus 컴포넌트를 만들어, SSE 연결 상태(연결 중, 연결됨, 끊김)를 사용자에게 시각적으로 피드백하고, 수신된 알림을 화면에 표시하는 로직을 구현했습니다.AI 어시스턴트 UI:
AIAssistantFab (Floating Action Button): 화면 우측 하단에 떠 있는 버튼으로, 사용자가 언제든지 AI 어시스턴트를 호출할 수 있게 합니다.AIAssistantPanel: 실제 채팅이 이루어지는 패널 UI입니다. 사용자가 패널을 드래그하여 위치를 옮기거나 최소화할 수 있도록 하여 사용자 경험을 향상시켰습니다.Heartbeat (주기적인 상태 전송):
ChatClient라는 추상화된 인터페이스를 통해 코드 리뷰, Q&A와 같은 지능형 API를 구축했습니다.EventSource API로 SSE 알림을 수신하고, 드래그 가능한 AI 어시스턴트 패널을 구현하여 사용자 경험을 향상시켰습니다.