자료구조, 디렉토리 구조가 이렇게 중요합니다.
주구장창 연결 오류떴었는데...성공했어욤!!!!!!!!!!!!!!!!!!!!!!

이게 제가 설정한 구조에요
주의할점!!!!!
**보면 디렉토리가 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 |