연습용 플젝_채팅 웹사이트 만들기
2025. 2. 27. 09:09ㆍ웹프로그래밍
이 프로젝트는 단순히 '소켓통신을 구현해보고싶다' 라는 목적 하에 이루어졌다.
따라서 시장성이나 사용자 편의성을 고려하지 않는 단순 연습용 플젝이다.
목차
1. 요구사항 정의서
2. 데이터 모델링
3. 데이터 베이스 스키마
4. 더미 데이터
5. 리소스
요구사항 정의서
데이터 모델
스키마
-- 참조 관계를 고려하여 DROP 쿼리 순서대로 작성
DROP TABLE IF EXISTS MESSAGE; -- 메시지 테이블 삭제 (ROOM, MEMBER, EMOJI 참조)
DROP TABLE IF EXISTS FRIENDS; -- 친구 관계 테이블 삭제 (MEMBER 참조)
DROP TABLE IF EXISTS ROOM_MEMBER; -- 채팅 참여자 테이블 삭제 (ROOM, MEMBER 참조)
DROP TABLE IF EXISTS EMOJI_LOG; -- 이모티콘 사용 로그 테이블 삭제 (MEMBER, EMOJI 참조)
DROP TABLE IF EXISTS EMOJI; -- 이모티콘 테이블 삭제
DROP TABLE IF EXISTS ROOM; -- 채팅방 테이블 삭제
DROP TABLE IF EXISTS MEMBER; -- 회원 테이블 (기존 USER -> MEMBER) 삭제
-- 데이터베이스 재생성
DROP DATABASE IF EXISTS chat_app;
CREATE DATABASE chat_app;
USE chat_app;
-- 회원 테이블 (기존 USER 테이블명을 MEMBER로 변경)
CREATE TABLE MEMBER (
ID VARCHAR(50) PRIMARY KEY, -- 회원 ID
NAME VARCHAR(150) NOT NULL, -- 회원 이름
PROFILE VARCHAR(255), -- 프로필 이미지 등록
PWD VARCHAR(255) NOT NULL, -- 비밀번호
PHONE VARCHAR(20) -- 전화번호
);
-- 친구 관계 테이블
CREATE TABLE FRIENDS (
ID INT AUTO_INCREMENT PRIMARY KEY, -- 친구 관계 ID
USER_ID VARCHAR(50) NOT NULL, -- 친구 요청을 보낸 사용자 (MEMBER.MEMBER_ID 참조)
FRIEND_ID VARCHAR(50) NOT NULL, -- 친구 요청을 받은 사용자 (MEMBER.MEMBER_ID 참조)
STATUS ENUM('pending', 'accepted', 'blocked') DEFAULT 'pending', -- 친구 요청 상태
FOREIGN KEY (USER_ID) REFERENCES MEMBER(ID) ON DELETE CASCADE,
FOREIGN KEY (FRIEND_ID) REFERENCES MEMBER(ID) ON DELETE CASCADE
);
-- 채팅방 테이블
CREATE TABLE ROOM (
ROOM_NUM INT AUTO_INCREMENT PRIMARY KEY, -- 채팅방 번호
ROOM_ID VARCHAR(100) NOT NULL -- 채팅방 ID
);
-- 채팅 참여자 테이블 (1:N 관계)
CREATE TABLE ROOM_MEMBER (
ROOM_NUM INT NOT NULL, -- 채팅방 번호
MEMBER_ID VARCHAR(50) NOT NULL, -- 회원 ID (참조: MEMBER.ID)
PRIMARY KEY (ROOM_NUM, MEMBER_ID),
FOREIGN KEY (ROOM_NUM) REFERENCES ROOM(ROOM_NUM) ON DELETE CASCADE,
FOREIGN KEY (MEMBER_ID) REFERENCES MEMBER(ID) ON DELETE CASCADE
);
-- 이모티콘 테이블
CREATE TABLE EMOJI (
EMOJI_NUM INT AUTO_INCREMENT PRIMARY KEY, -- 이모티콘 번호
IMG VARCHAR(255) NOT NULL, -- 이모티콘 이미지 경로
EMOJI_CTG VARCHAR(100) -- 이모티콘 카테고리
);
-- 메시지 테이블
CREATE TABLE MESSAGE (
MSG_ID INT AUTO_INCREMENT PRIMARY KEY, -- 메시지 ID
ROOM_NUM INT NOT NULL, -- 채팅방 번호 (참조: ROOM.ROOM_NUM)
CONTENT TEXT, -- 메시지 내용 (긴 텍스트 가능)
TIME DATETIME DEFAULT CURRENT_TIMESTAMP, -- 전송 시간 (자동 기록)
SEND VARCHAR(50) NOT NULL, -- 발신자 (참조: MEMBER.ID)
EMOJI_NUM INT, -- 이모티콘 번호 (참조: EMOJI.EMOJI_NUM)
FOREIGN KEY (ROOM_NUM) REFERENCES ROOM(ROOM_NUM) ON DELETE CASCADE,
FOREIGN KEY (SEND) REFERENCES MEMBER(ID) ON DELETE CASCADE, -- USER -> MEMBER 변경
FOREIGN KEY (EMOJI_NUM) REFERENCES EMOJI(EMOJI_NUM) ON DELETE SET NULL
);
-- 이모티콘 사용 로그 테이블
CREATE TABLE EMOJI_LOG (
LOG_NUM INT AUTO_INCREMENT PRIMARY KEY, -- 로그 번호
MEMBER_ID VARCHAR(50) NOT NULL, -- 회원 ID (참조: MEMBER.ID)
EMOJI_NUM INT NOT NULL, -- 이모티콘 번호 (참조: EMOJI.EMOJI_NUM)
FOREIGN KEY (MEMBER_ID) REFERENCES MEMBER(ID) ON DELETE CASCADE, -- USER -> MEMBER 변경
FOREIGN KEY (EMOJI_NUM) REFERENCES EMOJI(EMOJI_NUM) ON DELETE CASCADE
);
더미 데이터
USE chat_app;
-- USER 테이블 (사용자 3명 추가)
INSERT INTO MEMBER (ID, NAME, PROFILE, PWD, PHONE) VALUES
('user1', '김철수', 'profile1.jpg', 'password123', '010-1234-5678'),
('user2', '이영희', 'profile2.jpg', 'password456', '010-5678-1234'),
('user3', '박민수', 'profile3.jpg', 'password789', '010-8765-4321'),
('user4', '최지훈', 'profile4.jpg', 'password321', '010-4321-8765'),
('user5', '한서연', 'profile5.jpg', 'password654', '010-9876-5432');
-- 친구 요청 (대기 상태)
INSERT INTO FRIENDS (USER_ID, FRIEND_ID, STATUS) VALUES
('user1', 'user2', 'pending'),
('user3', 'user5', 'pending');
-- 친구 요청 승인 (accepted)
INSERT INTO FRIENDS (USER_ID, FRIEND_ID, STATUS) VALUES
('user1', 'user3', 'accepted'),
('user2', 'user4', 'accepted'),
('user4', 'user5', 'accepted');
-- 친구 차단 (blocked)
INSERT INTO FRIENDS (USER_ID, FRIEND_ID, STATUS) VALUES
('user2', 'user5', 'blocked');
-- ROOM 테이블 (1:1 채팅방 2개 생성)
INSERT INTO ROOM (ROOM_ID) VALUES
('room_1_2'), -- user1과 user2의 1:1 채팅방
('room_2_3'); -- user2과 user3의 1:1 채팅방
-- ROOM_USER 테이블 (각 채팅방에 참여하는 유저 추가)
INSERT INTO ROOM_MEMBER (ROOM_NUM, MEMBER_ID) VALUES
(1, 'user1'),
(1, 'user2'),
(2, 'user2'),
(2, 'user3');
-- MESSAGE 테이블 (더미 채팅 메시지)
INSERT INTO MESSAGE (ROOM_NUM, CONTENT, TIME, SEND, EMOJI_NUM) VALUES
(1, '안녕하세요! 잘 지내시죠?', NOW(), 'user1', NULL),
(1, '네! 잘 지내고 있어요.', NOW(), 'user2', NULL),
(2, '이번 주말에 뭐 하세요?', NOW(), 'user2', NULL),
(2, '아직 계획 없어요!', NOW(), 'user3', NULL);
-- EMOJI 테이블 (이모티콘 3개 추가)
INSERT INTO EMOJI (IMG, EMOJI_CTG) VALUES
('emoji_smile.png', '기본'),
('emoji_love.png', '사랑'),
('emoji_thumbsup.png', '긍정');
-- EMOJI_LOG 테이블 (이모티콘 사용 기록)
INSERT INTO EMOJI_LOG (MEMBER_ID, EMOJI_NUM) VALUES
('user1', 1),
('user2', 2),
('user3', 3);
commit
리소스
GIt
GitHub - belovelace/chat_practice
Contribute to belovelace/chat_practice development by creating an account on GitHub.
github.com
Excel
'웹프로그래밍' 카테고리의 다른 글
연습용 플젝_소켓 통신 구현하기 (0) | 2025.03.20 |
---|---|
연습용 플젝_로그인 후 세션 유지 (1) | 2025.03.04 |
[css] flex (0) | 2025.02.04 |