일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- CS면접
- 스프링
- java
- 자바
- 단위테스트
- 스프링소켓통신
- OS
- cs지식
- 소켓통신
- 채팅구현
- 운영체제
- 테스트코드
- MongoDB
- jwt
- 기술면접
- 자바문법
- Mock
- springboot
- JPA
- Security
- 스프링부트
- Stomp
- 반효경
- socket
- 소켓
- rabbitmq
- spring
- CS
- 스프링시큐리티
- jwt토큰
- Today
- Total
목록소켓통신 (6)
Dev_Henry
spring을 이용한 캡스톤 프로젝트 진행 중 요구사항 중 채팅 기능이 있었다. 이를 구현하기 위해 spring에서 webSocket과 stomp를 사용해 구현했다. 이때 기본 내장 브로커는 안정성, 확장성 측면에서 단점이 많아 외부 브로커를 도입했다. (장애 발생시 메시지 유실, 수용가능한 세션 크기 제한, 모니터링이 어려움, 서버 분리,확장이 안됨) 찾아보니 많이 사용하는 것들이 아래의 3개이기 때문에 각각의 특징을 알아보려고 한다. 우선 아래의 세가지 모두 비동기 메시지를 사용하는 서비스들 사이에서 데이터 송수신을 의미하는 MOM(메시지 지향 미들웨어)를 구현한 메시지큐이다. 메시지 큐의 특징으로는 큐를 사용한 비동기 처리 어플리케이션과의 분리 실패에도 전체에 영향을 주지 않음 여러 프로세스가 큐에..

채팅목록 관리는 기존 사용하던 방식 그대로 Spring Data JPA와 mysql을 사용했다. 채팅내용을 관리하는 부분에서 어떤식으로 구현을 할지 고민을 많이했다. 처음에는 서버에 저장하지않고 클라이언트에만 저장하려 했으나, 어플이 꺼져있는 동안(소켓연결이 끊겨있는 동안) 온 메시지를 접속시 보여주려면 메시지큐를 다루어야 할것같은데 이 부분이 어렵기도하고 안정성이나 관리 측면을 생각해서 서버에 저장하려고 한다. 하지만 채팅 특성상 채팅데이터가 여러가지 형태로 올 수 있고, 삽입과 조회가 빈번하게 일어나기 때문에 RDB를 사용하면 성능이 떨어질듯 해서 사용해본적 없는 nosql을 써보기로 결정했다. 의존성 추가 implementation ('org.springframework.boot:spring-boo..
현재 프로젝트에서 구현하고자 하는 요구사항은 카카오톡처럼 클라이언트가 꺼져있을때 온 메시지도 받아야하고 내용을 유지시켜야하기 때문에 DB를 연결해야한다. 채팅내용은 어떤식으로 다룰지 고민이 필요하기 때문에 우선 채팅목록과 참여자 등을 관리할 수 있도록 먼저 구현한다. chatRoomDTO @Getter @Setter @NoArgsConstructor public class ChatRoomDTO { private String roomId; // 채팅방 아이디 private String roomName; // 채팅방 이름 private long userCount; // 채팅방 인원수 private List userList = new ArrayList(); public ChatRoomDTO(ChatRoom c..

기본적으로 스프링에서 내장브로커를 제공하지만, 1. 인메모리 형식으로 데이터의 유실 위험도 있고 2. spring boot서버 내에서 함께 처리하기 때문에 서버의 부담도 커진다. 3. 메시지 큐를 모니터링하기 어렵고 4. 또한 현재 프로젝트 규모에서는 아직 필요없지만, 추후 서버를 여러개 둔다면 메시지를 함께 처리할 수 없어 확장성이 떨어진다. 이러한 여러 이유들로 외부 메시지 브로커인 RabbitMQ를 도입하고자 한다. RabbitMQ 의 메시지 전달 과정 1. 송신자가 메시지를 보내면 브로커가 처리과정을 위임받는다. 2. 일종의 우체통 역할을 하는 Exchange로 먼저 전달해서 메시지를 분류한다. 3. exchange에서는 몇가지 종류가 있지만 여기서는 넘어간다. ( Topic은 라우팅 키를 패턴으..

이전 글에서 사용한 방식은 세션을 직접 관리,처리 해주어야했다. 하지만 스프링에서는 웹소켓에 STOMP를 함께 사용할 수 있는 방법을 지원해주는데, 이를 사용하면 메시지처리를 직접하지 않고 편리하게 통신을 구현할 수 있다. STOMP란 Simple Text Oriented Messaging Protocol의 약자로 쉽게 메시지를 주고 받을 수 있게 하기 위한 프로토콜이다. pub/sub 기반으로 작동하며 웹소켓만을 위한 것은 아니나 웹소켓 위에 얹어 편리하게 메시지전송을 구현할수있다. pub/sub 을 간단하게 예로들면 클라이언트들은 특정 주소(채팅방)를 구독할 수 있고, 메시지를 보낸다면 메시지브로커가 해당 주소를 구독하는 모든 클라이언트들에게 메시지를 보여주는 방식이다. stomp를 사용해 통신을 구..

스프링에서 지원하는 웹소켓을 사용하기 위해서는 아래 라이브러리를 사용한다. implementation 'org.springframework.boot:spring-boot-starter-websocket' 소켓통신을 이용하여 채팅을 구현하는 방법을 찾아보면 크게 2가지 방식이 있는데 이번 글에서는 WebSocketConfigurer을 구현하여 소켓을 직접 처리하는 방법을 다룬다. 먼저 소켓 사용을 위한 설정파일을 만든다. 해당방법은 직접 소켓처리를 하는방법이기 때문에 핸들러를 등록해야한다. 핸들러를 등록할때 소켓에 접속하기위한 경로 ("/ws")를 함께 설정해주고, 다른곳에서 접속이 가능하도록 .setAllowedOrigins("*")을 붙여 cors문제를 해결한다. @RequiredArgsConstruc..