WebSocket 삽질기 정리 — “왜 연결이 안 됐는가?”

2025. 7. 10. 02:12·개인공부정리페이지

자료구조, 디렉토리 구조가 이렇게 중요합니다.

주구장창 연결 오류떴었는데...성공했어욤!!!!!!!!!!!!!!!!!!!!!!

이게 제가 설정한 구조에요

주의할점!!!!!

**보면 디렉토리가 chat이랑 demo랑 둘다 com.example에 있죠? 근데 이러면 안됨! demo에 있는 애가 chat에 있는 파일들 전부 읽지 못하는거임!!!!! 이게 결국 문제였다.....

그럼요, 지금까지 겪으셨던 문제를 명확하게 정리해드릴게요.
이걸 그대로 회고록이나 블로그에 정리하셔도 좋습니다.

 

문제 상황 .....요약

  • 1) HTML에서 ws://192.168.94.231:50023/ws/chat 으로 WebSocket 연결 시도했지만,
  • 2) 서버에 아무 로그도 찍히지 않고,
  • 3) 웹에 접속햇을 때 f12눌러 나오는 개발자도구의 콘솔에는
    ? 연결 실패 Event {isTrusted: true, type: 'error', target: WebSocket, currentTarget: WebSocket, eventPhase: 2, …}
    에러만 나옴
  • 4) 하지만 http://192.168.94.231:50023 접속은 잘 됨....(모든 html은 항상 index로 설정하자...)

!!!!!문제 원인!!!

1. WebSocket 핸들러가 서버에 등록되지 않음

  • @Component, @Configuration 붙여도
  • @SpringBootApplication이 다른 패키지(com.example.demo)에 있어서
  • WebSocketConfig.java, ChatSocketHandler.java (→ com.example.chat에 있었음)을 스캔하지 않음

✅ 해결:

@SpringBootApplication(scanBasePackages = {"com.example.chat", "com.example.demo"})
  • Main 클래스에 직접 명시하여 수동 컴포넌트 스캔 경로 지정

 

2. WebSocket 요청은 HTTP와 다르다

  • WebSocket 연결 요청은 DispatcherServlet이 아닌,
    WebSocketHandler 에 직접 도달해야 한다
  • → afterConnectionEstablished()가 안 찍히면
    → WebSocket 설정 자체가 등록 안 된 것으로 판단 가능 (계속 아무것도 안찍히길래 당황했는데 ,,, 이것자체로 판단함)

3. 방화벽/네트워크는 아니었음 (확실히 검토 완료..진짜 열번이상은했다.)

  • netstat로 확인 → XXX_XXX_XX_XXX :50023 포트 정상적으로 LISTENING
  • 윈도우 방화벽에서 TCP 50023 인바운드 규칙도 확인
  • 확인방법: 제대로 열렸는가?
  • 클라이언트는 같은 네트워크 (핫스팟)에 연결한 상태로 진행. 이후 학교 와이파이로 진행해봤는데 잘열린다 햄복해요!!
netstat -ano | findstr 50023
 TCP    아이피주소주소주소:50023   0.0.0.0:0              LISTENING       1672

정상적으로 열린다면 이렇게 뜬다. 뒤에 listening 1672 이 숫자는 할때마다 바뀜 (스프링부트를 실행할 때 마다)

 해결을 위해 확인한 것들

점검 항목 상태

서버 포트가 열려 있는지 (netstat) ✅ LISTENING
서버 index.html 접속 가능 여부 ✅ 가능
클라이언트 → 서버 연결 시도 시 콘솔 로그 ❌ 안 찍힘 (핸들러 미등록)
WebSocketConfig.java 존재 여부 ✅ 있음
ChatSocketHandler.java에 로그 추가 ✅ 추가했지만 호출 안 됨
@Component, @Configuration, @EnableWebSocket 등 설정 ✅ 있음
WebSocket 경로 /ws/chat 매핑 확인 ❌ 등록 안 됨 → 해결 후 ✅ 됨

🛠 회고: WebSocket을 설정할 때 필수로 해야 할 것

✅ WebSocket 서버 설정 체크리스트

항목 필수 여부 예시/설명

@Configuration + @EnableWebSocket ✅ WebSocketConfig.java
WebSocketConfigurer 구현 후 registerWebSocketHandlers() 오버라이드 ✅ registry.addHandler(...
WebSocket 핸들러 클래스에 @Component ✅ 빈으로 등록되도록
@SpringBootApplication의 위치 ✅ 핸들러 클래스와 같은 상위 패키지여야 함
또는 scanBasePackages 명시 ✅ 패키지 명시적 등록
클라이언트에서 정확한 URL로 연결 ✅ ws://IP:포트/경로
서버 포트 방화벽 허용 ⚠️ 인바운드 TCP 포트 열기
서버 로그로 afterConnectionEstablished() 확인 ✅ WebSocket 성공 연결의 지표
HTML 콘솔에서 WebSocket onopen/onerror 확인 ✅ 연결 시도 여부 파악

최종정리

  • WebSocket은 "등록"되었다고 믿는 순간부터 디버깅 지옥 시작됨
  • 스프링 부트는 클래스 자동 등록이 기본이지만,
    패키지 나뉘면 scanBasePackages 꼭 써야 함!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  • 콘솔에 아무것도 안 찍히면 "아예 안 들어온 것" 이라는 걸 기억하자
  • 클라이언트는 onerror, 서버는 afterConnectionEstablished → 이 두 로그가 모든 디버깅의 시작점

'개인공부정리페이지' 카테고리의 다른 글

[트러블슈팅].. PEM키가 공개된사건  (0) 2025.11.29
MergeSort implement in C  (0) 2025.09.24
코드 포매터  (0) 2025.08.31
어노테이션 : Bean과 Autowired의 차이  (0) 2025.08.23
C++ 공부  (0) 2025.07.25
'개인공부정리페이지' 카테고리의 다른 글
  • MergeSort implement in C
  • 코드 포매터
  • 어노테이션 : Bean과 Autowired의 차이
  • C++ 공부
sihyes
sihyes
24학번 컴퓨터공학과
  • sihyes
    시혜적으로개발
    sihyes
  • 글쓰기 관리
  • 전체
    오늘
    어제
    • 분류 전체보기 (106) N
      • 단순 설정 (9)
      • 백엔드 공부(BE, AWS) (8)
        • 로그인&회원가입 (3)
        • 파일업로드&GPT (2)
      • 개인 프로젝트 (2)
        • 알바솔로몬 (1)
        • PLACO 프로젝트 (0)
      • 도서 공부(정리) (20)
        • 알고리즘 코딩 테스트 자바 편 (1)
        • SQL첫걸음 (8)
        • 코딩 자율학습 스프링 부트 3 자바 백엔드 개발 .. (6)
        • Do it! 지옥에서 온 문서 관리자 깃&깃허브 .. (5)
      • 컴퓨터공학과 (51)
        • Python - 문해프 (1)
        • Java 1 & 2 (23)
        • 컴퓨터네트워크 (3)
        • 모앱JavaScript (0)
        • Data structures (9)
        • 소프트웨어공학 (5)
        • 오픈SW플랫폼 제출용 (5)
      • 개인공부정리페이지 (7) N
        • 백준 (2)
  • 블로그 메뉴

    • 홈
    • 태그
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    ㅇ
  • 최근 댓글

  • hELLO· Designed By정상우.v4.10.4
sihyes
WebSocket 삽질기 정리 — “왜 연결이 안 됐는가?”
상단으로

티스토리툴바