Spring MVC에 웹소켓 집어넣기 1
Python이랑 Flask로 프로젝트 진행할 때는 환경설정같은 에러가 난 적이 없어서 정말 수월하게 했는데 Spring는... (묵념)
환경설정 때문에 계속 톰캣이 난리칠 때 현기증나고 너무 어지럽고... 자바 수업 둘쨋날에 선생님이 이진법 발언을 했던 순간 생각나고 (수포자 문과생) 당장 뛰쳐나가고 싶지만 오기 생겨서 더 이겨먹고싶고...
어쨌든 저런 구구절절 환경설정을 전부 실패하고 이클립스(진짜 멍멍ㅇㅣ같이힘들다 이클립스 환경설정)를 집어던진채 인텔리제이를 활용해서 구글링과 유튜브의 도움을 받아 골고루 다 시도해 본 결과 성공한 코드가 있어서 일단 잊어버리기 전에 백업을 해두기로 했다. 아직 수정중인 코드이기 때문에 제대로 정리되는대로 수정하겠음.
이하는 무지성 삽입의 나쁜 예(나). 코드로 누빔이불 짜는 것을 보여드립니다!
스프링은 디펜던시 어쩌구가 가장 중요하다고 하더라고요. 왜인지 모르겠음. 와 진짜 공부할거 개많다... 그치...
진짜 개념 정리 누가 ㅎ해줬으면 좋겠다 ㅠ 이런 ... 이런 상태로 나 취직이 가능한가? 눈물고여.
우선 pom.xml에다가 디펜던시를 추가해줬다! 웹소켓을 사용하기 위해서 해줘야 하는 친구들이라고 함.
<dependency>
<groupId>javax.websocket</groupId>
<artifactId>javax.websocket-api</artifactId>
<version>1.1</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-websocket</artifactId>
<version>4.2.4.RELEASE</version>
</dependency>
와 나 코드같은거 구경할 때 이렇게 앞뒤없이 중간만 갖다 잘라넣는 예제 정말 너무 고통스러웠는데 말입니다(끼워넣을 자리를 못 찾아서) 막상 글쓴이 입장이 되니 나만 알아보면 되는 그런 느낌이네... 그치만 미래의 나는 못 알아볼 것 같으니 완성하면 꼭 게시글 제대로 수정하기 응응
그리고 servlet-context.xml에다가 웹소켓 핸들러를 삽입해준다.
하면서 네임스페이스 설정을 해주어야 하는데 이클립스는 네임스페이스가 별도로 존재하는 반면 인텔리제이는 따로 있지 않아서 Alt + Enter의 도움을 받았다. 똑똑이제이 최고!
<beans:bean id="핸들러 이름" class="여긴 핸들러 클래스의 경로가 들어가야 한다." />
<websocket:handlers>
<websocket:mapping handler="핸들러 이름" path="/WebEcho" />
<websocket:handshake-interceptors>
<beans:bean
class="org.springframework.web.socket.server.support.HttpSessionHandshakeInterceptor"/>
</websocket:handshake-interceptors>
</websocket:handlers>
저기 대충 알아서 잘 넣었었는데 아직도 path 이 친구의 역할이 뭔지 잘 모름. 내일 한번 찾아봐야겠다.
그리고 핸들러 클래스를 만들어서 TextWebSocketHandler를 상속받으며 메서드 친구들을 불러옴!
나중에 컨트롤러에서 소환할 때 경로만 맞춰주면 패키지 위치는 크게 상관이 없는 것 같다.
public class WebSocketHandler extends TextWebSocketHandler {
//이 친구에다가 유저들이 떠든 메시지를 삽입함
List<WebSocketSession> sessions = new ArrayList<>();
@Override
public void afterConnectionEstablished(WebSocketSession session) throws Exception {
//여기서 집어넣어주고
sessions.add(session);
}
@Override
protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
for(WebSocketSession sess : sessions){
TextMessage msg = new TextMessage(message.getPayload());
//여기다 새로 넣어주면 이제 클라이언트로 메시지가 전송됨!
sess.sendMessage(msg);
}
}
@Override
public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
//여긴 접속이 끊길 때 오는 메서드임
}
}
저기 메서드에 파라미터로 들어가는 친구들을 보면 세션이랑 메시지 막 이런 애들이 있는데 얘네가 바로 유저의 세션 아이디나 전송하는 메시지 같은걸 담고 있는 친구들이다. 저 친구들을 적은 채로 .이나 마우스를 갖다대면 가지고 있는 메서드들이 막 튀어나오는데 약간 어릴때 레고놀이 하는거 생각나고 재밌다.
session의 경우 getId()하면 세션 아이디가 나오고
message의 경우 getPayLoad()를 해야 안쪽에 있는 전송된 메시지가 뜬다.
jsp 페이지는 아직 이해가 덜 되어서 좀 더 고민을 해봐야 함...
오늘은 메시지 보내면 화면에 뜨는 것 까지 했는데 내일은 채팅방 모습을 갖춘 상태까지 진행할 수 있으면 좋겠다.