From 7237238a72b81fcc29afae090eff9e81e2f14bf9 Mon Sep 17 00:00:00 2001 From: h0l1da2 Date: Mon, 22 Jul 2024 21:47:06 +0900 Subject: [PATCH 1/8] =?UTF-8?q?feat(kafka):=20=EC=97=85=EB=8D=B0=EC=9D=B4?= =?UTF-8?q?=ED=8A=B8=20=EC=95=8C=EB=A6=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 85 --- .../kafka/AccountBookInputNotice.java | 12 ------ .../account/yomankum/kafka/KafkaService.java | 40 +++++++++++++++++-- .../kafka/dto/AccountBookCreateNotice.java | 11 +++++ .../kafka/dto/AccountBookUpdateNotice.java | 11 +++++ .../account/yomankum/user/domain/User.java | 12 ++++-- src/main/resources/application.yml | 2 +- 6 files changed, 67 insertions(+), 21 deletions(-) delete mode 100644 src/main/java/com/account/yomankum/kafka/AccountBookInputNotice.java create mode 100644 src/main/java/com/account/yomankum/kafka/dto/AccountBookCreateNotice.java create mode 100644 src/main/java/com/account/yomankum/kafka/dto/AccountBookUpdateNotice.java diff --git a/src/main/java/com/account/yomankum/kafka/AccountBookInputNotice.java b/src/main/java/com/account/yomankum/kafka/AccountBookInputNotice.java deleted file mode 100644 index 9134f28..0000000 --- a/src/main/java/com/account/yomankum/kafka/AccountBookInputNotice.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.account.yomankum.kafka; - -import java.time.LocalDateTime; - -public record AccountBookInputNotice( - Long id, - String nickname, // 쓰기 시작하는 닉네임 - String event, - LocalDateTime eventDatetime -) { - -} diff --git a/src/main/java/com/account/yomankum/kafka/KafkaService.java b/src/main/java/com/account/yomankum/kafka/KafkaService.java index 88012df..70722db 100644 --- a/src/main/java/com/account/yomankum/kafka/KafkaService.java +++ b/src/main/java/com/account/yomankum/kafka/KafkaService.java @@ -1,17 +1,49 @@ package com.account.yomankum.kafka; +import com.account.yomankum.auth.common.Auth; +import com.account.yomankum.auth.common.LoginUser; +import com.account.yomankum.common.exception.BadRequestException; +import com.account.yomankum.common.exception.Exception; +import com.account.yomankum.kafka.dto.AccountBookCreateNotice; +import com.account.yomankum.kafka.dto.AccountBookUpdateNotice; +import com.account.yomankum.user.domain.User; +import com.account.yomankum.user.service.UserFinder; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.kafka.annotation.KafkaListener; import org.springframework.stereotype.Component; @Slf4j @Component +@RequiredArgsConstructor public class KafkaService { - @KafkaListener(topics = "accountBook_input", groupId = "accountServiceConsumers") - public void listenAccountNotifications(AccountBookInputNotice notice) { - // 처리 로직 - System.out.println("Received Account Notification: " + notice.nickname()); + private final UserFinder userFinder; + + @KafkaListener(topics = "create", groupId = "accountBook") + public void createAccountBookNotification(@Auth LoginUser loginUser, AccountBookCreateNotice notice) { + User user = userFinder.findById(loginUser.getUserId()) + .orElseThrow(() -> new BadRequestException(Exception.USER_NOT_FOUND)); + + boolean isExist = user.isUsersAccountBook(notice.accountBookId()); + + if (isExist) { + // 알림 추가 -> Http ? + log.info("[Kafka] create 메시지 수신 - accountBookId : {}", notice.accountBookId()); + } + } + + @KafkaListener(topics = "update", groupId = "accountBook") + public void updateAccountBookNotification(@Auth LoginUser loginUser, AccountBookUpdateNotice notice) { + User user = userFinder.findById(loginUser.getUserId()) + .orElseThrow(() -> new BadRequestException(Exception.USER_NOT_FOUND)); + + boolean isExist = user.isUsersAccountBook(notice.accountBookId()); + + if (isExist) { + // 알림 추가 -> Http ? + log.info("[Kafka] update 메시지 수신 - accountBookId : {}", notice.accountBookId()); + } } } diff --git a/src/main/java/com/account/yomankum/kafka/dto/AccountBookCreateNotice.java b/src/main/java/com/account/yomankum/kafka/dto/AccountBookCreateNotice.java new file mode 100644 index 0000000..1b2ee1c --- /dev/null +++ b/src/main/java/com/account/yomankum/kafka/dto/AccountBookCreateNotice.java @@ -0,0 +1,11 @@ +package com.account.yomankum.kafka.dto; + +import java.time.LocalDateTime; + +public record AccountBookCreateNotice( + Long accountBookId, + String nickname, // 쓰기 시작하는 닉네임 + LocalDateTime accountBookCreatedAt, + LocalDateTime eventCreatedAt +) { +} diff --git a/src/main/java/com/account/yomankum/kafka/dto/AccountBookUpdateNotice.java b/src/main/java/com/account/yomankum/kafka/dto/AccountBookUpdateNotice.java new file mode 100644 index 0000000..d0c57a9 --- /dev/null +++ b/src/main/java/com/account/yomankum/kafka/dto/AccountBookUpdateNotice.java @@ -0,0 +1,11 @@ +package com.account.yomankum.kafka.dto; + +import java.time.LocalDateTime; + +public record AccountBookUpdateNotice( + Long accountBookId, + String nickname, // 쓰기 시작하는 닉네임 + LocalDateTime accountBookCreatedAt, + LocalDateTime eventCreatedAt +) { +} diff --git a/src/main/java/com/account/yomankum/user/domain/User.java b/src/main/java/com/account/yomankum/user/domain/User.java index 1d46bc2..60bbf53 100644 --- a/src/main/java/com/account/yomankum/user/domain/User.java +++ b/src/main/java/com/account/yomankum/user/domain/User.java @@ -1,17 +1,15 @@ package com.account.yomankum.user.domain; -import com.account.yomankum.user.dto.request.UserInfoUpdateRequest; import com.account.yomankum.accountBook.domain.AccountBookUser; -import com.account.yomankum.common.exception.BadRequestException; -import com.account.yomankum.common.exception.Exception; +import com.account.yomankum.user.dto.request.UserInfoUpdateRequest; import jakarta.persistence.*; import lombok.*; import org.springframework.security.crypto.password.PasswordEncoder; import java.time.LocalDate; +import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; -import java.time.LocalDateTime; @Entity @Getter @@ -88,4 +86,10 @@ public String getOauthId() { public void addAccountBook(AccountBookUser accountBookUser) { accountBooks.add(accountBookUser); } + + public boolean isUsersAccountBook(Long accountBookId) { + return accountBooks.stream() + .anyMatch(accountBook -> + accountBookId.equals(accountBook.getAccountBook().getId())); + } } diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 76e95c8..d60a61a 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -65,4 +65,4 @@ auth: kafka: bootstrap-server: localhost:29092 group-id: accountBook - type-mappings: yomankum.kafka.producer.yomankum.api.dto.AccountBookInputNotice:com.account.yomankum.kafka.AccountBookInputNotice \ No newline at end of file + type-mappings: yomankum.kafka.producer.yomankum.api.dto.AccountBookCreateNotice:com.account.yomankum.kafka.dto.AccountBookCreateNotice, yomankum.kafka.producer.yomankum.api.dto.AccountBookUpdateNotice:com.account.yomankum.kafka.dto.AccountBookUpdateNotice \ No newline at end of file From 993e0784d79a10a0f36f5891df6c641477db3301 Mon Sep 17 00:00:00 2001 From: h0l1da2 Date: Wed, 31 Jul 2024 21:48:53 +0900 Subject: [PATCH 2/8] =?UTF-8?q?chore(gradle):=20=EC=9B=B9=EC=86=8C?= =?UTF-8?q?=EC=BC=93=20=EB=9D=BC=EC=9D=B4=EB=B8=8C=EB=9F=AC=EB=A6=AC=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 85 --- build.gradle | 2 ++ 1 file changed, 2 insertions(+) diff --git a/build.gradle b/build.gradle index d03f6b5..2470256 100644 --- a/build.gradle +++ b/build.gradle @@ -41,6 +41,8 @@ dependencies { implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.0.2' implementation 'com.github.ulisesbocchio:jasypt-spring-boot-starter:3.0.5' + implementation 'org.springframework.boot:spring-boot-starter-websocket' + implementation group: 'org.springframework.boot', name: 'spring-boot-starter-webflux', version: '3.0.2' implementation 'io.jsonwebtoken:jjwt-api:0.12.5' From 27b21dd08141907a95602c5127d03df8d9ef686e Mon Sep 17 00:00:00 2001 From: h0l1da2 Date: Wed, 31 Jul 2024 21:49:16 +0900 Subject: [PATCH 3/8] =?UTF-8?q?chore(application.yml):=20=EC=B9=B4?= =?UTF-8?q?=ED=94=84=EC=B9=B4=20=ED=83=80=EC=9E=85=EB=A7=A4=ED=95=91=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 클래스 매핑 추가 85 --- src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index d60a61a..3ef57dc 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -65,4 +65,4 @@ auth: kafka: bootstrap-server: localhost:29092 group-id: accountBook - type-mappings: yomankum.kafka.producer.yomankum.api.dto.AccountBookCreateNotice:com.account.yomankum.kafka.dto.AccountBookCreateNotice, yomankum.kafka.producer.yomankum.api.dto.AccountBookUpdateNotice:com.account.yomankum.kafka.dto.AccountBookUpdateNotice \ No newline at end of file + type-mappings: yomankum.kafka.producer.yomankum.api.dto.AccountBookCreateNotice:com.account.yomankum.kafka.dto.AccountBookCreateNotice, yomankum.kafka.producer.yomankum.api.dto.AccountBookUpdateNotice:com.account.yomankum.kafka.dto.AccountBookUpdateNotice, yomankum.kafka.producer.yomankum.api.dto.AccountBookInputNotice:com.account.yomankum.kafka.dto.AccountBookInputNotice \ No newline at end of file From a92f840d58cc36f6a35f20b5f6f41fe9d92fea30 Mon Sep 17 00:00:00 2001 From: h0l1da2 Date: Wed, 31 Jul 2024 21:50:24 +0900 Subject: [PATCH 4/8] =?UTF-8?q?feat(websocket):=20=EC=9B=B9=EC=86=8C?= =?UTF-8?q?=EC=BC=93=20=EC=84=A4=EC=A0=95=20=EB=B0=8F=20=EC=BD=94=EB=93=9C?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 웹소켓 설정 및 카프카에게 메시지 받아서 보내는 기능 추가 85 --- ...CustomHttpSessionHandshakeInterceptor.java | 26 +++++ .../socket/common/CustomWebSocketHandler.java | 96 +++++++++++++++++++ .../socket/common/WebSocketConfig.java | 24 +++++ 3 files changed, 146 insertions(+) create mode 100644 src/main/java/com/account/yomankum/socket/common/CustomHttpSessionHandshakeInterceptor.java create mode 100644 src/main/java/com/account/yomankum/socket/common/CustomWebSocketHandler.java create mode 100644 src/main/java/com/account/yomankum/socket/common/WebSocketConfig.java diff --git a/src/main/java/com/account/yomankum/socket/common/CustomHttpSessionHandshakeInterceptor.java b/src/main/java/com/account/yomankum/socket/common/CustomHttpSessionHandshakeInterceptor.java new file mode 100644 index 0000000..b3d7f7e --- /dev/null +++ b/src/main/java/com/account/yomankum/socket/common/CustomHttpSessionHandshakeInterceptor.java @@ -0,0 +1,26 @@ +package com.account.yomankum.socket.common; + +import jakarta.servlet.http.HttpServletRequest; +import org.springframework.http.server.ServerHttpRequest; +import org.springframework.http.server.ServerHttpResponse; +import org.springframework.util.StringUtils; +import org.springframework.web.socket.WebSocketHandler; +import org.springframework.web.socket.server.support.HttpSessionHandshakeInterceptor; + +import java.util.Map; + +public class CustomHttpSessionHandshakeInterceptor extends HttpSessionHandshakeInterceptor { + + @Override + public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Map attributes) throws Exception { + HttpServletRequest httpReq = (HttpServletRequest) request; + String userId = httpReq.getParameter("userId"); + + if (StringUtils.hasText(userId)) { + attributes.put("userId", userId); + } + + return super.beforeHandshake(request, response, wsHandler, attributes); + } + +} diff --git a/src/main/java/com/account/yomankum/socket/common/CustomWebSocketHandler.java b/src/main/java/com/account/yomankum/socket/common/CustomWebSocketHandler.java new file mode 100644 index 0000000..8cac0f5 --- /dev/null +++ b/src/main/java/com/account/yomankum/socket/common/CustomWebSocketHandler.java @@ -0,0 +1,96 @@ +package com.account.yomankum.socket.common; + +import com.account.yomankum.common.exception.BadRequestException; +import com.account.yomankum.common.exception.Exception; +import com.account.yomankum.kafka.dto.AccountBookInputNotice; +import com.account.yomankum.user.domain.User; +import com.account.yomankum.user.service.UserFinder; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; +import org.springframework.util.StringUtils; +import org.springframework.web.socket.CloseStatus; +import org.springframework.web.socket.TextMessage; +import org.springframework.web.socket.WebSocketSession; +import org.springframework.web.socket.handler.TextWebSocketHandler; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.CopyOnWriteArraySet; + +@Slf4j +@Component +@RequiredArgsConstructor +public class CustomWebSocketHandler extends TextWebSocketHandler { + // 소켓에 연결되어있는 세션 목록 + private final CopyOnWriteArraySet sessions = new CopyOnWriteArraySet<>(); + private final Map userIdSessionMap = new ConcurrentHashMap<>(); + + private final UserFinder userFinder; + private final ObjectMapper mapper; + + @Override + public void afterConnectionEstablished(WebSocketSession session) { + sessions.add(session); + String userId = (String) session.getAttributes().get("userId"); + + if (StringUtils.hasText(userId)) { + userIdSessionMap.put(Long.parseLong(userId), session); + } + + log.info("소켓 연결 성공 - userID : {}", userId); + } + + @Override + public void afterConnectionClosed(WebSocketSession session, CloseStatus status) { + sessions.remove(session); + String userId = (String) session.getAttributes().get("userId"); + + if (StringUtils.hasText(userId)) { + userIdSessionMap.remove(Long.parseLong(userId), session); + } + + log.info("소켓 연결 종료 - userID : {}", userId); + } + + @Override + protected void handleTextMessage(WebSocketSession session, TextMessage message) { + // message 받으면.. + } + + // 클라이언트에게 메시지 보내기 + public void sendAccountBookInputMessage(AccountBookInputNotice notice) { + List userIdList = new ArrayList<>(userIdSessionMap.keySet()); + List userList = userFinder.findAllById(userIdList); + + Long accountBookId = notice.accountBookId(); + List accountBookUserIdList = userList.stream() + .filter(user -> user.isUsersAccountBook(accountBookId)) + .map(User::getId) + .toList(); + + accountBookUserIdList.forEach(userId -> { + WebSocketSession session = userIdSessionMap.get(userId); + + if (session != null && session.isOpen()) { + try { + String message = mapper.writeValueAsString(notice); + session.sendMessage(new TextMessage(message)); + } catch (JsonProcessingException e) { + log.error("JSON 파싱 에러"); + throw new BadRequestException(Exception.SERVER_ERROR); + } catch (IOException e) { + log.error("세션 메시지 전송 에러"); + throw new BadRequestException(Exception.SERVER_ERROR); + } + } + }); + + } + +} diff --git a/src/main/java/com/account/yomankum/socket/common/WebSocketConfig.java b/src/main/java/com/account/yomankum/socket/common/WebSocketConfig.java new file mode 100644 index 0000000..8f95952 --- /dev/null +++ b/src/main/java/com/account/yomankum/socket/common/WebSocketConfig.java @@ -0,0 +1,24 @@ +package com.account.yomankum.socket.common; + +import lombok.RequiredArgsConstructor; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.socket.config.annotation.EnableWebSocket; +import org.springframework.web.socket.config.annotation.WebSocketConfigurer; +import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry; + +@Configuration +@EnableWebSocket +@RequiredArgsConstructor +public class WebSocketConfig implements WebSocketConfigurer { + + private final CustomWebSocketHandler customWebSocketHandler; + + @Override + public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { + registry.addHandler(customWebSocketHandler, "/ws") + .setAllowedOrigins("*") // FE Server 오리진 추가.. + .addInterceptors(new CustomHttpSessionHandshakeInterceptor()) + .withSockJS(); + } + +} From 0407f689ee47d5bac9e9ff78949e638d1e8877e2 Mon Sep 17 00:00:00 2001 From: h0l1da2 Date: Wed, 31 Jul 2024 21:51:04 +0900 Subject: [PATCH 5/8] =?UTF-8?q?feat(kafka):=20input=20=EC=9A=A9=20?= =?UTF-8?q?=EC=BD=94=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 쓰기 input 용 코드 추가 85 --- .../account/yomankum/kafka/KafkaService.java | 22 ++++++++++--------- .../kafka/dto/AccountBookInputNotice.java | 11 ++++++++++ 2 files changed, 23 insertions(+), 10 deletions(-) create mode 100644 src/main/java/com/account/yomankum/kafka/dto/AccountBookInputNotice.java diff --git a/src/main/java/com/account/yomankum/kafka/KafkaService.java b/src/main/java/com/account/yomankum/kafka/KafkaService.java index 70722db..ef4f766 100644 --- a/src/main/java/com/account/yomankum/kafka/KafkaService.java +++ b/src/main/java/com/account/yomankum/kafka/KafkaService.java @@ -5,7 +5,9 @@ import com.account.yomankum.common.exception.BadRequestException; import com.account.yomankum.common.exception.Exception; import com.account.yomankum.kafka.dto.AccountBookCreateNotice; +import com.account.yomankum.kafka.dto.AccountBookInputNotice; import com.account.yomankum.kafka.dto.AccountBookUpdateNotice; +import com.account.yomankum.socket.common.CustomWebSocketHandler; import com.account.yomankum.user.domain.User; import com.account.yomankum.user.service.UserFinder; import lombok.RequiredArgsConstructor; @@ -19,18 +21,18 @@ public class KafkaService { private final UserFinder userFinder; + private final CustomWebSocketHandler customWebSocketHandler; - @KafkaListener(topics = "create", groupId = "accountBook") - public void createAccountBookNotification(@Auth LoginUser loginUser, AccountBookCreateNotice notice) { - User user = userFinder.findById(loginUser.getUserId()) - .orElseThrow(() -> new BadRequestException(Exception.USER_NOT_FOUND)); - - boolean isExist = user.isUsersAccountBook(notice.accountBookId()); + @KafkaListener(topics = "input", groupId = "accountBook") + public void inputAccountBookNotification(AccountBookInputNotice notice) { + customWebSocketHandler.sendAccountBookInputMessage(notice); + log.info("[Kafka] input 메시지 수신 - accountBookId : {}", notice.accountBookId()); + } - if (isExist) { - // 알림 추가 -> Http ? - log.info("[Kafka] create 메시지 수신 - accountBookId : {}", notice.accountBookId()); - } + @KafkaListener(topics = "create", groupId = "accountBook") + public void createAccountBookNotification(AccountBookCreateNotice notice) { + // 알림 추가 -> Http ? + log.info("[Kafka] create 메시지 수신 - accountBookId : {}", notice.accountBookId()); } @KafkaListener(topics = "update", groupId = "accountBook") diff --git a/src/main/java/com/account/yomankum/kafka/dto/AccountBookInputNotice.java b/src/main/java/com/account/yomankum/kafka/dto/AccountBookInputNotice.java new file mode 100644 index 0000000..eca679b --- /dev/null +++ b/src/main/java/com/account/yomankum/kafka/dto/AccountBookInputNotice.java @@ -0,0 +1,11 @@ +package com.account.yomankum.kafka.dto; + +import java.time.LocalDateTime; + +public record AccountBookInputNotice( + Long accountBookId, + String nickname, // 쓰기 시작하는 닉네임 + LocalDateTime accountBookCreatedAt, + LocalDateTime eventCreatedAt +) { +} From bf59de6ed4f1b657c49dec2e7d5b221b6ade0930 Mon Sep 17 00:00:00 2001 From: h0l1da2 Date: Wed, 31 Jul 2024 21:51:18 +0900 Subject: [PATCH 6/8] =?UTF-8?q?feat(user):=20findAll=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 85 --- .../java/com/account/yomankum/user/service/UserFinder.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/com/account/yomankum/user/service/UserFinder.java b/src/main/java/com/account/yomankum/user/service/UserFinder.java index 8cc7c2a..714ce3c 100644 --- a/src/main/java/com/account/yomankum/user/service/UserFinder.java +++ b/src/main/java/com/account/yomankum/user/service/UserFinder.java @@ -10,6 +10,7 @@ import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; +import java.util.List; import java.util.Optional; @Component @@ -37,4 +38,7 @@ public Optional findByAuthTypeAndOauthId(AuthType type, String oauthId){ return userRepository.findByAuthInfoAuthTypeAndAuthInfoOauthId(type, oauthId); } + public List findAllById(List userIdList) { + return userRepository.findAllById(userIdList); + } } From a3e533e8d74f311d9d91b5665f917bf5d8e28a6e Mon Sep 17 00:00:00 2001 From: h0l1da2 Date: Thu, 1 Aug 2024 21:26:10 +0900 Subject: [PATCH 7/8] =?UTF-8?q?feat(webSocket):=20origin=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 85 --- .../com/account/yomankum/socket/common/WebSocketConfig.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/account/yomankum/socket/common/WebSocketConfig.java b/src/main/java/com/account/yomankum/socket/common/WebSocketConfig.java index 8f95952..86e9315 100644 --- a/src/main/java/com/account/yomankum/socket/common/WebSocketConfig.java +++ b/src/main/java/com/account/yomankum/socket/common/WebSocketConfig.java @@ -16,7 +16,7 @@ public class WebSocketConfig implements WebSocketConfigurer { @Override public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { registry.addHandler(customWebSocketHandler, "/ws") - .setAllowedOrigins("*") // FE Server 오리진 추가.. + .setAllowedOrigins("https://www.yomankum.com") // FE Server 오리진 추가.. .addInterceptors(new CustomHttpSessionHandshakeInterceptor()) .withSockJS(); } From ca151262bc4b10c38c255977d7f8222cdbf8f78c Mon Sep 17 00:00:00 2001 From: h0l1da2 Date: Mon, 5 Aug 2024 21:45:53 +0900 Subject: [PATCH 8/8] =?UTF-8?q?feat(webSocket):=20=EB=A9=94=EC=8B=9C?= =?UTF-8?q?=EC=A7=80=20=EA=B0=80=EA=B3=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 아이디, 이벤트 타입, 닉네임 세 가지 공통 정보 추가 다른 정보하다면 .. message 보내는 함수 추가해야 할듯. 85 --- .../account/yomankum/kafka/KafkaService.java | 3 ++- .../socket/common/CustomWebSocketHandler.java | 4 ++-- .../dto/AccountBookWebSocketNotice.java | 19 +++++++++++++++++++ .../yomankum/socket/dto/EventType.java | 5 +++++ 4 files changed, 28 insertions(+), 3 deletions(-) create mode 100644 src/main/java/com/account/yomankum/socket/dto/AccountBookWebSocketNotice.java create mode 100644 src/main/java/com/account/yomankum/socket/dto/EventType.java diff --git a/src/main/java/com/account/yomankum/kafka/KafkaService.java b/src/main/java/com/account/yomankum/kafka/KafkaService.java index ef4f766..b9f96e3 100644 --- a/src/main/java/com/account/yomankum/kafka/KafkaService.java +++ b/src/main/java/com/account/yomankum/kafka/KafkaService.java @@ -8,6 +8,7 @@ import com.account.yomankum.kafka.dto.AccountBookInputNotice; import com.account.yomankum.kafka.dto.AccountBookUpdateNotice; import com.account.yomankum.socket.common.CustomWebSocketHandler; +import com.account.yomankum.socket.dto.AccountBookWebSocketNotice; import com.account.yomankum.user.domain.User; import com.account.yomankum.user.service.UserFinder; import lombok.RequiredArgsConstructor; @@ -25,7 +26,7 @@ public class KafkaService { @KafkaListener(topics = "input", groupId = "accountBook") public void inputAccountBookNotification(AccountBookInputNotice notice) { - customWebSocketHandler.sendAccountBookInputMessage(notice); + customWebSocketHandler.sendAccountBookMessage(AccountBookWebSocketNotice.from(notice)); log.info("[Kafka] input 메시지 수신 - accountBookId : {}", notice.accountBookId()); } diff --git a/src/main/java/com/account/yomankum/socket/common/CustomWebSocketHandler.java b/src/main/java/com/account/yomankum/socket/common/CustomWebSocketHandler.java index 8cac0f5..1df6ec3 100644 --- a/src/main/java/com/account/yomankum/socket/common/CustomWebSocketHandler.java +++ b/src/main/java/com/account/yomankum/socket/common/CustomWebSocketHandler.java @@ -2,7 +2,7 @@ import com.account.yomankum.common.exception.BadRequestException; import com.account.yomankum.common.exception.Exception; -import com.account.yomankum.kafka.dto.AccountBookInputNotice; +import com.account.yomankum.socket.dto.AccountBookWebSocketNotice; import com.account.yomankum.user.domain.User; import com.account.yomankum.user.service.UserFinder; import com.fasterxml.jackson.core.JsonProcessingException; @@ -64,7 +64,7 @@ protected void handleTextMessage(WebSocketSession session, TextMessage message) } // 클라이언트에게 메시지 보내기 - public void sendAccountBookInputMessage(AccountBookInputNotice notice) { + public void sendAccountBookMessage(AccountBookWebSocketNotice notice) { List userIdList = new ArrayList<>(userIdSessionMap.keySet()); List userList = userFinder.findAllById(userIdList); diff --git a/src/main/java/com/account/yomankum/socket/dto/AccountBookWebSocketNotice.java b/src/main/java/com/account/yomankum/socket/dto/AccountBookWebSocketNotice.java new file mode 100644 index 0000000..a6bd2db --- /dev/null +++ b/src/main/java/com/account/yomankum/socket/dto/AccountBookWebSocketNotice.java @@ -0,0 +1,19 @@ +package com.account.yomankum.socket.dto; + +import com.account.yomankum.kafka.dto.AccountBookInputNotice; +import lombok.Builder; + +@Builder +public record AccountBookWebSocketNotice( + Long accountBookId, + String nickname, + EventType eventType +) { + public static AccountBookWebSocketNotice from(AccountBookInputNotice notice) { + return AccountBookWebSocketNotice.builder() + .accountBookId(notice.accountBookId()) + .eventType(EventType.ACCOUNT_BOOK_INPUT) + .nickname(notice.nickname()) + .build(); + } +} diff --git a/src/main/java/com/account/yomankum/socket/dto/EventType.java b/src/main/java/com/account/yomankum/socket/dto/EventType.java new file mode 100644 index 0000000..8efeb13 --- /dev/null +++ b/src/main/java/com/account/yomankum/socket/dto/EventType.java @@ -0,0 +1,5 @@ +package com.account.yomankum.socket.dto; + +public enum EventType { + ACCOUNT_BOOK_INPUT +}