📢채팅프로그램 만들기 - 발표편
c++, Socket, TCP, SQL을 활용하여 채팅프로그램을 만들어보자 (3)
- 채팅프로그램 만들기(1) : (설계편)
- 채팅프로그램 만들기(2) : (개발편)
- 채팅프로그램 만들기(3) : (발표편)
개발을 끝내고 프로젝트 발표를 위해 프리젠테이션을 만들었다.
시현 과정을 프리젠테이션을 통해 표현해봤다.

- c++로 기본 코드를 구성하고 MySQL과 연계하여 입력한 정보를 데이터베이스로 저장하고 입출력, 수정과정을 수행한다.
- Socket과 TCP통신을 사용하여 1명 이상의 유저를 소켓으로 연계하고 서로 교류할 수 있도록 한다.
- Github을 사용하여 팀원과 프로젝트를 진행한다.
📌주안점

- 작업기간 및 주안점에 대해서 나타낸 화면이다.
- 개인정보를 데이터베이스에 저장하는 방식이기때문에 개인정보가 그대로 담기게 된다. 번호, 생년월일, 이름 등등의 정보를 담고있기에 개인정보보호가 중요하다고 생각했다. 그렇기때문에 비밀번호를 *로 표기하는 등의 암호화에 신경을 썼다.
- SQL을 사용하는 부분은 모두 클래스를 통해 캡슐화하였고 정보은닉을 수행하였다.
- 프로그램이 채팅을 하는 프로그램이기 때문에 채팅에 있어 소켓을 사용하여 여러가능을 수행할 수 있도록 개발하였다. 단체톡방을 통해 소켓주소를 할당받은 모두가 대화할 수있는 기능은 물론이고, 개인적으로 귓속말 기능을 사용하여 개인과 개인간의 대화도 수행 할 수 있도록 개발하였다.
- 채팅을 주고받는 1차과정 뿐만아니라 이전에 나눴던 채팅내용을 검색하여 볼수있도록 2차과정을 추가하였다. 채팅을 검색내용에 따라 출력할 수 있고, 기간별로 검색하여 기간에 따른 채팅내용을 출력할 수 있도록 기능을 추가하였다.
📌코드 개요

- 정보은닉을 위해 class를 사용하여 개인정보를 캡슐화시켰다.
- 시작화면과 메인화면으로 따로 구성하여 각 화면의 결합도를 낮췄고 각 기능별로 함수화하여서 유지보수에 능하도록 코딩하였다.
📌시작메뉴

- 콘솔창을 켰을 경우 뜨는 시작화면이다. 각 화면마다 "system(cls)"를 통하여 인터페이스를 깔끔하게 할 수 있도록 코딩하였다.
📍1. 로그인

- 아이디와 비밀번호가 데이터베이스상 아이디와 비밀번호와 일치한다면 메인메뉴로 넘어가게 된다.
- 비밀번호는 getch함수를 사용하여 *로 나타내어 개인정보보호에 힘썼다.
📍2. 아이디 찾기

- 회원가입했던 이름, 번호, 생년월일이 데이터베이스상 정보와 일치한다면 아이디를 출력한다.
- 생년월일은 8자리로 설정하였고 데이터베이스 데이터타입 DATE를 사용하면 연월일 사이에 "-"가 들어가게 되는데 이는 입력할때 숫자만 기입(19960307)하더라도 출력과정에선 하이픈이 붙어서 출력(1996-03-07)되기 때문에 통일성을 위하여 입력과정에서 미리 붙어서 입력되도록 코딩하였다.
📍3. 비밀번호 찾기

- 아이디와 이름, 전화번호, 생년월일이 데이터베이스상 정보와 일치한다면 비밀번호를 새로 설정한다.
여기서 비밀번호 출력이 아닌 새로 설정하는 것은 개인정보 보호를 위해 일부러 설정하였다.
📍3-1 비밀번호 암호화

- CryptoPP 라이브러리를 활용하여 비밀번호 해시화를 적용하였다. 사용자가 회원가입 시 입력한 비밀번호를 SHA256 해시함수를 통해 암호화하여 MySQL 데이터베이스에 저장하였다.
이를 통해 데이터베이스가 노출되었을 때에도 비밀번호가 유출되지 않도록 보호했다. 또한, 단방향 암호화를 사용하여 해시값을 복호화할 수 없도록 설계하였으며, 로그인 시에도 사용자가 입력한 비밀번호를 해시화하여 DB에 저장된 해시값과 비교하도록 구현했다.
📍3-2 해시변수 개별화

- 회원가입, 로그인, 비밀번호 찾기, 비밀번호 변경 등의 각 기능에서는 독립적인 해시화 변수를 사용하여 해시값의 재사용을 막고, 비밀번호 관련 기능 간의 충돌이나 오류를 최소화했다.
사용자의 개인정보 보호를 최우선으로 고려한 안전한 환경을 제공함으로써 사용자들은 개인 정보가 노출되거나 악용되는 위험으로부터 안심하고 이 프로그램을 사용할 수 있도록 설계하였다.
📍4. 회원가입

- 아이디 중복체크 후에 중복된 아이디가 없을 경우 회원가입을 진행한다.
📌메인메뉴

- 로그인을 마쳤을 경우 메인화면으로 넘어오게 되는데 로그인을 했다는 것을 인지하기 위해 콘솔 글자색을 노란색으로 설정하였다.
📍1. 내정보

- 내정보에서는 내프로필을 출력하거나 상태메시지, bgm을 설정할 수 있다. 만약 설정되어있지 않다면 '없음'으로 출력된다.
📍2. 친구

- 내정보 창에서 설정했던 생메와 노래를 포함하여 회원가입 할때 입력했던 정보와 합쳐서 출력하게 된다.
- 회원가입 할 때 입력했던 생년월일을 이용하여 검색을 가능하게 코딩하였다.
시작월일을 입력하고 종료월일을 입력할 경우 그 사이에 있는 친구의 이름, 생년월일, 전화번호를 출력해준다. (단, 자기자신은 출력되지 않는다.)
📍3. 대화방

- 채팅방 입장을 누를경우 소켓을 생성하고 주소를 할당받는다.
- 채팅방에서 치는 내용은 서버와 접속해있는 모두에게 출력된다.(대화내용과 시간은 데이터베이스에 저장된다.)
- '/귓말 이름 내용'을 입력할 경우 상대방에게 귓속말이 전해지고 서버에는 출력되지 않는다.(데이터베이스에 내용을 저장하지 않는다.)
- '/종료'입력시 채팅방을 빠져나오게 되고 할당받은 소켓의 주소는 해제된다.
- 다시 재입력할 경우 소켓의 주소를 재할당받는다.

- 채팅방 입장 시 과거 채팅했던 최근 5개의 채팅이 출력된다. 이전에 무슨내용을 얘기하다가 종료하였는지 알 수 있다.
- 자신이 친 채팅내용은 나에게 쪽지화되어 출력되지 않는다. 상대방이 보낸 쪽지만 형식을 갖춰서 출력된다.
- 귓속말을 보내거나 받을 경우 서버측에서 출력되지 않으며 받는 사람에게만 보이게 된다.(데이터베이스에 저장되지 않는다.)
- 현재 접속한 사람이 몇명인지, 접속한 사람의 이름이 서버화면에 출력된다.

- 친구와 주고받은 채팅내용을 2차가공할 수 있도록 코딩하였다.
- 특정한 단어가 들어가있는 채팅내용을 찾고싶다면 그 특정한 단어를 입력할 경우 입력한 단어가 들어가있는 채팅내용을 전부 출력한다.
- 특정한 기간에 주고받은 채팅내용이 궁금할 경우를 위해 시작월일과 종료월일을 입력하면 그 사이에 주고받았던 채팅내용을 전부 출력한다.
📍4. 설정

- 비밀번호를 재설정할 수 있다. 이 때 기존비밀번호를 입력 후 데이터베이스상 비밀번호와 일치한다면 새로운 비밀번호를 설정할 수 있다.
- 회원탈퇴를 할때에는 기존비밀번호를 입력해야하며 데이터베이스와 정보가 일치할 경우 다시 한번 확인문구가 나온다. 이때에도 확인을 누를경우 데이터베이스상 튜플을 삭제하고 프로그램을 종료시킨다.
📢프로젝트 결과
프로젝트 발표와 시현 결과 대성공이었고 가장 잘한 팀을 투표하고 선정하는 과정에서 1등을 차지하여 대상을 수상하게 되었다.
개인프로젝트가 아닌 팀프로젝트에서 수상하게 되어서 더욱 기뻤다.
혼자만의 수상이 아닌 협동하여 이뤄낸 결과라는 점이 더욱 와닿았다.
