
단순히 웹소켓 구현해보고자 스프링에서 지원하는 웹소켓 의존성을 추가하여 진행하였다.
로깅을 보고자 롬복을 추가하였음
ConcurrentHashMap 사용이유 : WebSocket은 실시간 양방향 통신을 지원하는 프로토콜로, 다수의 클라이언트가 동시에 연결하여 메시지를 주고받는 경우가 많습니다. 이러한 환경에서는 여러 스레드가 동시에 세션 정보에 접근하고 수정할 수 있으므로, 동시성 문제를 고려해야합니다.
ConcurrentHashMap은 멀티 스레드 환경에서 안전하게 사용할 수 있도록 설계된 맵 자료구조 이다. 일반 HashMap 은 멀티스레드 환경에서 안전하지않지만 ConcurrentHashMap은 내부적으로 여러개의 세그먼트를 나누어 관리하고 , 각 세그먼트에 락을 사용하여 동시성 문제를 해결한다.
각 세그먼트는 독립적인 작은 HashMap 처럼 동작하며, 자체적인 락을 가지고있다. 예를들어 스레드 A가 세그먼트 1에 접근하고 스레드 B가 세그먼트 2에 접근하는 경우, 두 스레드는 서로의 작업에 영향을 주지않고 동시에 작업을 수행할 수 있다.
*동시성 문제란 -> 멀티스레드 환경에서 여러스레드가 동시에 같은 데이터에 접근하여 변경하려고할 때 예상치 못한 결과가발생하는문제를 말한다. 예를 들어 , 두 스레드가 동시에 같은 맵에 데이터를 추가하거나 삭제하려고 하면 데이터가 손상되거나 예외가 발생할 수 있다.
HashMap이 멀티스레드 환경에서 안전하지 않은 이유 -> 대표적으로 ConcurrentHashMap 처럼 세그먼트,독립적인 락 같은 안전장치가 없는게 이유이며 HashMap은 단일 락을 사용하여 전체 맵에 대핸 동기화를 수행한다.
즉, 하나의 스레드가 HashMap에 접근하여 작업을 수행하는 동안 다른 스레드는 HashMap에 접근 할수 없다.
이는 멀티 스레드 환경에서 성능저하에 직결된다. 또한 동시수정에 대한 안전 장치가 없어 여러 스레드가 동시에 HashMap을 수정하려고 할 때 데이터 불일치나 예외가 발생 할 수 있다.
예를들어 한 스레드가 HashMap을 순회하는 동안 다른 스레드가 HashMap의 요소를 추가하거나 삭제하면, 예외가 발생하거나 잘못된 결과가 나올 수 있다. 다만, 접속자 수가 많지않거나 세션정보 수정이 많지 않을경우 굳이 반드시 concurrentHashMap을 써야하는것은 아니다. 하지만 권장되기에 일부러라도 쓰는것이 맞을거같다.
'개인스터디' 카테고리의 다른 글
Javascript 몽고 DB 연결하는법(노드) (0) | 2024.10.27 |
---|---|
Mybatis 매핑 관련 문제 (0) | 2024.10.23 |
Null Exception 관련 (0) | 2024.10.17 |
websocket (feat. stomp) 에는 JWT 어떻게 사용하나? (0) | 2024.09.27 |
WebSocket (feat. stomp) - 1 - (0) | 2024.07.31 |
이제 갓 시작한 개발자 블로그 계속 발전하겠습니다. 최예나 팬입니다.
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!