diff --git a/src/backend/auth_server/Dockerfile b/src/backend/auth_server/Dockerfile new file mode 100644 index 00000000..9e1ebf15 --- /dev/null +++ b/src/backend/auth_server/Dockerfile @@ -0,0 +1,12 @@ +# Azul Zulu JDK 17 기반 이미지 사용 +FROM azul/zulu-openjdk:17 + +# 작업 디렉토리 설정 +WORKDIR /app + +# 빌드된 JAR 파일 복사 +ARG JAR_FILE=build/libs/auth_server-0.0.1-SNAPSHOT.jar +COPY ${JAR_FILE} app.jar + +# 애플리케이션 실행 +ENTRYPOINT ["java", "-jar", "app.jar"] \ No newline at end of file diff --git a/src/backend/chat_server/src/main/java/com/jootalkpia/chat_server/config/WebSocketConfig.java b/src/backend/chat_server/src/main/java/com/jootalkpia/chat_server/config/WebSocketConfig.java index 84ddaaa9..df03d186 100644 --- a/src/backend/chat_server/src/main/java/com/jootalkpia/chat_server/config/WebSocketConfig.java +++ b/src/backend/chat_server/src/main/java/com/jootalkpia/chat_server/config/WebSocketConfig.java @@ -19,8 +19,8 @@ public void configureMessageBroker(MessageBrokerRegistry config) { @Override public void registerStompEndpoints(StompEndpointRegistry registry) { - registry.addEndpoint("/ws-connect") //handShake과정에서 사용할 endpoint - .setAllowedOriginPatterns("*") // cors + registry.addEndpoint("/ws-connect") // STOMP WebSocket 엔드포인트 + .setAllowedOriginPatterns("*") // CORS 허용 .withSockJS(); // SockJS 활성화 } } diff --git a/src/backend/chat_server/src/main/java/com/jootalkpia/chat_server/controller/ChatController.java b/src/backend/chat_server/src/main/java/com/jootalkpia/chat_server/controller/ChatController.java index 15cd4589..8c640830 100644 --- a/src/backend/chat_server/src/main/java/com/jootalkpia/chat_server/controller/ChatController.java +++ b/src/backend/chat_server/src/main/java/com/jootalkpia/chat_server/controller/ChatController.java @@ -7,11 +7,9 @@ import org.springframework.messaging.handler.annotation.DestinationVariable; import org.springframework.messaging.handler.annotation.MessageMapping; import org.springframework.messaging.handler.annotation.SendTo; -import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController -@RequestMapping @RequiredArgsConstructor public class ChatController { diff --git a/src/backend/chat_server/src/main/java/com/jootalkpia/chat_server/service/KafkaConsumer.java b/src/backend/chat_server/src/main/java/com/jootalkpia/chat_server/service/KafkaConsumer.java index 9c6595ae..3a681bcb 100644 --- a/src/backend/chat_server/src/main/java/com/jootalkpia/chat_server/service/KafkaConsumer.java +++ b/src/backend/chat_server/src/main/java/com/jootalkpia/chat_server/service/KafkaConsumer.java @@ -1,32 +1,42 @@ package com.jootalkpia.chat_server.service; import com.fasterxml.jackson.databind.ObjectMapper; +import com.jootalkpia.chat_server.dto.ChatMessageResponse; import com.jootalkpia.chat_server.dto.ChatMessageToKafka; import com.jootalkpia.chat_server.dto.MinutePriceResponse; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.kafka.annotation.KafkaListener; +import org.springframework.messaging.simp.SimpMessageSendingOperations; +import org.springframework.messaging.simp.SimpMessagingTemplate; import org.springframework.stereotype.Service; @Service @Slf4j +@RequiredArgsConstructor public class KafkaConsumer { + + private final ChatService chatService; + private final ObjectMapper objectMapper; + private final SimpMessagingTemplate messagingTemplate; // SimpMessagingTemplate 주입 + private final SimpMessageSendingOperations messagingTemplateBroker; // 내부 메시지 브로커 사용 + @KafkaListener( topics = "${topic.minute}", groupId = "${group.minute}" ) public void processMinutePrice(String kafkaMessage) { - log.info("message ===> " + kafkaMessage); - - ObjectMapper mapper = new ObjectMapper(); - + log.info("Received Kafka message ===> " + kafkaMessage); try { - MinutePriceResponse minutePriceResponse = mapper.readValue(kafkaMessage, MinutePriceResponse.class); + MinutePriceResponse stockUpdate = objectMapper.readValue(kafkaMessage, MinutePriceResponse.class); + String stockDataJson = objectMapper.writeValueAsString(stockUpdate); + + messagingTemplateBroker.convertAndSend("/subscribe/stock", stockDataJson); - //웹소켓 전달하는 로직 or 전달하는 함수 + log.info("Broadcasted stock data via WebSocket: " + stockDataJson); - log.info("dto ===> " + minutePriceResponse.toString()); } catch (Exception ex) { - log.error(ex.getMessage(), ex); // 추후에 GlobalException 처리 + log.error("Error processing stock message: " + ex.getMessage(), ex); } } @@ -36,7 +46,7 @@ public void processMinutePrice(String kafkaMessage) { concurrency = "2" ) public void processChatMessage(String kafkaMessage) { - log.info("message ===> " + kafkaMessage); + log.info("Received Kafka message ===> " + kafkaMessage); ObjectMapper mapper = new ObjectMapper(); diff --git a/src/backend/chat_server/src/main/resources/application.yml b/src/backend/chat_server/src/main/resources/application.yml index 1312d879..93feecda 100644 --- a/src/backend/chat_server/src/main/resources/application.yml +++ b/src/backend/chat_server/src/main/resources/application.yml @@ -2,7 +2,7 @@ spring: jpa: show-sql: true hibernate: - ddl-auto: update + ddl-auto: properties: hibernate: format_sql: true