목차 : https://okane-on-cliff.tistory.com/239
백엔드의 환경구축은 이렇게 했다.
1. sts 설치
2. 프로젝트 생성
3. application.properties
4. Configurer 클래스 생성
5. Dto 클래스 생성
6. 컨트롤러/핸들러 생성
먼저 프로젝트의 디렉터리 구조는 이렇다.
1. sts 설치
인터넷에서 검색해서 설치한다.
2. 프로젝트 생성
maven으로 했다. 하지만 라이브러리를 선택 이미 다해놔서 pom.xml에서 딱히 건들건 없다.
특이한 점으로는 롬복을 설치했다는 것이다 롬복은 그냥 jar파일 다운받아서 실행해서 sts 선택해서 설치하여 jar파일 끈다음 원하는 프로젝트에서 pom.xml에 라이브러리를 기술해 주기만 하면 된다.
3. application.properties
server.servlet.context-path=/realsocket
server.port=9998
이번엔 JDBC도 사용하지 않아서 별로 적을 것은 없었다.
4. Configurer 클래스 생성
import org.springframework.context.annotation.Configuration;
import org.springframework.messaging.simp.config.MessageBrokerRegistry;
import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker;
import org.springframework.web.socket.config.annotation.StompEndpointRegistry;
import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer;
@EnableWebSocketMessageBroker
@Configuration
public class SocketConfigurer implements WebSocketMessageBrokerConfigurer {
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/websocket").setAllowedOriginPatterns("*").withSockJS();
}
@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
registry.enableSimpleBroker("/topic");
}
}
registry.addEndpoint("/websocket").setAllowedOriginPatterns("*").withSockJS(); 를 살펴본다.
.addEndpoint("/websocket")은 websocket과 연결 할 수 있는 페이지로 연결해준다. 예를 들어 스프링부트를 실행하고
host-url:포트번호/context-path/[websocket] 이 프로젝트에서는 (http://localhost:9998/realsocket/websocket)을 주소창에 입력하면 websocket에 온걸 환영한다는 말 한마디가 적혀있는 페이지로 이동한다는 것을 알수 있다. 클라이언트는 이 페이지에서 서버와 핸드쉐이크를 한다.
.setAllowedOriginPatterns("*") 이부분이 없으면 에러가 난다.
.withSockJS() 이 부분덕분에 여러종류의 브라우저에서 다 websocket을 사용할 수 있다고 한다는데 그냥 써줬다
또한 이 문장에서 인터셉터를 추가해 줄 수 있다고 한다. 근데 잘모르겠어서 안썼다.
registry.enableSimpleBroker("/topic");는 후 핸들러가 메세지를 핸들러를 구독한 유저에게 매세지를 보낼 수 있게 해준다는 말이다.
5. DTO와 Controller
컨트롤러는
public static LinkedList<ChatingRoom> chatingRoomList = new LinkedList<>();
의 형태로 방목록을 가지고있고 방 정보는
Dto인 ChatingRoom 클래스로 방ID, 방이름, 참가유저목록 을 가지고 있고
Message 클래스는 메세지를 보낸사람, 내용, 시간을 저장한 Dto클래스이다.
controller
@Controller
@CrossOrigin
public class MainController {
@Autowired
SimpMessagingTemplate messagingTemplate;
public static LinkedList<ChatingRoom> chatingRoomList = new LinkedList<>();
//채팅 룸리스트를 반환해요
@GetMapping("/chatingRoomList")
@ResponseBody
public LinkedList<ChatingRoom> chatingRoomList() {
return chatingRoomList;
}
@MessageMapping("/socket/roomList")
@SendTo("/topic/roomList")
public String roomList() {
// 룸리스트를 업데이트해요
// 리턴을 null하거나 void함수로 만들면 subscribe가 아무것도 잡지 못하는거 같아요
return "";
}
}
컨트롤러 메서드하나라 소켓 핸들러하나를 예로 남겨 봤다. SimpMessagingTemplate 클래스는 convertAndSend같은 메서들르 통해 return과는 별개로 소켓핸들러를 실행 시킬 수 있는 것 같다. 컨트롤러 메서드가 그냥 보통 메서드를 호출하는 방법과 같이 호출되는 것과 다르다.
예를 들어
messagingTemplate.convertAndSend("/topic/roomList", "");
같은 명령을 실행하면 /top/roomList와 매핑된 핸들러가 실행된다.