Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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());

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

SocketIoExceptionListener를 매번 new로 직접 생성하기보다는, Spring Bean으로 등록하고 생성자 주입을 통해 사용하는 것이 좋습니다. 이는 테스트 시 Mock 객체 주입을 용이하게 하고 Spring의 의존성 주입 원칙을 따르는 방법입니다.


return new SocketIOServer(config);
}
}
Original file line number Diff line number Diff line change
@@ -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);
}
}
Comment on lines +1 to +20

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

이 클래스는 Socket.IO 어댑터의 세부 구현 사항이므로 com.process.clash.adapter.realtime.socketio 패키지로 이동하여 응집도를 높이는 것이 좋습니다. 또한, 하드코딩된 문자열을 상수로 관리하고, Spring Bean으로 관리될 수 있도록 @Component 어노테이션을 추가하는 것을 권장합니다. 마지막으로 파일 끝에 개행 문자를 추가해 주세요.

package com.process.clash.infrastructure.config.socket;

import com.corundumstudio.socketio.listener.DefaultExceptionListener;
import io.netty.channel.ChannelHandlerContext;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

@Slf4j
@Component
public class SocketIoExceptionListener extends DefaultExceptionListener {

    private static final String NOT_A_WEBSOCKET_REQUEST = "not a WebSocket request";

    @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);
    }
}

Loading