From 5f0928b1980df2cad185694a75b8e0fbfd059233 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=97=B0=ED=98=B8?= Date: Thu, 16 Apr 2026 20:55:39 +0900 Subject: [PATCH 1/4] =?UTF-8?q?feat:=20WebSocketServerHandshakeException?= =?UTF-8?q?=20=EC=98=88=EC=99=B8=20=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../realtime/socketio/SocketIoConfig.java | 4 ++++ .../socket/SocketIoExceptionListener.java | 20 +++++++++++++++++++ 2 files changed, 24 insertions(+) create mode 100644 src/main/java/com/process/clash/infrastructure/config/socket/SocketIoExceptionListener.java diff --git a/src/main/java/com/process/clash/adapter/realtime/socketio/SocketIoConfig.java b/src/main/java/com/process/clash/adapter/realtime/socketio/SocketIoConfig.java index 594ceca6f..1f1c11a1e 100644 --- a/src/main/java/com/process/clash/adapter/realtime/socketio/SocketIoConfig.java +++ b/src/main/java/com/process/clash/adapter/realtime/socketio/SocketIoConfig.java @@ -3,6 +3,7 @@ import com.corundumstudio.socketio.SocketIOServer; import com.corundumstudio.socketio.Transport; import com.process.clash.infrastructure.config.SocketIoProperties; +import com.process.clash.infrastructure.config.socket.SocketIoExceptionListener; import lombok.RequiredArgsConstructor; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; @@ -26,6 +27,9 @@ public SocketIOServer socketIOServer(SocketIoAuthService authService) { config.setPingTimeout(socketIoProperties.getPingTimeoutMs()); config.setTransports(Transport.WEBSOCKET); config.setAuthorizationListener(authService::authorize); + + config.setExceptionListener(new SocketIoExceptionListener()); + return new SocketIOServer(config); } } diff --git a/src/main/java/com/process/clash/infrastructure/config/socket/SocketIoExceptionListener.java b/src/main/java/com/process/clash/infrastructure/config/socket/SocketIoExceptionListener.java new file mode 100644 index 000000000..164b54ab9 --- /dev/null +++ b/src/main/java/com/process/clash/infrastructure/config/socket/SocketIoExceptionListener.java @@ -0,0 +1,20 @@ +package com.process.clash.infrastructure.config.socket; + +import com.corundumstudio.socketio.listener.DefaultExceptionListener; +import io.netty.channel.ChannelHandlerContext; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +public class SocketIoExceptionListener extends DefaultExceptionListener { + + @Override + public boolean exceptionCaught(ChannelHandlerContext ctx, Throwable e) throws Exception { + // Upgrade 헤더가 없는 잘못된 요청(HTTP 등)이 올 때 발생하는 로그 제어 + if (e.getMessage() != null && e.getMessage().contains("not a WebSocket request")) { + log.warn("[Socket.IO] 비정상적인 연결 시도 차단: {} (IP: {})", + e.getMessage(), ctx.channel().remoteAddress()); + return true; // 에러 전파를 여기서 중단하여 불필요한 스택 트레이스 방지 + } + return super.exceptionCaught(ctx, e); + } +} \ No newline at end of file From 980a17e3154748bcb80d477517f126ade42c46d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=ED=99=A9=EC=A0=95=EB=B9=88?= Date: Sat, 18 Apr 2026 14:39:13 +0900 Subject: [PATCH 2/4] =?UTF-8?q?refactor:=20=EB=B0=B0=ED=8B=80=20=EC=8B=9C?= =?UTF-8?q?=EC=9E=91=EC=9D=BC=20=EA=B8=B0=EC=A4=80=20=EB=82=B4=EB=A6=BC?= =?UTF-8?q?=EC=B0=A8=EC=88=9C=20=ED=95=98=EC=97=AC=20=EC=A0=95=EB=A0=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../adapter/persistence/rival/battle/BattleJpaRepository.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/com/process/clash/adapter/persistence/rival/battle/BattleJpaRepository.java b/src/main/java/com/process/clash/adapter/persistence/rival/battle/BattleJpaRepository.java index 637ac2928..7a5bff848 100644 --- a/src/main/java/com/process/clash/adapter/persistence/rival/battle/BattleJpaRepository.java +++ b/src/main/java/com/process/clash/adapter/persistence/rival/battle/BattleJpaRepository.java @@ -49,6 +49,7 @@ AND b.id NOT IN ( LEFT JOIN rivals r ON b.fk_rival_id = r.id WHERE (r.fk_first_user_id = :userId OR r.fk_second_user_id = :userId) AND b.battle_status NOT IN ('REJECTED', 'PENDING', 'CANCELED') + ORDER BY b.started_at DESC """, nativeQuery = true) List findByUserIdWithOutRejected(@Param("userId") Long userId); @@ -124,6 +125,7 @@ AND b.end_at < NOW() LEFT JOIN rivals r ON b.fk_rival_id = r.id WHERE (r.fk_first_user_id = :userId OR r.fk_second_user_id = :userId) AND b.battle_status = 'PENDING' + ORDER BY b.started_at DESC """, nativeQuery = true) List findPendingBattlesByUserId(@Param("userId") Long userId); } \ No newline at end of file From eeeb1de6a80c00cf73f775bc34b7eb87c10e840f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=ED=99=A9=EC=A0=95=EB=B9=88?= Date: Sat, 18 Apr 2026 14:42:00 +0900 Subject: [PATCH 3/4] =?UTF-8?q?fix:=20PENDING=20=EC=83=81=ED=83=9C?= =?UTF-8?q?=EC=9D=98=20=EB=B0=B0=ED=8B=80=EC=9D=80=20=EC=83=9D=EC=84=B1=20?= =?UTF-8?q?=EA=B8=B0=EC=A4=80=20=EC=A0=95=EB=A0=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../adapter/persistence/rival/battle/BattleJpaRepository.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/process/clash/adapter/persistence/rival/battle/BattleJpaRepository.java b/src/main/java/com/process/clash/adapter/persistence/rival/battle/BattleJpaRepository.java index 7a5bff848..ed759558b 100644 --- a/src/main/java/com/process/clash/adapter/persistence/rival/battle/BattleJpaRepository.java +++ b/src/main/java/com/process/clash/adapter/persistence/rival/battle/BattleJpaRepository.java @@ -125,7 +125,7 @@ AND b.end_at < NOW() LEFT JOIN rivals r ON b.fk_rival_id = r.id WHERE (r.fk_first_user_id = :userId OR r.fk_second_user_id = :userId) AND b.battle_status = 'PENDING' - ORDER BY b.started_at DESC + ORDER BY b.created_at DESC """, nativeQuery = true) List findPendingBattlesByUserId(@Param("userId") Long userId); } \ No newline at end of file From 69b6819bf391c8155a85b1f7208d8860d0fe9fa7 Mon Sep 17 00:00:00 2001 From: chaeyn Date: Thu, 23 Apr 2026 09:03:15 +0900 Subject: [PATCH 4/4] =?UTF-8?q?fix:=20redis=20=ED=83=80=EC=9E=84=EC=95=84?= =?UTF-8?q?=EC=9B=83=20=EC=8B=9C=EA=B0=84=20=EC=B6=95=EC=86=8C,=20?= =?UTF-8?q?=EC=8A=A4=EC=BC=80=EC=A4=84=EB=9F=AC=20=ED=92=80=20=ED=99=95?= =?UTF-8?q?=EC=9E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/application.yml | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index c5a60cf6d..3ed7acdae 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -2,6 +2,11 @@ spring: main: web-application-type: servlet + task: + scheduling: + pool: + size: 10 # 각 스케줄러가 독립 스레드 사용 + datasource: url: ${DATABASE_URL} username: ${DATABASE_USERNAME} @@ -56,8 +61,8 @@ spring: host: ${REDIS_HOST:localhost} port: 6379 password: ${REDIS_PASSWORD} - connect-timeout: 30s - timeout: 30s + connect-timeout: 3s + timeout: 3s lettuce: pool: max-active: 50