

๐กํ๋ก์ ํธ์ JSP ์ถ๊ฐํด์ ๋ชจ๋ฌ๋ก ๋์ฐ๋์ง ์ฑ๋ด์ ๋ง๋ค๋์ง ์ด๋ป๊ฒ ํ๋ฉด ๋ ๋ฏ ํ๋ค๐ก
๐ JSP ์์กด์ฑ ์ถ๊ฐTomcat Embed Jasper
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency>
๐ ํ๋ก์ ํธ ๊ตฌ์กฐ
server.port=80
spring.mvc.view.prefix=/WEB-INF/view/
spring.mvc.view.suffix=.jsp
package com.ChattingTest.config;
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 WebSocketConfig implements WebSocketMessageBrokerConfigurer {
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/websocket").withSockJS();
}
@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
registry.enableSimpleBroker("/topic");
}
}
package com.ChattingTest.controller;
import com.ChattingTest.dto.ChattingRoom;
import com.ChattingTest.dto.Message;
import jakarta.servlet.http.Cookie;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.messaging.handler.annotation.DestinationVariable;
import org.springframework.messaging.handler.annotation.MessageMapping;
import org.springframework.messaging.handler.annotation.SendTo;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PatchMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import java.util.*;
@Controller
public class MainController {
// ์ฑํ
๋ฐฉ ๋ชฉ๋ก
public static LinkedList<ChattingRoom> chattingRoomList = new LinkedList<>();
// ----------------------------------------------------
// ์ ํธ ๋ฉ์๋
// ๋ฐฉ ๋ฒํธ๋ก ๋ฐฉ ์ฐพ๊ธฐ
public ChattingRoom findRoom(String roomNumber) {
ChattingRoom room = ChattingRoom.builder().roomNumber(roomNumber).build();
int index = chattingRoomList.indexOf(room);
if(chattingRoomList.contains(room)) {
return chattingRoomList.get(index);
}
return null;
}
// ์ฟ ํค์ ์ถ๊ฐ
public void addCookie(String cookieName, String cookieValue) {
ServletRequestAttributes attr = (ServletRequestAttributes) RequestContextHolder.currentRequestAttributes();
HttpServletResponse response = attr.getResponse();
Cookie cookie = new Cookie(cookieName, cookieValue);
int maxage = 60 * 60 * 24 * 7;
cookie.setMaxAge(maxage);
response.addCookie(cookie);
}
// ๋ฐฉ ๋ฒํธ, ๋๋ค์ ์ฟ ํค ์ญ์
public void deleteCookie( ) {
ServletRequestAttributes attr = (ServletRequestAttributes)RequestContextHolder.currentRequestAttributes();
HttpServletResponse response = attr.getResponse();
Cookie roomCookie = new Cookie("roomNumber", null);
Cookie nicknameCookie = new Cookie("nickname",null);
roomCookie.setMaxAge(0);
nicknameCookie.setMaxAge(0);
response.addCookie(nicknameCookie);
response.addCookie(roomCookie);
}
// ์ฟ ํค์์ ๋ฐฉ๋ฒํธ, ๋๋ค์ ์ฐพ๊ธฐ
public Map<String, String> findCookie() {
ServletRequestAttributes attr = (ServletRequestAttributes)RequestContextHolder.currentRequestAttributes();
HttpServletRequest request = attr.getRequest();
Cookie[] cookies = request.getCookies();
String roomNumber = "";
String nickname= "";
if(cookies == null) {
return null;
}
if(cookies != null) {
for(int i=0;i<cookies.length;i++) {
if("roomNumber".equals(cookies[i].getName())) {
roomNumber = cookies[i].getValue();
}
if("nickname".equals(cookies[i].getName())) {
nickname = cookies[i].getValue();
}
}
if(!"".equals(roomNumber) && !"".equals(nickname)) {
Map<String, String> map = new HashMap<>();
map.put("nickname", nickname);
map.put("roomNumber", roomNumber);
return map;
}
}
return null;
}
// ๋๋ค์ ์์ฑ
public void createNickname(String nickname) {
addCookie("nickname", nickname);
}
// ๋ฐฉ ์
์ฅํ๊ธฐ
public boolean enterChattingRoom(ChattingRoom chattingRoom, String nickname) {
createNickname(nickname);
if(chattingRoom == null) {
deleteCookie();
return false;
} else {
LinkedList<String> users = chattingRoom.getUsers();
users.add(nickname);
addCookie("roomNumber", chattingRoom.getRoomNumber());
return true;
}
}
// ----------------------------------------------------
// ์ปจํธ๋กค๋ฌ
// ๋ฉ์ธํ๋ฉด
@GetMapping("/")
public String main() {
return "main";
}
// ์ฑํ
๋ฐฉ ๋ชฉ๋ก
@GetMapping("/chattingRoomList")
public ResponseEntity<?> chattingRoomList() {
return new ResponseEntity<LinkedList<ChattingRoom>>(chattingRoomList, HttpStatus.OK);
}
// ๋ฐฉ ๋ง๋ค๊ธฐ
@PostMapping("/chattingRoom")
public ResponseEntity<?> chattingRoom(String roomName, String nickname) {
// ๋ฐฉ์ ๋ง๋ค๊ณ ์ฑํ
๋ฐฉ๋ชฉ๋ก์ ์ถ๊ฐ
String roomNumber = UUID.randomUUID().toString();
ChattingRoom chattingRoom = ChattingRoom.builder()
.roomNumber(roomNumber)
.users(new LinkedList<>())
.roomName(roomName)
.build();
chattingRoomList.add(chattingRoom);
// ๋ฐฉ ์
์ฅํ๊ธฐ
enterChattingRoom(chattingRoom, nickname);
return new ResponseEntity<>(chattingRoom, HttpStatus.OK);
}
// ๋ฐฉ ๋ค์ด๊ฐ๊ธฐ
@GetMapping("/chattingRoom-enter")
public ResponseEntity<?> EnterChattingRoom(String roomNumber, String nickname){
// ๋ฐฉ ๋ฒํธ๋ก ๋ฐฉ ์ฐพ๊ธฐ
ChattingRoom chattingRoom = findRoom(roomNumber);
if(chattingRoom == null) {
return new ResponseEntity<>(HttpStatus.NOT_FOUND);
} else {
// ๋ฐฉ ๋ค์ด๊ฐ๊ธฐ
enterChattingRoom(chattingRoom, nickname);
return new ResponseEntity<>(chattingRoom, HttpStatus.OK);
}
}
// ๋ฐฉ ๋๊ฐ๊ธฐ
@PatchMapping("/chattingRoom-exit")
public ResponseEntity<?> ExitChattingRoom(){
Map<String, String> map = findCookie();
if(map == null) {
return new ResponseEntity<>(HttpStatus.NOT_FOUND);
}
String roomNumber = map.get("roomNumber");
String nickname = map.get("nickname");
// ๋ฐฉ๋ชฉ๋ก์์ ๋ฐฉ๋ฒํธ์ ๋ง๋ ์ ์ ๋ชฉ๋ก ๊ฐ์ ธ์ค๊ธฐ
ChattingRoom chattingRoom = findRoom(roomNumber);
List<String> users = chattingRoom.getUsers();
// ๋๋ค์ ์ญ์
users.remove(nickname);
// ์ฟ ํค์์ ๋๋ค์๊ณผ ๋ฐฉ๋ฒํธ ์ญ์
deleteCookie();
// ์ ์ ๊ฐ ํ๋ช
๋ ์๋ค๋ฉด ๋ฐฉ ์ญ์
if(users.size() == 0) {
chattingRoomList.remove(chattingRoom);
}
return new ResponseEntity<>(chattingRoom, HttpStatus.OK);
}
// ์ฐธ๊ฐ ์ค์ด์๋ ๋ํ๋ฐฉ
@GetMapping("/chattingRoom")
public ResponseEntity<?> chattingRoom() {
// ์ฟ ํค์ ๋๋ค์๊ณผ ๋ฐฉ๋ฒํธ๊ฐ ์๋ค๋ฉด ๋ํ์ค์ด๋ ๋ฐฉ์ด ์๋๊ฒ
Map<String, String> map = findCookie();
if(map == null) {
return new ResponseEntity<>(HttpStatus.OK);
}
String roomNumber = map.get("roomNumber");
String nickname = map.get("nickname");
ChattingRoom chattingRoom = findRoom(roomNumber);
if(chattingRoom == null) {
deleteCookie();
return new ResponseEntity<>(HttpStatus.NOT_FOUND);
} else {
Map<String, Object> map2 = new HashMap<>();
map2.put("chattingRoom", chattingRoom);
map2.put("myNickname", nickname);
return new ResponseEntity<>(map2, HttpStatus.OK);
}
}
// ----------------------------------------------------
// ๋ฉ์ธ์ง ์ปจํธ๋กค๋ฌ
// ์ฌ๊ธฐ์ ๋ฉ์ธ์ง๊ฐ ์ค๋ฉด ๋ฐฉ๋ชฉ๋ก ์
๋ฐ์ดํธ
@MessageMapping("/socket/roomList")
@SendTo("/topic/roomList")
public String roomList() {
return "";
}
// ์ฑํ
๋ฐฉ์์ ๋ฉ์ธ์ง ๋ณด๋ด๊ธฐ
@MessageMapping("/socket/sendMessage/{roomNumber}")
@SendTo("/topic/message/{roomNumber}")
public Message sendMessage(@DestinationVariable String roomNumber, Message message) {
return message;
}
// ์ฑํ
๋ฐฉ์ ์
์ฅ ํด์ฅ ๋ฉ์ธ์ง ๋ณด๋ด๊ธฐ
@MessageMapping("/socket/notification/{roomNumber}")
@SendTo("/topic/notification/{roomNumber}")
public Map<String, Object> notification(@DestinationVariable String roomNumber, Map<String, Object> chattingRoom) {
return chattingRoom;
}
}
package com.ChattingTest.dto;
import lombok.Builder;
import lombok.Data;
import java.util.LinkedList;
import java.util.Objects;
@Data
@Builder
public class ChattingRoom {
private String roomNumber; // ๋ฐฉ ๋ฒํธ
private String roomName; // ๋ฐฉ ์ด๋ฆ
private LinkedList<String> users; // ์ ์ ๋ชฉ๋ก
// ์ฑํ
๋ฐฉ ๋ชฉ๋ก์์ ๋ฐฉ ๋ฒํธ๋ก ๋ฐฉ์ ์ฐพ์ ์ ์๊ฒ equals์ hashCode๋ฅผ ์ค๋ฒ๋ผ์ด๋ฉ
// ์์ฑ์๋ฅผ ์ฌ์ฉํ์ง ์๊ณ Builderํจํด์ ์ฌ์ฉ
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
ChattingRoom other = (ChattingRoom) obj;
return Objects.equals(roomNumber, other.roomNumber);
}
@Override
public int hashCode() {
return Objects.hash(roomNumber);
}
}
package com.ChattingTest.dto;
import lombok.Data;
import java.util.Date;
@Data
public class Message {
private String message;
private String nickname;
private Date date;
Message(){
date = new Date();
}
}
@charset "UTF-8";
* {
margin: 0;
padding: 0;
}
li {
list-style: none;
}
html {
font-size: 62.5%;
}
.swal-footer {
text-align: center;
}
/* ์ฑํ
๋ฐฉ ๋ชฉ๋ก */
main {
width: 35vw;
min-width: 300px;
height: 90vh;
border: 1px solid #000;
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
}
main h1 {
font-size: 2rem;
padding: 10px;
height: 50px;
box-sizing: border-box;
}
main .new_chat {
position: absolute;
top: 10px;
right: 10px;
border-radius: 3px;
padding: 3px;
background: #fff;
cursor: pointer;
}
main .new_chat:hover {
background: #eee;
}
main nav {
font-size: 1.6rem;
display: flex;
text-align: center;
margin-bottom: 5px;
padding: 0 7px;
}
main nav > span:first-child {
width: 80%;
}
main nav > span:last-child {
width: 20%;
}
main ul {
overflow-y: auto;
max-height: calc(100% - 50px);
}
main li {
font-size: 1.6rem;
width: 100%;
height: 70px;
padding: 7px;
box-sizing: border-box;
display: flex;
justify-content: space-between;
}
main li:hover {
background: #eee;
}
main .chat_title {
font-weight: bold;
width: 80%;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
main .chat_count {
width: 20%;
text-align: center;
}
/* ์ฑํ
๋ฐฉ ๋ชฉ๋ก */
/* ์ฑํ
๋ฐฉ ์ */
.chat {
width: 50vw;
min-width: 300px;
height: 90vh;
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
z-index: 10;
display: none;
}
.chat > div {
height: 100%;
display: flex;
}
.chat .chat_body {
background: rgb(195, 204, 221);
height: 100%;
width: 70%;
order: 1;
border: 1px solid #000;
position: relative;
}
.chat h2 {
font-size: 2rem;
padding: 10px;
height: 50px;
box-sizing: border-box;
text-align: center;
background: #eee;
}
.chat .chat_back {
font-size: 2rem;
width: 50px;
height: 50px;
position: absolute;
top: 0;
left: 0;
border: none;
cursor: pointer;
}
.chat ul.chat_list {
overflow-y: auto;
height: calc(100% - 150px);
box-sizing: border-box;
padding: 5px 0;
}
.chat li {
font-size: 1.5rem;
}
.chat li > div {
padding: 10px;
display: flex;
}
.chat li .notification {
text-align: center;
}
.chat li .notification span {
margin: 0 auto;
border-radius: 15px;
padding: 5px 10px;
background: #ae9191;
color: #fff;
}
.chat li > div .nickname {
padding: 3px;
}
.chat li > div .message {
display: flex;
}
.chat .chat_me {
justify-content: end;
}
.chat .chat_other {
justify-content: start;
}
.chat .chat_other .chat_in_time {
order: 1;
}
.chat .chat_in_time {
font-size: 1.3rem;
margin: 0 5px;
display: flex;
align-items: flex-end;
}
.chat .chat_content {
padding: 5px;
border-radius: 3px;
box-shadow: 0px 2px 3px 0px rgb(0 0 0 / 25%);
display: inline-block;
max-width: 250px;
max-height: 400px;
overflow-y: auto;
word-break: break-all;
}
.chat .chat_me .chat_content {
background: yellow;
}
.chat .chat_other .chat_content {
background: #fff;
}
.chat .chat_input {
height: 100px;
display: flex;
background: #fff;
}
.chat_input .chat_input_area {
width: 87%;
}
.chat_input .chat_input_area textarea {
width: 100%;
height: 100%;
border: none;
resize: none;
padding: 8px;
box-sizing: border-box;
}
.chat_input .chat_input_area textarea:focus {
outline: none;
}
.chat_input .chat_button_area {
width: 13%;
}
.chat_input .chat_button_area button {
background: yellow;
border: 1px solid #ddd;
border-radius: 3px;
padding: 5px;
width: 90%;
margin-top: 10px;
cursor: pointer;
}
.chat .chat_users {
border: 1px solid #ddd;
width: 30%;
height: 300px;
/* position: absolute;
right: 101%;
top: 0; */
margin-right: 3px;
}
/* ์ฐธ๊ฐ์ธ์ */
.chat .chat_users h2 {
font-size: 1.6rem;
}
.chat .chat_users .chat_nickname {
font-size: 1.6rem;
height: calc(100% - 50px);
overflow: auto;
}
.chat .chat_users .chat_nickname li {
padding: 5px;
}
/* ์ฐธ๊ฐ์ธ์ */
/* ์ฑํ
๋ฐฉ ์ */
@media(max-width: 1024px) {
html {
font-size: 60%;
}
main {
width: 99vw;
}
.chat {
width: 99vw;
}
}
$(document).ready(function(){
// ๋ฐฉ ๋ชฉ๋ก ๊ทธ๋ฆฌ๊ธฐ
const listHtml = function(roomList) {
let listHtml = "";
for(let i=roomList.length-1;i>=0;i--) {
listHtml += `
<li data-room_number=${roomList[i].roomNumber}>
<span class="chat_title">${roomList[i].roomName }</span>
<span class="chat_count">${roomList[i].users.length}๋ช
</span>
</li>`;
}
$("main ul").html(listHtml);
}
// ์ฑํ
๋ฐฉ ๋ชฉ๋ก ๋ถ๋ฌ์ค๊ธฐ
const chattingRoomList = function(){
$.ajax({
url: "/chattingRoomList",
type: "GET",
})
.then(function(result){
listHtml(result)
})
.fail(function(){
alert("์๋ฌ๊ฐ ๋ฐ์ํ์ต๋๋ค");
})
}
const socket = new SockJS('/websocket');
const stomp = Stomp.over(socket);
stomp.debug = null; // stomp ์ฝ์์ถ๋ ฅ X
// ๊ตฌ๋
์ ์ทจ์ํ๊ธฐ์ํด ๊ตฌ๋
์ ์์ด๋ ์ ์ฅ
const subscribe = [];
// ๋ชจ๋ ๊ตฌ๋
์ทจ์ํ๊ธฐ
const subscribeCancle = function() {
const length = subscribe.length;
for(let i=0;i<length;i++) {
const sid = subscribe.pop();
stomp.unsubscribe(sid.id);
}
}
// ๋ฉ์ธ ํ๋ฉด
const main = function() {
$("main").show();
// ๊ธฐ์กด ๊ตฌ๋
์ทจ์
subscribeCancle();
// ์ฑํ
์ค์ด์๋ ๋ฐฉ์ด ์์๋
const room = chattingRoom();
if(room) {
return;
}
const subscribeId = stomp.subscribe("/topic/roomList", function(){
// "/topic/roomList"์์ ๋ฉ์ธ์ง๊ฐ ์์๋ ์คํํ ํจ์
chattingRoomList();
});
subscribe.push(subscribeId);
chattingRoomList();
};
stomp.connect({}, function(){
main();
});
// ----------------- ๋ฉ์ธํ๋ฉด ---------------------------
// ----------------- ์ฑํ
๋ฐฉ ---------------------------
const info = (function(){
let nickname = "";
let roomNumber = "";
const getNickname = function() {
return nickname;
}
const setNickname = function(set){
nickname = set;
}
const getRoomNumber = function() {
return roomNumber;
}
const setRoomNumber = function(set) {
roomNumber = set;
}
return {
getNickname : getNickname,
setNickname : setNickname,
getRoomNumber : getRoomNumber,
setRoomNumber : setRoomNumber,
}
})();
const errorMSG = function(result){
if(result.status == 404) {
alert("์ข
๋ฃ๋์๊ฑฐ๋ ์๋ ๋ฐฉ์
๋๋ค");
} else {
alert("์๋ฌ๊ฐ ๋ฐ์ํ์ต๋๋ค");
}
location.href = "/";
}
// ์ฐธ๊ฐ์ ๊ทธ๋ฆฌ๊ธฐ
const userList = function(users){
$(".chat .chat_users .user").text(users.length + "๋ช
");
let userHtml = "";
for(let i=0;i<users.length;i++) {
userHtml += `
<li>${users[i] }</li>`;
}
$(".chat .chat_nickname ul").html(userHtml);
}
// ๋ฉ์ธ์ง ๊ทธ๋ฆฌ๊ธฐ
const chatting = function(messageInfo){
let nickname = messageInfo.nickname;
let message = messageInfo.message;
message = message.replaceAll("\n", "<br>").replaceAll(" ", " ");
const date = messageInfo.date;
const d = new Date(date);
const time = String(d.getHours()).padStart(2, "0")
+ ":"
+ String(d.getMinutes()).padStart(2, "0");
let sender = "";
if(info.getNickname() == nickname) {
sender = "chat_me";
nickname = "";
} else {
sender= "chat_other";
}
const chatHtml = `
<li>
<div class=${sender }>
<div>
<div class="nickname">${nickname }</div>
<div class="message">
<span class=chat_in_time>${time }</span>
<span class="chat_content">${message }</span>
<span>
</div>
</div>
</li>`;
$(".chat ul.chat_list").append(chatHtml);
$(".chat ul").scrollTop($(".chat ul")[0].scrollHeight);
}
// ์ฑํ
๋ฐฉ ๊ตฌ๋
const chattingConnect = function(roomNumber){
// ๊ธฐ์กด ๊ตฌ๋
์ทจ์
subscribeCancle();
// ๋ฉ์ธ์ง๋ฅผ ๋ฐ์ ๊ฒฝ๋ก
const id1 = stomp.subscribe("/topic/message/" + roomNumber, function(result){
const message = JSON.parse(result.body);
// ๋ฉ์ธ์ง๊ฐ ์์๋ ์คํํ ํจ์
chatting(message);
})
// ์
์ฅ,ํด์ฅ ์๋ฆผ์ ๋ฐ์ ๊ฒฝ๋ก
const id2 = stomp.subscribe("/topic/notification/" + roomNumber, function(result){
const room = JSON.parse(result.body);
const message = room.message;
// ๋ฉ์ธ์ง๊ฐ ์์๋ ์คํํ ํจ์
userList(room.users);
const chatHtml = `
<li>
<div class="notification">
<span>${message}</span>
</div>
</li>`;
$(".chat ul.chat_list").append(chatHtml);
$(".chat ul").scrollTop($(".chat ul")[0].scrollHeight);
})
subscribe.push(id1);
subscribe.push(id2);
}
// ์ฑํ
๋ฐฉ ์ธํ
const initRoom = function(room, nickname) {
// ๋ฐฉ ๋ชฉ๋ก ์
๋ฐ์ดํธ
stomp.send("/socket/roomList");
$("main").hide();
info.setNickname(nickname);
info.setRoomNumber(room.roomNumber);
$(".chat").show();
$(".chat .chat_title").text(room.roomName);
userList(room.users);
chattingConnect(room.roomNumber);
$(".chat_input_area textarea").focus();
}
// ๋ฉ์ธ์ง ๋ณด๋ด๊ธฐ
const sendMessage = function(){
const message = $(".chat_input_area textarea");
if (message.val() == "") {
return;
}
const roomNumber = info.getRoomNumber();
const nickname = info.getNickname();
const data = {
message : message.val(),
nickname : nickname,
}
stomp.send("/socket/sendMessage/" + roomNumber, {}, JSON.stringify(data));
message.val("");
}
$(".chat_button_area button").click(function() {
sendMessage();
$(".chat_input_area textarea").focus();
})
$(".chat_input_area textarea").keypress(function(event) {
if (event.keyCode == 13) {
if (!event.shiftKey) {
event.preventDefault();
sendMessage();
}
}
})
// ๋๋ค์ ๋ง๋ค๊ณ ์ฑํ
๋ฐฉ ๋ค์ด๊ฐ๊ธฐ
const enterChattingRoom = function(roomNumber) {
swal({
text: "์ฌ์ฉํ์ค ๋๋ค์์ ์
๋ ฅํด์ฃผ์ธ์",
content: "input",
buttons: ["์ทจ์", "ํ์ธ"],
closeOnClickOutside : false
})
.then(function(nickname){
if(nickname) {
const data = {
roomNumber : roomNumber,
nickname : nickname
}
$.ajax({
url: "/chattingRoom-enter",
type: "GET",
data: data,
})
.then(function(room){
initRoom(room, nickname);
// ์ฑํ
๋ฐฉ ์ฐธ๊ฐ ๋ฉ์ธ์ง
room.message = nickname + "๋์ด ์ฐธ๊ฐํ์
จ์ต๋๋ค";
stomp.send(
"/socket/notification/" + roomNumber, {},
JSON.stringify(room));
})
.fail(function(result){
errorMSG(result);
})
}
})
}
// ์ ์ฑํ
๋ฐฉ ๋ง๋ค๊ธฐ
const createRoom = function(roomName) {
swal({
text: "์ฌ์ฉํ์ค ๋๋ค์์ ์
๋ ฅํด์ฃผ์ธ์",
content: "input",
buttons: ["์ทจ์", "ํ์ธ"],
closeOnClickOutside : false
})
.then(function(nickname){
if(nickname) {
const data = {
roomName : roomName,
nickname : nickname
}
$.ajax({
url: "/chattingRoom",
type: "POST",
data: data,
})
.then(function(room){
initRoom(room, nickname)
})
.fail(function(){
alert("์๋ฌ๊ฐ ๋ฐ์ํ์ต๋๋ค");
})
}
})
}
$(".new_chat").click(function(){
swal({
text: "๋ฐฉ ์ด๋ฆ์ ์
๋ ฅํด์ฃผ์ธ์",
content: "input",
buttons: ["์ทจ์", "ํ์ธ"],
closeOnClickOutside : false
})
.then(function(roomName){
if(roomName) {
createRoom(roomName);
}
})
})
$(document).on("dblclick", "main li", function(){
const roomNumber = $(this).data("room_number");
enterChattingRoom(roomNumber);
})
// ์ฑํ
๋ฐฉ ๋๊ฐ๊ธฐ
$(".chat_back").click(function() {
swal({
text: "๋ํ๋ฐฉ์์ ๋๊ฐ๊น์?",
buttons: ["์ทจ์", "ํ์ธ"]
})
.then(function(result){
if(result) {
$.ajax({
url: "/chattingRoom-exit",
type: "PATCH",
})
.then(function(room){
const roomNumber = info.getRoomNumber();
if(room.users.length != 0) {
// ์ฑํ
๋ฐฉ ๋๊ฐ๊ธฐ ๋ฉ์ธ์ง
room.message = info.getNickname() + "๋์ด ํด์ฅํ์
จ์ต๋๋ค";
stomp.send(
"/socket/notification/" + roomNumber, {},
JSON.stringify(room));
}
// ์ฑํ
๋ฐฉ ๋ชฉ๋ก ์
๋ฐ์ดํธ
stomp.send("/socket/roomList");
main();
$(".chat").hide();
$(".chat ul.chat_list").html("");
info.setRoomNumber("");
info.setNickname("");
})
.fail(function(){
errorMSG();
})
}
})
})
// ๋ํ ์ค์ด๋ ๋ฐฉ
const chattingRoom = function (){
let returnRoom = null;
$.ajax({
url: "/chattingRoom",
type: "GET",
async: false,
})
.then(function(result){
if(result != "") {
const room = result.chattingRoom;
const nickname = result.myNickname;
initRoom(room, nickname);
returnRoom = result;
}
})
.fail(function(result){
errorMSG(result);
})
return returnRoom;
};
}) // document.ready
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>์ฑํ
</title>
<link rel="stylesheet" href="/css/main.css">
</head>
<body>
<!-- ์ฑํ
๋ฐฉ ๋ชฉ๋ก -->
<main>
<h1>์ฑํ
๋ฐฉ</h1>
<button class="new_chat">์ ์ฑํ
๋ฐฉ ๋ง๋ค๊ธฐ</button>
<nav>
<span>๋ฐฉ ์ ๋ชฉ</span>
<span>์ธ์</span>
</nav>
<hr>
<ul>
<li>
<!--
<span class="chat_title"></span>
<span class="chat_count"></span>
-->
</li>
</ul>
</main>
<!-- ์ฑํ
๋ฐฉ ๋ชฉ๋ก -->
<!-- ์ฑํ
๋ฐฉ ์
์ฅ -->
<div class="chat">
<div>
<div class="chat_body">
<h2 class="chat_title">1๋ฒ๋ฐฉ</h2>
<button class="chat_back">โ</button>
<ul class="chat_list">
<li>
<!-- <div class="notification">
<span></span>
</div> -->
</li>
</ul>
<div class="chat_input">
<div class="chat_input_area">
<textarea></textarea>
</div>
<div class="chat_button_area">
<button>์ ์ก</button>
</div>
</div>
</div>
<div class="chat_users">
<h2>
์ฐธ๊ฐ์ธ์
<span class="user"></span>
</h2>
<div class="chat_nickname">
<ul>
<li>
</li>
</ul>
</div>
</div>
</div>
</div>
<!-- ์ฑํ
๋ฐฉ ์
์ฅ -->
<!-- sock js -->
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/sockjs-client/1.5.2/sockjs.min.js"></script>
<!-- STOMP -->
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/stomp.js/2.3.3/stomp.min.js"></script>
<script src="https://unpkg.com/sweetalert/dist/sweetalert.min.js"></script>
<script type="text/javascript" src="http://code.jquery.com/jquery-latest.min.js"></script>
<script src="/js/main.js"></script>
</body>
</html>
- ๋ฉ์ธํ๋ฉด์ ์ ์ํ๋ฉด ์น์์ผ์ ์ฐ๊ฒฐํ๊ณ /roomList๋ฅผ ๊ตฌ๋
- ์ฌ์ฉ์๊ฐ ๋ฐฉ์ ๋ง๋ค๋ฉด /roomList๋ก ๋ฉ์ธ์ง๋ฅผ ๋ณด๋ด ์๋ก์ด ๋ฐฉ์ด ๋ง๋ค์ด์ก๋ค๋ ๊ฑธ ์๋ฆผ
- ๋ฉ์ธํ๋ฉด์ ์๋ ์ฌ์ฉ์๋ค์ /roomList๋ก ๋ฉ์ธ์ง๋ฅผ ๋ฐ์ผ๋ฉด ๋ฐฉ๋ชฉ๋ก์ ๋ถ๋ฌ์ด
- ๋ฐฉ์ ๋ง๋ค๊ฑฐ๋ ๋ค๋ฅธ์ฌ๋์ด ๋ง๋ ๋ฐฉ์ ๋ค์ด๊ฐ ๊ฒฝ์ฐ /roomList์ ๊ตฌ๋ ์ ์ทจ์ํ๊ณ /message/๋ฐฉ๋ฒํธ(UUID)๋ฅผ ๊ตฌ๋
- ๋ฐฉ ์์์ ๊ฐ์ ๋ฐฉ๋ฒํธ๋ฅผ ๊ตฌ๋ ํ ์ฌ๋๋ผ๋ฆฌ ๋ฉ์ธ์ง๋ฅผ ์ฃผ๊ณ ๋ฐ์ ์ ์์
