현대 대학생들은 자기주도적 학습의 필요성을 인식하고 있지만, 꾸준함을 유지하기 어려운 문제가 있습니다. 이에 따라 학습 과정에 흥미를 높이고 몰입을 유도할 수 있는 도구에 대한 수요가 증가하고 있습니다. 튜디는 이러한 문제를 해결하기 위해 학습과 게임형 요소를 결합해 학습 동기와 지속성을 높이는 것을 목표로 개발되었습니다.
최근 대학생들의 학습 환경은 크게 변화하며 자기 주도 학습 능력이 약화되는 현상이 나타나고 있습니다.
첫째, 비대면 환경의 일상화로 인해 고정된 학습 시간표와 공간이 사라지면서 기존 학습 루틴이 무너지고 집중력이 저하되었습니다. “나중에 해도 된다”는 인식이 퍼지며 멀티태스킹 습관이 강화되는 경향도 나타납니다.
둘째, 멀티태스킹 습관이 학습에 부정적 영향을 미치고 있습니다. 유튜브나 SNS 등 외부 자극에 쉽게 반응하며 깊이 있는 사고가 어려워지고, 집중력 저하로 학습 효율이 떨어지고 있습니다.
셋째, 비계획적 단기 학습이 주를 이루는 경향입니다. 시험 기간 등 단기적인 시점에만 학습이 집중되고, 평소에는 명확한 목표 없이 즉흥적으로 학습하는 경우가 많아 꾸준한 학습 습관이 형성되지 못하고 있습니다.
이러한 문제들은 대학생들의 자기 주도 학습을 방해하며, 지속적이고 효과적인 학습 동기 부여 방안을 모색할 필요성을 보여줍니다.
대학생들은 학습을 꾸준히 이어가는 데에도 여러 어려움을 겪고 있습니다. 먼저, 피드백과 보상의 부재가 큰 요인으로 작용합니다. 학습 후 즉각적인 피드백이나 보상 시스템이 없어, 공부를 마쳤음에도 성취감을 제대로 느끼기 어렵습니다. 또한 성과 누적 구조의 부재로 인해 학습 결과가 시각적으로 누적되거나 기록되는 구조가 부족하여, 성과를 인식하지 못한 채 학습이 단절되고 장기적인 목표 설정에도 어려움을 겪습니다.
자체 설문 결과에서도 이러한 경향이 확인됩니다.
공부를 꾸준히 지속하지 못하는 이유로 응답자의 75%가 “유튜브, SNS 등 방해 요소에 쉽게 노출됨”을 꼽았고, 52.8%는 “계획을 세워도 미루는 습관 때문”, 37.5%는 “공부할 의욕 자체가 도저히 생기지 않음”, 26.4%는 “무슨 목표를 세워야 할지 막연함”이라고 답했습니다. 이 외에도 보상이 없어 쉽게 지루해짐(19.4%), 성취감을 느끼기 어려움(13.9%) 등의 응답이 뒤따랐습니다.
이러한 결과는 학습 지속을 위해서는 즉각적인 보상과 성과 피드백 구조, 그리고 외부 방해 요인을 줄이는 동기 부여 전략이 필요함을 시사합니다.
기존에 사용되는 학습 도구(플래너, 앱, 웹 등) 또한 효과적인 자기 주도 학습을 지원하기에는 여러 한계가 있습니다.
자체 설문 조사에 따르면 사용 중인 학습 도구의 가장 큰 아쉬움으로 ‘동기 부여 기능 부족’(59.3%)이 가장 많이 지적되었으며, 이어서 ‘지속적 사용의 어려움’(37%), ‘실시간 피드백 부족’(22.2%), ‘시각적인 재미 부족’(7.4%) 등이 나타났습니다. 이처럼 학습 도구가 단순한 체크리스트 형태에 머물러 있어 장기적인 사용과 동기 부여에는 한계가 있음을 알 수 있습니다.
또한 학습 도구를 사용하지 않는 이유 역시 주목할 만합니다. 응답자의 66.7%가 “투두 앱을 켜거나 기록하는 것이 귀찮아서”라고 답했으며, 31.1%는 어떤 도구를 써야 할지 몰라서, 28.9%는 체크리스트만으로는 업무 성취감이 부족해서라고 응답했습니다. 그 외에도 사용법이 어렵거나(6.7%), 도구의 필요성을 못 느낀다는 의견이 소수 존재했습니다.
이러한 결과는 기존 학습 도구가 단순 체크 기능에 그쳐 동기 부여와 지속적인 사용을 유도하기 어렵고, 사용자 경험(UX) 측면에서의 불편함 또한 학습 도구 사용을 저해하는 주요 요인임을 보여줍니다.
저희는 "학습을 게임처럼"을 주제로 하여 프로젝트를 구현하여 학습 지속시간 증가, 계획 이행률 향상, 팀 기반 상호 자극을 통한 장기 유지율 개선을 목표로 삼았습니다.
핵심 기능
- 목표 달성: 완료 시 카테고리별 보상 코인 지급
- 스톱워치/세션 기록: 집중 시간 측정, 하루 일기 기록
- 사진 인증: 과제/필기·교재 인증으로 무성의한 기록 방지
- 캠퍼스 맵(픽셀아트): 학습 성과에 따라 건물 레벨업/복구, 팀이 지면 건물 붕괴 연출
- 단과대/그룹 대결: 팀 게이지·랭킹·보상
- 캘린더: 주·월간 누적, 과목/태그별 분석
사용자 여정(UX 플로우)
(1) 오늘 할 일 선택/생성
(2) 사진 인증 or 타이머 시작
(3) 세션 종료 시 자동 완료 처리
(4) 보상 지급·레벨업
(5) 팀 게이지 반영/랭킹 업데이트
(6) 캠퍼스 맵 시각 피드백(건물 상태 변화)
게임 메커닉스
- 보상 설계: 기본 코인 + 난이도 가중치
- 팀전 규칙: 단과대별 공부 기록 측정 → 랭킹 변화에 따른 패널티/업그레이드
- 시각적 요소: 건물 애니메이션(붕괴/복구)로 즉각적 강화 제공
신뢰성/공정성 장치
- 사진 인증: 중복·부정 방지(연속 동일 사진 제한)
- 데이터 구조 및 분석: 세션(시간) 단위 집계 → 개인/팀 수준 비교
캠퍼스 맵 기반 메타포: 추상적 그래프 대신 내 학교 건물이 성장/붕괴로 반응 → 정서적 소속감과 즉시성 증가
팀 경쟁의 맥락성: '랜덤 매칭'이 아니라 단과대/학과 등 실제 소속 기반 경쟁 → 참여 동기 강화
인증 중심의 신뢰도: 사진 인증을 기본 플로우에 내재화하여 기록 신뢰성 확보
픽셀아트 브랜딩: 통일된 레트로 아트디렉션(밤/낮 테마)과 연출(네온·붕괴/복구)이 콘텐츠 확장성(홍보물·영상) 제공
경험의 선순환 설계: 투두→타이머→일기→보상→맵 피드백→팀전으로 이어지는 루프로 재방문 유도
학습 격차 완화: 무료 제공, 쉬운 난이도로 진입장벽 낮춤
건강한 경쟁/웰빙: 과도한 경쟁 억제 장치(보상) 및 긍정적 피드백 중심 메시지
지역 연계/커뮤니티: 부산대 특화 UI로 친근함 제공, 교내 스터디 그룹/멘토링 목표 연계 가능
지속가능성: 오픈 데이터(익명화) 기반 학습 패턴 리포트 제공 → 학교 학습지원 정책·공간 운영 개선에 환류
뚝딱하우스(TUDY) 시스템은 Frontend - Backend - Database 3계층 구조로 설계되어 있으며, 클라우드 기반의 안정적이고 확장 가능한 아키텍처를 채택했습니다.
- Flutter Framework: 크로스 플랫폼 모바일 앱 개발
- GetX: 상태 관리 및 의존성 주입
- HTTP 통신: RESTful API를 통한 백엔드 연동
- Firebase: 푸시 알림 및 실시간 기능 지원
- Spring Boot: Java 기반 백엔드 프레임워크
- Spring Security + JWT: 토큰 기반 인증 시스템
- Spring Data JPA: 데이터베이스 접근 계층
- RESTful API: 클라이언트와의 표준화된 데이터 통신
- MySQL 8.x: 메인 데이터베이스 (프로덕션)
- H2 Database: 개발/테스트용 인메모리 데이터베이스
- 관계형 데이터 설계: 사용자, 목표, 그룹, 친구 관계 등 정규화된 테이블 구조
- 서버 호스팅: 클라우드 서버 (http://52.14.77.12:8080)
- 배포 환경: Docker 컨테이너 기반 배포
- 모니터링: 서버 상태 및 성능 모니터링
- 사용자 요청: Flutter 앱에서 사용자 행동 발생
- API 호출: HTTP/HTTPS를 통한 REST API 요청
- 인증 처리: JWT 토큰 검증 및 권한 확인
- 비즈니스 로직: Spring Boot에서 핵심 기능 처리
- 데이터 접근: JPA를 통한 MySQL 데이터베이스 연동
- 응답 반환: JSON 형태로 클라이언트에 결과 전달
- JWT 토큰 인증: 무상태 인증 시스템
- Spring Security: 엔드포인트별 권한 관리
- 부산대 이메일 검증: @pusan.ac.kr 도메인 한정
- 입력 데이터 검증: 프론트엔드/백엔드 이중 검증
- 학습 목표 관리: 사용자 ↔ API ↔ Goal/Category 테이블
- 친구/그룹 시스템: 실시간 상태 동기화
- 건물/코인 시스템: 게임화 요소의 실시간 반영
- 사진 인증: 이미지 업로드 및 검증 프로세스
- 랭킹 시스템: 집계 데이터 기반 실시간 순위 계산
- Flutter: 3.22.0
- Dart: 3.0
- GetX: 4.0
- http, image_picker, shared_preferences, firebase_core
- firebase_messaging(알림)
- url_launcher
- Java 17 - OpenJDK 17 LTS 버전
- Spring Boot 3.5.0
- Spring Framework 6.x
- Spring Data JPA
- Hibernate 6.x
- MySQL 8.x (메인 데이터베이스)
- Spring Security 6.x
- JWT
- Spring Boot Starter Mail (이메일 발송 기능)
- Gmail SMTP (이메일 서비스)
- SpringDoc OpenAPI 2.1.0
- Swagger UI 3.x
- H2 Database(개발/테스트용 인메모리 데이터베이스)
- 진입: 홈 화면에서 회원가입/로그인 또는 메인 페이지로 진입
- 인증: 부산대 이메일 인증을 통한 회원가입 및 로그인
- 핵심 기능: 5개 주요 기능(할일관리, 스톱워치, 다이어리, 스터디룸, 마이페이지) 이용
- 게임화: 학습 완료 시 보상 시스템과 캠퍼스 맵 연동
- 소셜: 친구/그룹 기능을 통한 협업 및 경쟁
- 인증 방식 : 이미지 인증 흐름
목적: 학습의 진정성을 보장하고 무성의한 기록을 방지하기 위한 신뢰성 확보 시스템
인증 플로우(ex.공부목표):
-
목표 설정: 사용자가 이미지 인증 방식 선택
-
사진 촬영: 학습 완료 시 교재/필기/과제 등의 학습 증거 사진 촬영
-
이미지 검증:
- 연속 동일 사진 제한으로 중복 방지
- 학습과 무관한 이미지 필터링
-
승인/거부:
- 승인 시: 학습 세션 완료 및 보상 지급
- 거부 시: 재촬영 요청 또는 무효 처리
-
데이터 저장: 승인된 인증 사진과 목표 완료 처리
신뢰성 보장 요소:
- 콘텐츠 검증: 학습 관련 내용이 포함된 이미지인지 확인
- 할일 관리: 날짜별 목표 설정 → 완료 체크 → 보상 획득
- 스톱워치: 목표 선택 → 학습 진행 → 사진 인증 → 세션 완료
- 다이어리: 날짜/이모지 선택 → 일기 작성 → 저장
- API 통신: 모든 프론트엔드 기능이 RESTful API를 통해 백엔드와 연동
- 인증 시스템: JWT 토큰 기반 보안 인증
- 데이터 관리: MySQL을 통한 체계적인 데이터 저장 및 관리
- 실시간 기능: Firebase를 통한 푸시 알림 및 실시간 업데이트
- 보상 체계: 학습 완료 → 코인 지급 → 캠퍼스 맵 반영
- 시각적 피드백: 건물 레벨업, 팀 게이지 변화
- 경쟁 요소: 단과대별 랭킹 시스템 및 그룹 대결
목적: 부산대학교 캠퍼스를 모티브로 한 시각적 게임화 요소로 학습 동기 부여 및 소속감 강화
건물 시스템 메커닉:
-
초기 상태: 모든 건물이 기본 레벨(레벨 1) 상태로 시작
-
학습 기여: 개인의 목표 달성 후 받은 보상코인으로 해당 단과대 건물 업그레이드
-
레벨업 조건:
- 층의 슬롯을 모두 채운 경우, 단과대 랭킹 역전 성공한 경우
-
건물 상태 변화:
- 성장: 건물 레벨업 (내부,외관 개선)
- 쇠퇴: 학습량 부족, 단과대 랭킹 하강 시 건물 손상 또는 붕괴 효과
- 복구: 재활성화를 통한 건물 복원
시각적 피드백 시스템:
- 픽셀아트 스타일: 레트로 게임 감성의 통일된 디자인
- 실시간 반영: 구매 즉시 건물 상태 업데이트
경쟁 요소:
- 단과대별 대결: 각 단과대 소속 학생들의 학습 기여도로 건물 상태 결정
- 팀 보상: 단과대 랭킹 기반 건물 업그레이드 제공
- 패널티 시스템: 단과대 랭킹 기반 건물 복구 이벤트 제공
사용자 참여 유도:
- 소속감: 본인 건물의 성장을 직접 확인
- 지속성: 건물 유지를 위한 꾸준한 학습 동기 부여
- 사용자 입력: 이메일 주소, 인증번호, 개인정보
- 입력 결과:
- 이메일 입력 후 "전송" 버튼 클릭 시: 인증 코드 발송
- 인증번호 입력 시: 실시간 유효성 검사
- 인증 실패 시: 빨간색 경고 문구 표시
- 인증 성공 시: 초록색 성공 메시지 표시
- 모든 검증 통과 시: 회원가입 단계로 진행
- 사용자 입력: ID(이메일)와 비밀번호
- 입력 결과:
- 입력창에서 실시간 유효성 검사 진행
- 유효성 검사 실패 시: 각 입력창 하단에 빨간색 경고 문구 표시
- 유효성 검사 통과 시: 로그인 버튼 활성화
- 로그인 버튼 클릭 시: 입력한 계정 정보 확인
- 계정이 없는 경우: 빨간색 경고 문구 표시
- 로그인 성공 시: 메인 페이지로 이동
- 사용자 입력: 날짜 선택, 카테고리별 목표 확인, 할일 추가/수정
- 입력 결과:
- 날짜 선택 시: 해당 날짜의 할일 목록 표시
- 카테고리별로 색상 구분된 할일 항목 표시
- 할일 추가 시: 새 할일 입력 폼 표시
- 할일 완료 시: 체크 표시 및 완료 상태 업데이트
- 그룹 목표와 개인 목표 구분 표시
- 사용자 입력: 날짜 선택, 이모지 선택, 일기 내용 작성
- 입력 결과:
- 주간 캘린더에서 날짜 선택 시: 해당 날짜의 다이어리 페이지 표시
- 이모지 선택 시: 25개 이모지 중 선택하여 표시
- 일기 내용 입력 시: 실시간 텍스트 편집
- 저장 시: 날짜별로 다이어리 내용 저장
- 기존 다이어리가 있는 경우: 저장된 내용 표시
- 사용자 입력: 목표 선택, 타이머 시작/정지, 학습 시간 기록
- 입력 결과:
- 목표 선택 시: 카테고리별 목표 목록에서 선택
- 타이머 시작 버튼 클릭 시: 초 단위로 시간 측정 시작
- 타이머 정지 버튼 클릭 시: 측정된 시간을 해당 목표에 기록
- 학습 시간은 서버에 자동 저장되어 단과대별 랭킹에 반영
- 선택된 목표에 따라 타이머 색상 변경
- 사용자 입력: 프로필 정보 확인, 통계 확인, 설정 변경
- 입력 결과:
- 학생증 카드 터치 시: 프로필 편집 페이지로 이동
- 오늘의 목표 수, 친구 수, 그룹 수 표시
- 각 통계 항목 터치 시: 해당 기능 페이지로 이동
- "휴학하기" 버튼 클릭 시: 로그아웃 처리
- 사용자 입력: 방 번호 선택, 공간 구매 후 설치, 게임 진행
- 입력 결과:
- 건물 내부에서 공간 선택 시: 해당 코인만큼 지불하고 구매
- 나가기 버튼 클릭 시: 메인 페이지로 복귀
- 코인 시스템: 현재 보유 코인 수량 표시
- 건물 선택 시: 건물 내부 UI 표시
- 네비게이션: 하단 탭을 통한 페이지 간 이동
- 상태 관리: GetX를 사용한 반응형 상태 관리
- 유효성 검사: 실시간 입력 검증 및 피드백
- 에러 처리: 사용자 친화적인 에러 메시지 표시
- 데이터 동기화: 서버와의 실시간 데이터 동기화
API 명세서: swagger-ui
- 총 API 엔드포인트: 35개
- 인증 필요 API: 28개 (80%)
- 공개 API: 7개 (20%)
- 주요 기능 영역: 10개
- HTTP 메서드: GET, POST, PUT, DELETE 모두 사용
- JWT 토큰 기반 인증 시스템
- Spring Security 적용
- 사용자별 권한 검증 (본인 정보만 수정 가능)
- 부산대 이메일 도메인 검증 (@pusan.ac.kr)
- 학습 목표 관리: 시간 기반, 이미지 인증 목표
- 소셜 기능: 친구, 그룹 시스템
- 게임화 요소: 건물 시스템, 코인 시스템
- 학습 추적: 스터디 세션, 랭킹 시스템
- 개인화: 카테고리, 일기 기능
lib/ # Flutter 메인 라이브러리 디렉토리
├── main.dart # Flutter 애플리케이션 진입점
├── data.dart # 데이터 설정 파일
├── api/ # API 관련 코드
│ ├── Friend/ # 친구 관련 기능
│ │ ├── controller/ # 컨트롤러
│ │ │ ├── AddFriendController.dart
│ │ │ ├── AddListController.dart
│ │ │ └── FriendListController.dart
│ │ ├── etc/ # 기타 파일들
│ │ └── model/ # 모델
│ │ ├── AddFriendModel.dart
│ │ ├── AddListModel.dart
│ │ ├── FriendGoal.dart
│ │ └── FriendListModel.dart
│ ├── Group/ # 그룹 관련 기능
│ │ ├── controller/ # 컨트롤러
│ │ │ ├── AddGroupController.dart
│ │ │ ├── GroupAddListControlller.dart
│ │ │ ├── GroupController.dart
│ │ │ └── JoinGroupController.dart
│ │ ├── etc/ # 기타 파일들
│ │ └── model/ # 모델
│ │ ├── AddGroupModel.dart
│ │ ├── GroupAddListController.dart
│ │ └── GroupModel.dart
│ ├── Mypage/ # 마이페이지 관련
│ │ ├── editMypageController.dart
│ │ └── mypageController.dart
│ ├── SignupLogin/ # 회원가입/로그인 관련
│ │ ├── controller/ # 컨트롤러
│ │ │ ├── email_verify_controller.dart
│ │ │ ├── login_controller.dart
│ │ │ └── signup_controller.dart
│ │ ├── model/ # 모델
│ │ │ ├── login_model.dart
│ │ │ ├── signup_model.dart
│ │ │ └── verify_email_model.dart
│ │ └── test/ # 테스트 파일들
│ ├── StopWatch/ # 스톱워치 기능
│ │ └── stopwatch_controller.dart
│ ├── Todo/ # 할일 관리 기능
│ │ ├── controller/ # 컨트롤러
│ │ │ ├── category_controller.dart
│ │ │ └── goal_controller.dart
│ │ └── model/ # 모델
│ │ ├── category_model.dart
│ │ └── goal_model.dart
│ └── test/ # 테스트 파일들
├── components/ # UI 컴포넌트
│ ├── bottomNavigation/ # 하단 네비게이션
│ │ ├── bottomNavigation.dart
│ │ ├── bottomNavigationController.dart
│ │ └── GroupFriend/ # 그룹/친구 관련 컴포넌트
│ │ ├── FriendList.dart
│ │ ├── GroupFriendItem.dart
│ │ ├── GroupList.dart
│ │ └── JoinAddFindfield.dart
│ ├── Calendar/ # 캘린더 관련 컴포넌트
│ │ ├── CalendarHeader.dart
│ │ ├── CustomMonthCalendar.dart
│ │ └── CustomWeekCalendar.dart
│ ├── check.dart # 체크 관련 컴포넌트
│ ├── Todo/ # 할일 관련 컴포넌트
│ │ ├── Todo.dart
│ │ ├── TodoColor.dart
│ │ ├── TodoDetail/ # 할일 상세 관련
│ │ │ ├── AddCategory.dart
│ │ │ ├── AddTodo.dart
│ │ │ └── TodoDetail.dart
│ │ ├── TodoGroupHeader.dart
│ │ ├── TodoList.dart
│ │ └── TooDetailDone.dart
│ └── test/ # 테스트 파일들
├── constants/ # 상수 정의
│ ├── colors.dart # 색상 상수
│ └── url.dart # URL 상수
├── layout/ # 레이아웃 관련
│ ├── navigationLayout.dart # 네비게이션 레이아웃
│ └── noLayout.dart # 레이아웃 없는 페이지
├── model/ # 모델 클래스
│ └── Todo_model.dart # 할일 모델
├── pages/ # 페이지 컴포넌트
│ ├── DiaryPage/ # 다이어리 페이지
│ │ ├── BallonBubble.dart
│ │ └── DiaryPage.dart
│ ├── Inside/ # 내부 페이지
│ │ ├── Card/ # 카드 관련 컴포넌트
│ │ │ ├── CardContainer.dart
│ │ │ ├── CustomCard.dart
│ │ │ └── SelectCustiomCard.dart
│ │ ├── CardSelector.dart
│ │ ├── InsidePage.dart
│ │ └── RoomSelectController.dart
│ ├── LoginSignup/ # 로그인/회원가입 페이지
│ │ ├── component.dart
│ │ ├── LoginPage.dart
│ │ ├── SignupPage_Email.dart
│ │ └── SingUpPage.dart
│ ├── MainPage.dart # 메인 페이지
│ ├── MyPage/ # 마이페이지 관련
│ │ ├── EditMyPage.dart
│ │ ├── FriendPage.dart
│ │ ├── GroupPage.dart
│ │ ├── MyPage.dart
│ │ └── StudentCard.dart
│ ├── stopwatchPage.dart # 스톱워치 페이지
│ └── TodoPage.dart # 할일 페이지
├── router/ # 라우팅 설정
│ └── main_router.dart # 메인 라우터
└── utils/ # 유틸리티 함수
└── auth_util.dart # 인증 관련 유틸리티
src/
├── main/ # 메인 소스 코드
│ ├── java/ # Java 소스 코드
│ │ └── com/example/tudy/ # 메인 패키지
│ │ ├── TudyApplication.java # Spring Boot 메인 클래스
│ │ ├── auth/ # 인증 관련
│ │ │ ├── AuthController.java # 인증 컨트롤러
│ │ │ └── TokenService.java # 토큰 서비스
│ │ ├── building/ # 건물 시스템
│ │ │ ├── BuildingController.java # 건물 컨트롤러
│ │ │ ├── BuildingService.java # 건물 서비스
│ │ │ ├── BuildingConfig.java # 건물 설정
│ │ │ ├── BuildingType.java # 건물 타입
│ │ │ ├── SpaceType.java # 공간 타입
│ │ │ ├── UserBuilding.java # 사용자 건물
│ │ │ ├── UserBuildingRepository.java # 사용자 건물 저장소
│ │ │ ├── UserBuildingSlot.java # 사용자 건물 슬롯
│ │ │ └── UserBuildingSlotRepository.java # 사용자 건물 슬롯 저장소
│ │ ├── category/ # 카테고리 관리
│ │ │ ├── Category.java # 카테고리 엔티티
│ │ │ ├── CategoryController.java # 카테고리 컨트롤러
│ │ │ └── CategoryRepository.java # 카테고리 저장소
│ │ ├── config/ # 설정 클래스
│ │ │ ├── JacksonConfig.java # Jackson 설정
│ │ │ ├── SecurityConfig.java # 보안 설정
│ │ │ └── WebConfig.java # 웹 설정
│ │ ├── diary/ # 일기 기능
│ │ │ ├── Diary.java # 일기 엔티티
│ │ │ ├── DiaryController.java # 일기 컨트롤러
│ │ │ ├── DiaryService.java # 일기 서비스
│ │ │ ├── DiaryRepository.java # 일기 저장소
│ │ │ ├── DiaryRequestDTO.java # 일기 요청 DTO
│ │ │ ├── DiaryResponseDTO.java # 일기 응답 DTO
│ │ │ └── GlobalExceptionHandler.java # 전역 예외 처리
│ │ ├── friend/ # 친구 시스템
│ │ │ ├── Friendship.java # 친구 관계 엔티티
│ │ │ ├── FriendshipController.java # 친구 관계 컨트롤러
│ │ │ ├── FriendshipService.java # 친구 관계 서비스
│ │ │ └── FriendshipRepository.java # 친구 관계 저장소
│ │ ├── game/ # 게임/코인 시스템
│ │ │ ├── CoinController.java # 코인 컨트롤러
│ │ │ ├── CoinService.java # 코인 서비스
│ │ │ ├── CoinType.java # 코인 타입
│ │ │ ├── UserCoin.java # 사용자 코인
│ │ │ └── UserCoinRepository.java # 사용자 코인 저장소
│ │ ├── goal/ # 목표 관리
│ │ │ ├── Goal.java # 목표 엔티티
│ │ │ ├── GoalController.java # 목표 컨트롤러
│ │ │ ├── GoalService.java # 목표 서비스
│ │ │ ├── GoalRepository.java # 목표 저장소
│ │ │ ├── GoalCreateRequest.java # 목표 생성 요청
│ │ │ └── GoalExceptionHandler.java # 목표 예외 처리
│ │ ├── group/ # 그룹 기능
│ │ │ ├── Group.java # 그룹 엔티티
│ │ │ ├── GroupController.java # 그룹 컨트롤러
│ │ │ ├── GroupService.java # 그룹 서비스
│ │ │ ├── GroupRepository.java # 그룹 저장소
│ │ │ ├── GroupMember.java # 그룹 멤버
│ │ │ ├── GroupMemberRepository.java # 그룹 멤버 저장소
│ │ │ ├── GroupJoinRequest.java # 그룹 가입 요청
│ │ │ └── GroupJoinRequestRepository.java # 그룹 가입 요청 저장소
│ │ ├── study/ # 스터디 세션
│ │ │ ├── StudySession.java # 스터디 세션 엔티티
│ │ │ ├── StudySessionController.java # 스터디 세션 컨트롤러
│ │ │ ├── StudySessionService.java # 스터디 세션 서비스
│ │ │ └── StudySessionRepository.java # 스터디 세션 저장소
│ │ └── user/ # 사용자 관리
│ │ ├── User.java # 사용자 엔티티
│ │ ├── UserController.java # 사용자 컨트롤러
│ │ ├── UserService.java # 사용자 서비스
│ │ └── UserRepository.java # 사용자 저장소
│ └── resources/ # 리소스 파일
│ ├── application.properties # 애플리케이션 설정
│ └── schema.sql # 데이터베이스 스키마
└── test/ # 테스트 코드
└── java/ # Java 테스트 코드
└── com/example/tudy/ # 테스트 패키지
├── TudyApplicationTests.java # 메인 테스트 클래스
├── auth/ # 인증 테스트
│ └── AuthControllerTest.java # 인증 컨트롤러 테스트
├── category/ # 카테고리 테스트
│ └── CategoryApiTests.java # 카테고리 API 테스트
├── diary/ # 일기 테스트
│ └── DiaryServiceTests.java # 일기 서비스 테스트
├── goal/ # 목표 테스트
│ ├── GoalApiTests.java # 목표 API 테스트
│ └── GoalGroupAndDateApiTests.java # 목표 그룹/날짜 API 테스트
├── group/ # 그룹 테스트
│ └── GroupJoinRequestTests.java # 그룹 가입 요청 테스트
└── user/ # 사용자 테스트
└── UserServiceTests.java # 사용자 서비스 테스트
배포 예정입니다 :)
서버 주소 : http://52.14.77.12:8080
공부나 목표 관리, 작심삼일로 끝난 경험이 많지 않으신가요?
TUDY는 단순한 할 일 관리 앱을 넘어, 게임적인 요소와 기록의 즐거움을 결합한 새로운 목표 달성 플랫폼입니다. 목표를 세우고, 성취를 눈으로 확인하며, 혼자가 아닌 함께 성장할 수 있는 경험을 제공합니다.
📌 당신의 목표를 건물처럼 차곡차곡 쌓아 올리세요. 즐기며 공부하고 싶은 사람이라면 누구나 환영합니다!
링크를 눌러 TUDY 소개 영상을 시청하세요.
https://youtu.be/Kkdytik3lmI
저희는 프론트엔드 개발자 3명, 백엔드 개발자 2명으로 구성된 TUDY 팀입니다. Flutter를 전담하는 프론트엔드 팀은 직관적이고 사용자 친화적인 UI/UX를 구현했으며, Spring Boot를 담당하는 백엔드 팀은 안정적이고 확장 가능한 서버 시스템을 구축했습니다. Git과 다양한 협업툴을 활용하여 실시간 소통과 투명한 프로젝트 관리를 실현했고, 각자의 전문 분야에서 최고의 성과를 내기 위해 노력했습니다.
협업과집중을 통해 사용자 중심의 완성도 높은 서비스를 만들어냈습니다.".
- 김효정(
FE 개발자,팀장,정보컴퓨터공학부)
- 프론트엔드 개발
- UI 설계 및 UX/UI 디자인
- UI 및 사용자 경험 설계
- 기획서 작성 및 발표 자료 제작
- 프론트엔드 개발
- 이예은(
FE 개발자,정보컴퓨터공학부)
- 프론트엔드 개발
- UI 설계 및 UX/UI 디자인
- 기획서 작성 및 발표 자료 제작
- 테스트 프레임워크를 활용해 유저 테스트 진행
- 프론트엔드 개발
-
김윤지(
FE 개발자,해양학과)- UI 설계 및 UX/UI 디자인
- 서비스 아이디어 발굴 및 MVP 정의
- 기획서 작성 및 발표 자료 제작
- UI 설계 및 UX/UI 디자인
-
이지원(
BE 개발자,정보컴퓨터공학부)- 백엔드 개발
- API, DB 설계 기획 담당
- 배포 및 관리 담당
- 코드와 리소스를 압축하고 캐싱을 구현
- 백엔드 개발
-
전혜은(
BE,정보컴퓨터공학부)- 백엔드 개발
- API, DB 설계 기획 담당
- Postman을 활용한 API 기능 테스트 수행
- 작업 내용 문서화 및 협업 툴 관리
- 백엔드 개발
- 김효정
이번 해커톤에서는 게임형 TODO를 만들면서 처음으로 게임이라는 분야에 도전해봤다. 단순한 일정 관리 앱에 게임 요소를 접목 시키는 아이디어를 바탕으로, 다양한 아이디어를 주고 받으며 기확히는 과정이 재밌었다. 물론 구현 단계에서는 예상 보다 어려운 부분도 많았고, 게임 특유의 복잡함도 있었지만, 그만큼 팀원들과 함께 머리를 맞대고 해결해나가면서 많이 배울 수 있었다.
- 이예은
프론트엔드 역할을 맡아 프로젝트를 진행해보았는데, 프로젝트 경험이 많지 않아 이번 SW 해커톤을 하며 처음 해보는 것들에 부딪혀가며 경험치를 쌓을 수 있어 좋았습니다. 특히 짧은 시간 안에 기획부터 구현까지 이어지는 과정 속에서 협업의 중요성을 크게 느낄 수 있었고, 팀원들과의 소통을 통해 문제를 해결해 나가는 과정에서 많은 배움을 얻었습니다. 앞으로는 UI를 좀 더 정교하고 다양하게 발전시켜 사용자 경험을 높이고, 더 완성도 있는 결과물을 만들어보고 싶습니다. 또한 이번 경험을 바탕으로 프론트엔드뿐 아니라 전체 서비스 흐름을 이해하며 시야를 넓혀가고 싶습니다.
- 김윤지
평소 개발에 관심이 있었는데, 이번 기회를 통해 프로젝트에 참여하게 되어 매우 뜻깊었습니다. 디자인부터 개발까지 프로젝트의 전 과정을 직접 경험하면서 새로운 기술과 방법들을 배우고 실습할 수 있었습니다. 특히 팀원들과 협업하며 소통의 중요성을 다시 한번 깨달았고, 문제 상황에서 함께 해결책을 찾아가는 과정이 매우 값진 경험이었습니다.앞으로도 이러한 경험을 바탕으로 더 다양한 프로젝트에 참여하여 실무 능력을 더욱 키우고, 새로운 도전에 주저하지 않고 도전하고 싶습니다.
- 이지원
이번 해커톤에서 서버와 백엔드를 맡아 클라우드 서버 세팅과 배포, API 구현부분을 담당했습니다. DB 연결 오류나 서버 장애와 같은 문제들을 직접 해결하면서 안정적인 서비스 운영의 중요성을 배웠고, 프론트엔드 팀원들과의 협업을 통해 변화하는 요구사항에 유연하게 대응하는 경험도 쌓을 수 있었습니다. 이번 프로젝트를 통해 백엔드가 서비스의 안정성을 결정하는 핵심이라는 점을 체감했고, 앞으로 더 큰 규모의 서비스에서도 자신 있게 백엔드를 운영할 수 있는 자신감을 얻을 수 있었습니다.
- 전혜은
이번 프로젝트를 통해 협업의 중요성과 그 어려움을 다시 한번 깊이 느꼈습니다. Gitub(협업 툴)에 어느 정도 익숙해졌다고 생각했지만, 여전히 배울 점이 많다는 것을 깨달았고 새로운 프로그램과 기술을 접하며 지식을 확장할 수 있는 좋은 기회가 되었습니다. 또한 서버 관련 공부를 하며 어려움을 실감했지만, 기회가 된다면 또다시 도전해 보고 싶습니다. 백엔드 기술을 자바 스프링 부트로 익힐 수 있었던 점도 큰 성과였습니다. 마지막으로 발표와 자료 준비, 그리고 문제 인식의 중요성까지 폭넓게 배우며 한 단계 성장할 수 있던 프로젝트였습니다.















