웹을 통해서 서버에 접속하여 해당 웹에 접속한 사람끼리 익명으로 대화를 나눌 수 있는 시스템.
USERS
- 웹 사이트 접속
- 사용자명 입력 (입력하지 않을 시 임의의 익명 닉네임으로 설정 됨)
- 채팅 텍스트 칸에 텍스트 입력 후, 전송 버튼을 누르면 클라이언트의 메세지 전송
SERVER
- 임의의 클라이언트 A 접속시 A에게 이름을 받아와 웹에 접속한 모든 클라이언트에게 입장 메세지 표시
- 임의의 클라이언트 A가 메세지 전송 시 모든 클라이언트에게 해당 메세지와 해당 클라이언트의 이름 표시
- 임의의 클라이언트 A 퇴장시 웹에 접속한 모든 클라이언트에게 퇴장 메세지 표시
송진우
- 백엔드 서버 구축
- 프론트엔드 코드 일부 수정
- 보고서, 회의록
김동욱
- 프론트 HTML 템플릿 검색 후 업로드
- HTML 템플릿에서 필요없는 부분 제거 및 약간의 수정
- 발표 자료 프리젠테이션 제작
정민우
- HTML 템플릿에 필요한 코드를 추가 및 수정
- CSS 일부 수정
- 발표 자료 프리젠테이션 제작
BACK
FRONT
- HTML
- CSS
- javascript
Backend
Frontend
node.js 와 socket.io의 라이선스와 동일한 MIT License 적용.
html/css 부분이 K사의 SNS 앱의 색감과 비슷하지만 '색감'에 대한 저작권은 따로 존재하지 않음.
참고자료: 색감
일반적으로 업데이트 한 코드를 깃허브 원격저장소에 업로드 하기위해서 해당 명령어를 사용하여 업로드함.
프로젝트에 참가하는 인원 모두 해당 프로젝트를 fork해서 본인 저장소에 둔 후, branch로 자신의 몇번째 패치인지 구분,
패치 한 이후에 PR을 보내서 merge해주는 식으로 협업을 진행함.
깃허브의 장점인 버전 관리를 사용자들도 느낄 수 있도록 하기 위해서 큰 기능이 업데이트 될 때 마다 버전을 구분하여 release 시킴
pre-release, lateset-release 사용은 코드가 단순하여 심각한 오류가 발생할 일이 없고, 사용하는 유저가 한정되어있으니,
stable version, latese version같은것을 구분할 필요가 없다고 생각했기 때문.
코드의 문제를 발견하는데, 팀 프로젝트를 같이 하는 팀원들끼리의 메신저를 사용하여 오류를 찾아내고 수정해도 좋았겠지만,
깃허브의 issue를 사용하게 되면,
해당 issue가 발생한다는 사실, 어떻게 혹은 언제 고쳐졌나 하는 사실, 그리고 여러 기능을 첨가하여 한눈에 볼 수 있다는 점
이런 이유들 때문에 github의 issue 기능을 팀 프로젝트에 사용하게 되었다.
// getting express module
const express = require('express')
// getting socket.io module
const socket = require('socket.io')
// getting node.js standard module
const path = require('path')
const http = require('http')
const fs = require('fs')
const app = express() // construct express object
const server = http.createServer(app) // construct http server
const io = socket(server) // binding the server
써야 할 모듈을 불러오고, http 서버를 생성하고 서버를 소켓에 바인딩 하는 과정
io.on('connection', function(socket) {
socket.on('newUser', function(name){
console.log(name + " connect");
socket.name = name;
io.emit('announce', name + " 가 접속했습니다.");
});
socket.on('chatting', function(data){
console.log(data);
const {name, msg} = data;
socket.name = name;
io.emit('chatting', data)
});
socket.on('disconnect', function(){
console.log(socket.name + " disconnect");
io.emit('announce', socket.name + " 가 퇴장했습니다.");
})
});
이벤트를 세가지로 나누어서 구분함
- 'newUser'
- 클라이언트가 접속하였을 때 오는 이벤트
- 'chatting'
- 클라이언트가 채팅할 때 오는 이벤트
- 'disconnect'
- 클라이언트가 접속을 끊었을 때 오는 이벤트
const socket = io();
const nickname = document.querySelector('#nickname');
const chatList = document.querySelector('.chatting-list');
const chatInput = document.querySelector('.chatting-input');
const sendButton = document.querySelector('.send-button');
const displayContainer = document.querySelector('.display-container');
html의 쿼리를 담아서, 해당 쿼리를 사용할 수 있도록 상수로 선언해주는 과정
socket.on('connect',function(){
var name = prompt('환영합니다! 당신을 뭐라고 소개하나요: ', '');
if(!name){
name = '익명의 누군가'+ Math.floor(Math.random()*100);
}
nickname.defaultValue = name;
socket.emit('newUser', name);
});
socket.on('chatting', function(data){
const { name, msg } = data;
const item = new Li(name, msg);
item.makeLi();
displayContainer.scrollTo(0, displayContainer.scrollHeight);
});
socket.on('announce', function(msg){
const item = new announement(msg);
item.makeAn();
displayContainer.scrollTo(0, displayContainer.scrollHeight);
});
- 'connect'
- 기본으로 설정되어있는 이벤트, 클라이언트가 접속하면 자동 실행 됨, 이름을 설정해주고 그 뒤에 서버로 넘겨서 newUser 이벤트 실행시킴.
- 'chatting'
- 채팅 이벤트, HTML 코드의 채팅부분
<li>
쿼리에 일부 코드를 삽입하여서(채팅) 점점 채팅을 만들어 내주는 이벤트.
- 채팅 이벤트, HTML 코드의 채팅부분
- 'announce'
- 공지 이벤트, HTML 코드의 채팅부분
<li>
쿼리에 일부 코드를 삽입하여서(공지) 공지를 만들어 내는 이벤트.
- 공지 이벤트, HTML 코드의 채팅부분
chatInput.addEventListener('keypress', function(e){
if (e.keyCode === 13) {
send();
}
});
function send() {
const param = {
name: nickname.value,
msg: chatInput.value,
};
socket.emit('chatting', param);
}
sendButton.addEventListener('click', send);
실행될 때 서버로 chatting 이벤트를 보내는 send 함수를 제작하여 sendButton에 눌렸을 때 send 함수를 실행시키도록 하고 keypress, 13번, 엔터를 눌렀을 때 send 함수를 실행시키도록 함.