작성
·
47
1
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문 전에 다음을 꼭 확인해주세요.
1. 강의 내용과 관련된 질문을 남겨주세요.
2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.
(자주 하는 질문 링크: https://bit.ly/3fX6ygx)
3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.
(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)
질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.
=========================================
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예/아니오)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)
[질문 내용]
안녕하세요
영한님 코드는 제가 이해한 바로는
세션 객체를 돌리는 스레드가 채팅을 다른 사람에게 전파하는 코드도 돌리는 걸로 알고 있습니다.
저는 채팅을 다른 사람에게 보내는 것을 맡은 객체를 따로 만들고 스레드도 따로 돌리게 만들었습니다.
혹시 이렇게 하는 게 좋은 건지 궁금합니다.
이걸 가능하게 하기 위해서 ConcurrentLinkedQueue를 사용했고 각 세션이 채팅을 받으면 이 queue에 채팅 내용을 넣으면 이 queue를 담당하는 스레드에서 큐를 비워가면서 채팅을 각 사용자에게 보내게 했습니다. 근데 큐가 차 있는지 확인하는 방법을 잘 몰라서 0.1초마다 while문을 돌려서 큐가 차 있는지 확인하고 차 있으면 채팅을 보내게 했습니다. 이 방식이 굉장히 마음에 안 드는데 더 좋은 방법이 뭐가 있을지 궁금합니다.
답변 1
2
안녕하세요. 사차님
1. 세션별 스레드와 메시지 전송(전파) 스레드를 분리하면, 서로 책임을 분리할 수 있습니다. 프로젝트가 단순할 때는 최소한의 구현이 효과적이지만, 프로젝트의 규모가 커지면 책임을 분리하는 것이 더 나은 선택일 수 있습니다.
2. 이 부분은 BlockingQueue로 해결할 수 있습니다. 자세한 내용은 관련해서 실전 자바 고급 1편 - 멀티스레드와 동시성 내용을 참고해주세요.
감사합니다.
안녕하세요. 사차님
이 부분은 딱 정답이 없는데요. 지금과 같이 분리하는 경우 BlockingQueue, 또는 ExecutorService, 이벤트 기반 아키텍처(Pub/Sub) 등을 고려할 수 있습니다.
감사합니다.
아 기껏 배워놓고 잊어버리고 있었네요 정말 감사합니다
혹시 보통 채팅 프로그램은 이렇게 전파하는 스레드를 계속 생성한 채로 유지하면서 채팅이 올 때마다 전달하나요? 아니면 다른 매커니즘을 사용하는지 궁금합니다.