Search
Duplicate

GPTeacher 프로젝트 상세보기

GPTeacher 프로젝트

프로젝트 개요

ChatGPT로 영어를 공부하며 생기는 불편함을 해소하고, 학습 효율을 높여주기 위한 웹 어플리케이션을 만드는 프로젝트입니다. 다양한 자연어 처리 API를 활용하여 사용자가 영어를 효과적으로 학습할 수 있도록 도와줍니다.
프로젝트명
팀명
진행 기간
참여 인원
: GPTeacher
: 수아와아재들
: 2023.03.27 ~ 2023.05.09
: 5명
멀티캠퍼스 자바 취업캠프 6회차 프로젝트 경진대회 최우수상 수상

프로젝트 제작 동기

최근 자연어 AI 모델인 ChatGPT를 이용해 영어공부하는 방법이 매우 각광받고 있습니다. 하지만 ChatGPT를 이용해 영어공부를 할 경우 아래처럼 여러 문제점들이 발생합니다.
상황극을 하자고 했는데 GPT 혼자 모든 대본을 줄줄 외워버림
GPT와 대화는 자연스럽게 이어가면서도 내가 쓴 영어 문장에 대한 피드백은 또 따로 받고싶을 때, GPT에게 요청하는 것이 매우 번잡하고 주의력을 떨어뜨림
피드백을 달라고 정확히 요청하기도 쉽지 않음
음성으로 대화를 주고받을 수 없음
이전 학습 내역들을 저장하고 복습하기 어려움
이런 문제점을 해결하고자 자연어 처리 API를 통해 학습을 보조해주는 애플리케이션을 제작하였습니다.

사용 기술 스택

백엔드
Spring Framework 5.2.23
Java 11
Apache Tomcat
JSP
Maven
프론트엔드
HTML/CSS
Javascript ES6+
Bootstrap 5.2
JQuery
DB
Oracle DB 11g XE
MyBatis
Redis
형상관리
Git, Github
Sourcetree
IDE
IntelliJ IDEA
협업 툴
Figma - UI/UX 설계
Diagram.net - 유즈케이스 작성
ERD cloud - DB 설계
Google docs
기타
Lombok

주요 기능

랜딩페이지

메인페이지

슬라이딩 배너를 통해 학습하기로 넘어갈 수 있고, 활용법을 소개합니다.

학습 기능 - 말하기 연습

시험 선택: 어학 시험 중 하나를 선택해 말하기 연습을 진행할 수 있습니다.
음성 답변: 문제가 출제되면 음성으로 답변을 제출할 수 있습니다.
스크립트 교정 화면: 유저가 말한 스크립트를 교정해주고, 실제 AI 음성을 통해 들어볼 수 있습니다.
문장별 분석 화면: 또한 문장별로 분석해 상세한 피드백을 해줍니다. 좋아요를 표시하거나 플래시카드에 넣어 복습할 수 있습니다.
발음 평가 받기: 각 문장별로 발음 정확도를 평가받을 수 있습니다.

글쓰기 연습

주제 선정: 직접 주제를 선정하거나 GPT를 통해 랜덤 질문을 받을 수 있습니다.
답변 제출: 글쓰기를 통해 답변을 제출할 수 있습니다.
단어 추천받기: 현재 질문과 글쓰기 내용을 통해 GPT로부터 다음에 올 단어를 추천받을 수 있습니다.
이후 과정은 스크립트 교정 화면문장별 분석 화면으로, 말하기 연습과 동일합니다.

회화 연습

주제 선정: GPT와 대화를 주고받을 가상 상황을 설정할 수 있습니다. 주제를 랜덤 추천 받거나 역할을 바꿀 수도 있습니다.
회화 연습: GPT와 음성으로 대화를 주고받으면서 동시에 실시간으로 교정을 받을 수 있습니다. 각 문장은 실시간으로 발음 평가를 받아볼 수 있고, 좋아요 및 플래시카드 저장이 가능합니다.
이후 대화를 그만하면 문장별 분석 화면으로 넘어갑니다.

마이페이지

최근 학습: 최근 진행한 두 학습 정보 출력 및 연간 학습 히트맵(잔디심기)을 보여줍니다.
학습 이력: 학습한 이력들을 여러 필터를 통해 조회할 수 있습니다.
나의 문장: 학습한 문장들을 여러 필터를 통해 조회할 수 있습니다.
플래시 카드: 나의 문장들을 일정한 간격으로 복습할 수 있는 기능입니다.

부가 기능

회원가입 및 로그인

회원가입 화면
로그인 화면
SMTP + Redis를 이용한 이메일 인증 방식 구현
OAuth 2.0을 통한 구글 로그인 구현
JSR-303 Validator(Hibernate)를 통한 유효성 검증

계정 관리

회원 정보 수정
비밀번호 변경
회원 탈퇴

커뮤니티

사용자 간 자유롭게 소통하고 GPT의 피드백에 대한 질문/답변을 할 수 있는 커뮤니티입니다.
게시글 리스트
게시글 작성: 나의 문장을 첨부해서 질문 또는 정보 공유가 가능하도록 했습니다.
나의 문장은 필터링을 통해 탐색할 수 있고, 무한 스크롤을 페이징을 구현했습니다.
게시글 조회: 커뮤니티에 작성된 게시글을 조회하는 화면입니다.
게시글 수정: 첨부한 문장을 제거하거나 다른 문장으로 교체할 수 있습니다.
댓글 기능: 대댓글(1단), 신고 기능 등

어드민 페이지

사용자 통계: 월별 가입자 분석 및 연령별 사용자 분석
회원 관리: 회원의 활동 내역을 확인, 차단 및 해제 기능
신고 관리: 신고된 글 및 댓글 확인 가능

고객센터

공지사항
자주 묻는 질문
문의사항

프로젝트 기여 내용

프로젝트 주제 제공

팀원 분들이 저의 아이디어를 긍정적으로 봐주셔서 프로젝트 주제로 선정되었습니다.

데모 애플리케이션 제작

프로젝트의 뿌리가 되는 OpenAI사의 Chat GPT 및 Whisper(음성 인식) API를 테스트하고 팀원 분들이 기본 사용법을 참조하실 수 있도록 데모 버전 어플리케이션을 제작해 공유했습니다( GitHub 링크)
실제 사용자가 제출한 영어 스크립트를 GPT에게 전달해 문장별로 분석하고 JSON 형태로 돌려받는 로직까지 테스트하여 본 어플리케이션의 실현 가능성을 사전 검증하였습니다.
이 과정에서 한국전자통신연구원(ETRI)의 발음 평가 API도 테스트 하였는데, ETRI 서버의 응답이 불안정하여 Microsoft의 Azure 발음평가 API로 전환하게 되었습니다.

자연어 처리 관련 API Client 클래스 제작 (총 5개 중 4개 API에 기여)

OpenAI ChatGPT API client (Chat GPT)
GPT-3.5-turbo 모델을 사용합니다. 이전 모델인 davinci-003이나 이후 모델인 GPT-4보다 10배 저렴하고, GPT-4보다 정확도는 떨어지지만 속도는 더 빠른 것이 특징입니다.
OpenAI Whisper API client (음성 → 텍스트 변환 및 자동 변역)
MS Azure Pronunciation Accessment API client (발음 평가)
라이브러리(Record.JS)를 이용해 API 요청 스펙에 맞게 wav 파일 추출 및 포맷 변환
Naver Cloud Platform TTS API client (텍스트 → 음성)

보조 기능

그 밖에 아래 보조 기능들을 구현하였습니다.
학습하기
글쓰기 연습 기능
단어 추천받기 기능을 추가하여 글쓰기 진행 시 힌트를 받을 수 있도록 함
회화 연습 기능
유저가 GPT와 가상 상황에서 영어로 대화를 진행하면 실시간으로 유저의 발화를 피드백
MS Azure Speech API를 통한 문장별 발음 평가 기능 구현
회원 기능
회원가입 및 로그인
OAuth 2.0 회원가입 및 로그인 (Google)
회원 정보 변경, 회원 탈퇴 기능 구현
Redis를 통한 이메일 인증 관리
비밀번호 암호화
PBKDF2 알고리즘 사용
각 유저별로 UUID를 고유 salf로 부여하여 rainbow table 공격 방지
SHA-256 방식으로 400,000회 반복 해싱하도록 하여 개별 유저에 대한 brute-force 공격 방지
커뮤니티 기능
기본 게시판(글, 댓글) 기능 및 글, 댓글 신고 기능 구현
게시판 문장 첨부 기능 구현

프로젝트 기반 설정

라이브러리 의존성 관련 설정
패키지 구조 설정
주요 API key 관리

UI/UX

디자인 컨셉 설정 - 초기 아이디어 발표 시 제가 만들었던 프로토타입으로 프로젝트 디자인 컨셉이 정해졌습니다.
초기 아이디어 발표 시 만든 프로토타입
협업 툴 Figma 컴포넌트 관리
과거 스케치업이라는 3D 프로그램을 다룬 경험으로 컴포넌트 개념에 친숙했고, 피그마를 다루는 데 도움이 되었습니다. 레이아웃의 일관성을 유지하고 중복되는 작업을 제거했습니다.

기타

약 4000라인의 시연용 데이터 PL/SQL을 작성해 일관된 시연 데이터를 확보했습니다.
발표 시연을 담당했습니다.
그 외 노션 정리 노하우를 살려 프로젝트 대시보드를 제공하여 팀 생산성을 제고했습니다.
프로젝트에 상대적으로 많은 양의 코드를 기여했습니다(#1).

개선할 점

배포를 고려하지 못한 기술 스택
AWS Elastic Binstalk를 통해 배포를 시도했는데, 무료 버전인 free-tier에서는 tomcat을 8.5까지만 지원하고(본 프로젝트는 tomcat 9) oracle DB는 지원하지 않아서 배포를 하지 못했습니다. 기술 스택도 배포 용이성을 고려해서 설정해야겠다고 느꼈습니다.
Javascript 객체지향 프로그래밍 부족
JS 개념이 부실하여 객체지향을 적용하지 못했습니다. 리팩터링 시에는 모듈화를 통한 객체지향을 적용할 예정입니다.
파일 입출력
음성 데이터를 다룰 때 파일로 서버에 임시 저장했다가 HTTP 요청을 보내는데, 불필요한 파일 입출력을 생략할 수 있으면 성능이 크게 올라갈 것 같습니다. 실제 운영 시에는 이 파일 입출력 부분이 큰 병목 지점이 될 것 같다는 생각이 듭니다.
명확한 변수명 지정
예를 들어 ChatGpt를 API 단에서는 Assistant라고 하는데, 유저가 볼 때는 GPT로 보여야 했습니다. 이 과정에서 JS에서는 GPT, Java에서는 Assistant 등으로 다르게 불렸는데, 이를 사전에 통일하여 명확한 컨벤션을 정해 놓아야겠다고 생각했습니다.
로그인 관련
세션을 통해 로그인 상태를 관리했는데, 추후에 분산 서버 등을 고려해 JWT로 연결 상태를 클라이언트 쪽에 저장할 수 있도록 하는 것이 좋다는 생각이 들었습니다.