👑 김도현 (Front-End) |
김찬휘 (Back-End) |
김호정 (Front-End) |
박중원 (Front-End) |
이지수 (Back-End) |
UI/UX React 3D Modeling MyRoom ItemShop FEED Profile Validation |
REST API Spring Boot DataBase GitHub API WebSocket RSS Feed Chrome Extension |
UI/UX React 3D Modeling Three.js MyGoals ItemShop Chart Calendar |
UI/UX React 3D Modeling Three.js Main MyRoom WebSocket CS Quiz |
REST API Spring Boot DataBase Chrome Extension WebSocket Member Record |
- 기획 및 설계 : 23.04.10 ~ 23.04.14
- 프로젝트 구현 : 23.04.17 ~ 23.05.12
- 버그 수정 및 산출물 정리 : 23.05.15 ~ 23.05.19
실력있는 개발자가 되기위해 필요한 덕목이 '꾸준함'인데, 막상해보면 일이 되버리고 재미를 잃어버리면서 지속하기 어렵습니다.
저희는 어떻게 해야 꾸준히 습관을 유지할 수 있고, 어떤 습관을 만들어가는 것이 개발자로서의 성장에 도움이 될지 고민했습니다.
그래서 커밋 기록, 블로그 작성, 알고리즘 문제 풀기, 꾸준한 CS공부, 기술블로그 읽기를 통해 좋은 개발자로서의 역량을 함양하고,
3D 마이 프로필을 꾸밀수 있게해서 목표를 달성하면 성취감도 느끼고 재미도 느낄 수 있으면 좋겠다는 생각을 했습니다.
또한 유저의 편의성을 위해 유저가 설정한 목표를 저희가 자동으로 감지해서 달성 여부를 판단하면 좋을 것 같다는
생각에서 Sellog를 기획하게 되었습니다.
Sellog는 개발자들을 위한 습관 기록 자동화 서비스입니다.
유저는 5가지(Github Commit, Algorithm Solving, Blog Posting, CS Quiz, Feed)의 습관을 설정할 수 있습니다.
Chrome Extension을 통해 유저의 습관을 자동으로 체크하여 설정한 목표를 달성할 시 보상을 지급합니다.
보상으로 얻은 코인으로 나만의 3D 방을 꾸밀 수 있습니다.
상세 기술스택 및 버전
구분 | 기술스택 | 버전 |
---|---|---|
General | Gitlab | - |
Jira | - | |
Mattermost, Notion | - | |
BackEnd | OpenJDK | 11.0.16.1 |
Spring Boot | 2.4.5 | |
Gradle | 7.5.1 | |
JPA | - | |
JWT | 0.11.5 | |
QueryDSL | - | |
IntelliJ | 2022.3.1 | |
FrontEnd | HTML5 | - |
CSS3 | - | |
Javascript | - | |
Typescript | 4.9.3 | |
React | 18.2.0 | |
Recoil | 0.7.7 | |
styled-components | 5.3.9 | |
axios | 1.3.5 | |
Three.js | 0.151.3 | |
Vite | 4.2.0 | |
Visual Studio Code | 1.75.1 | |
Database | MySQL | 8.0.21 |
RabbitMQ | 3.8.28 | |
Server | AWS EC2 | - |
AWS EC2 S3 | - | |
Nginx | 1.18.0 | |
Docker | 20.10.23 | |
Jenkins | 2.378.1 | |
Test | Postman | 10.9.4 |
JUnit5 | - | |
Mockito | - | |
Jacoco | 0.8.7 |
시스템 아키텍처 |
---|
Front-end
C:.
│ README.md
│
└─front-end
│ .gitignore
│ Dockerfile
│ index.html
│ package-lock.json
│ package.json
│ README.md
│ tsconfig.json
│ tsconfig.node.json
│ vite.config.ts
│
├─nginx
│ nginx.conf
│
├─public
│ │ vite.svg
│ │
│ └─models
│ │ bloomer.glb
│ │ car.glb
│ │ clouds.glb
│ │ cs_direct.glb
│ │ deco.glb
│ │ DoLearn.glb
│ │ feed.glb
│ │ feed_direct.glb
│ │ floor.glb
│ │ flower.glb
│ │ grass.glb
│ │ ground.glb
│ │ house.glb
│ │ itemshop.glb
│ │ learnway.glb
│ │ login.glb
│ │ maker.glb
│ │ newCsQuiz.glb
│ │ obaek.glb
│ │ osakak.glb
│ │ room_direct.glb
│ │ Sellog.glb
│ │ shop_direct.glb
│ │ stone.glb
│ │ tantan.glb
│ │ tree.glb
│ │ weather.glb
│ │ ydg.glb
│ │
│ ├─characters
│ │ f1.glb
│ │ f2.glb
│ │ f3.glb
│ │ m1.glb
│ │ m2.glb
│ │ m3.glb
│ │
│ ├─csQuiz
│ │ f1.glb
│ │ f2.glb
│ │ f3.glb
│ │ m1.glb
│ │ m2.glb
│ │ m3.glb
│ │ oMark.glb
│ │ xMark.glb
│ │
│ ├─font
│ │ csquiz_font.glb
│ │ feed_font.glb
│ │ itemShop_font.glb
│ │ myroom_font.glb
│ │
│ ├─items
│ │ bedside_light_1.glb
│ │ black_chair_1.glb
│ │ black_coffeemachine_1.glb
│ │ black_cup_1.glb
│ │ black_leather_sofa_1.glb
│ │ black_speaker_1.glb
│ │ black_teatable_1.glb
│ │ blue_bed.glb
│ │ blue_chair_1.glb
│ │ blue_chair_2.glb
│ │ blue_sofa_1.glb
│ │ brown_table_1.glb
│ │ brown_table_2.glb
│ │ brown_table_3.glb
│ │ brown_table_4.glb
│ │ coffee_cup_1.glb
│ │ elec_guitar_1.glb
│ │ elec_guitar_2.glb
│ │ elec_guitar_3.glb
│ │ giant_sofa_1.glb
│ │ green_sofa_1.glb
│ │ grey_bin_1.glb
│ │ group_guitar_1.glb
│ │ house_tree_1.glb
│ │ imac_computer_1.glb
│ │ katana_decoration_1.glb
│ │ leopard_chair_1.glb
│ │ low_table_1.glb
│ │ marble_table_1.glb
│ │ marble_table_2.glb
│ │ old_computer_1.glb
│ │ old_computer_2.glb
│ │ old_microwave_1.glb
│ │ old_tv_1.glb
│ │ orange_sofa_1.glb
│ │ photo_frame_1.glb
│ │ photo_frame_2.glb
│ │ red_chair_1.glb
│ │ red_lights_1.glb
│ │ red_sofa_1.glb
│ │ red_telephone_1.glb
│ │ retro_arcadegame_1.glb
│ │ round_table_1.glb
│ │ small_speaker_1.glb
│ │ stall_white_chair_1.glb
│ │ starwars_trooper_1.glb
│ │ teddybear_1.glb
│ │ tree_vase_1.glb
│ │ trooper_figure_1.glb
│ │ white_chair_1.glb
│ │ white_controller_1.glb
│ │ white_skeleton_1.glb
│ │ white_sofa_1.glb
│ │ white_table_1.glb
│ │ wine_glass_1.glb
│ │ wood_chair_1.glb
│ │ wood_desk_0.glb
│ │ wood_desk_1.glb
│ │ wood_desk_2.glb
│ │ wood_drawer_1.glb
│ │ wood_shelve.glb
│ │ wood_table_1.glb
│ │ yellow_sofa_1.glb
│ │
│ ├─otherCharacters
│ │ f1.glb
│ │ f2.glb
│ │ f3.glb
│ │ m1.glb
│ │ m2.glb
│ │ m3.glb
│ │
│ └─room
│ room1.glb
│ room2.glb
│ room3.glb
│ room4.glb
│
└─src
│ App.css
│ App.tsx
│ AppStyles.tsx
│ index.css
│ main.tsx
│ vite-env.d.ts
│
├─api
│ csQuiz.ts
│ feed.ts
│ http.ts
│ record.ts
│ room.ts
│ store.ts
│ user.ts
│
├─assets
│ │ react.svg
│ │
│ ├─font
│ │ Neoneon.otf
│ │
│ └─imgs
│ │ algo_logo.png
│ │ blog_logo.png
│ │ csquiz_battle_img.png
│ │ csquiz_img.png
│ │ cs_logo.png
│ │ feed_logo.png
│ │ github_logo.png
│ │ Loading.json
│ │ logo.png
│ │ tistory_logo.png
│ │ turtle-loading.json
│ │
│ ├─items
│ │ bedside_light_1.png
│ │ big_car_1.png
│ │ black_chair_1.png
│ │ black_coffeemachine_1.png
│ │ black_cup_1.png
│ │ black_leather_sofa_1.png
│ │ black_speaker_1.png
│ │ black_teatable_1.png
│ │ blue_car_1.png
│ │ blue_chair_1.png
│ │ blue_chair_2.png
│ │ blue_sofa_1.png
│ │ brown_table_1.png
│ │ brown_table_2.png
│ │ brown_table_3.png
│ │ brown_table_4.png
│ │ coffee_cup_1.png
│ │ elec_guitar_1.png
│ │ elec_guitar_2.png
│ │ elec_guitar_3.png
│ │ giant_sofa_1.png
│ │ green_sofa_1.png
│ │ grey_bin_1.png
│ │ group_guitar_1.png
│ │ house_tree_1.png
│ │ imac_computer_1.png
│ │ katana_decoration_1.png
│ │ leopard_chair_1.png
│ │ low_table_1.png
│ │ marble_table_1.png
│ │ marble_table_2.png
│ │ old_computer_1.png
│ │ old_computer_2.png
│ │ old_microwave_1.png
│ │ old_tv_1.png
│ │ orange_sofa_1.png
│ │ photo_frame_1.png
│ │ photo_frame_2.png
│ │ red_car_1.png
│ │ red_chair_1.png
│ │ red_lights_1.png
│ │ red_sofa_1.png
│ │ red_telephone_1.png
│ │ retro_arcadegame_1.png
│ │ round_table_1.png
│ │ small_speaker_1.png
│ │ stall_white_chair_1.png
│ │ starwars_trooper_1.png
│ │ teddybear_1.png
│ │ tree_vase_1.png
│ │ trooper_figure_1.png
│ │ white_controller_1.png
│ │ white_skeleton_1.png
│ │ white_sofa_1.png
│ │ white_table_1.png
│ │ wine_glass_1.png
│ │ wood_chair_1.png
│ │ wood_desk_1.png
│ │ wood_desk_2.png
│ │ wood_drawer_1.png
│ │ wood_table_1.png
│ │ yellow_sofa_1.png
│ │
│ ├─itemShop
│ │ cool.png
│ │ rainbow.png
│ │
│ ├─main
│ │ bloomerImg.png
│ │ grid.png
│ │
│ └─retro
│ 404NotFound.png
│ blue_eye.png
│ chrome_logo.png
│ coin.png
│ github.png
│ githubIcon.png
│ green_flower.png
│ item_sample.png
│ memo.png
│ pencil_retro.png
│ profile tape.png
│ profilePic.jpeg
│ red_ghost.png
│ retro_img.png
│ smile.png
│ smile_and_light.png
│ smile_bottom.png
│ smile_computer.png
│ smile_large.png
│ spring.png
│ star.png
│ tistoryIcon.png
│ work_hard.png
│ yellow_flower.png
│ yellow_ghost.png
│
├─components
│ ├─common
│ │ └─Button
│ │ Button.tsx
│ │ styles.tsx
│ │
│ ├─CSQuiz
│ │ ├─CSQuizContents
│ │ │ CSQuizContents.tsx
│ │ │ styles.tsx
│ │ │
│ │ └─CSQuizTimer
│ │ CSQuizTimer.tsx
│ │ styles.tsx
│ │
│ ├─CSQuizMap
│ │ └─CharacterModels
│ │ F1_CS.tsx
│ │ F2_CS.tsx
│ │ F3_CS.tsx
│ │ M1_CS.tsx
│ │ M2_CS.tsx
│ │ M3_CS.tsx
│ │
│ ├─Feed
│ │ FeedComponent.tsx
│ │ styles.tsx
│ │
│ ├─ItemShop
│ │ ├─ItemItem
│ │ │ ItemItem.tsx
│ │ │ ItemModalStyle.tsx
│ │ │ styles.tsx
│ │ │
│ │ ├─ItemList
│ │ │ ItemList.tsx
│ │ │ styles.tsx
│ │ │
│ │ ├─ItemModal.tsx
│ │ │ ItemModal.tsx
│ │ │ styles.tsx
│ │ │
│ │ └─ItemWrapper
│ │ │ ItemWrapper.tsx
│ │ │
│ │ └─Models
│ │ Bedside_light_1.tsx
│ │ Black_chair_1.tsx
│ │ Black_coffeemachine_1.tsx
│ │ Black_cup_1.tsx
│ │ Black_leather_sofa_1.tsx
│ │ Black_speaker_1.tsx
│ │ Black_teatable_1.tsx
│ │ Blue_bed.tsx
│ │ Blue_chair_1.tsx
│ │ Blue_chair_2.tsx
│ │ Blue_sofa_1.tsx
│ │ Brown_table_1.tsx
│ │ Brown_table_2.tsx
│ │ Brown_table_3.tsx
│ │ Brown_table_4.tsx
│ │ Coffee_cup_1.tsx
│ │ Elec_guitar_1.tsx
│ │ Elec_guitar_2.tsx
│ │ Elec_guitar_3.tsx
│ │ Giant_sofa_1.tsx
│ │ Green_sofa_1.tsx
│ │ Grey_bin_1.tsx
│ │ Group_guitar_1.tsx
│ │ House_tree_1.tsx
│ │ Imac_computer_1.tsx
│ │ Katana_decoration_1.tsx
│ │ Leopard_chair_1.tsx
│ │ Low_table_1.tsx
│ │ Marble_table_1.tsx
│ │ Marble_table_2.tsx
│ │ Old_computer_1.tsx
│ │ Old_computer_2.tsx
│ │ Old_microwave_1.tsx
│ │ Old_tv_1.tsx
│ │ Orange_sofa_1.tsx
│ │ Photo_frame_1.tsx
│ │ Photo_frame_2.tsx
│ │ Red_chair_1.tsx
│ │ Red_lights_1.tsx
│ │ Red_sofa_1.tsx
│ │ Red_telephone_1.tsx
│ │ Retro_arcadegame_1.tsx
│ │ Round_table_1.tsx
│ │ Small_speaker_1.tsx
│ │ Stall_white_chair_1.tsx
│ │ Starwars_trooper_1.tsx
│ │ Teddybear_1.tsx
│ │ Tree_vase_1.tsx
│ │ Trooper_figure_1.tsx
│ │ White_chair_1.tsx
│ │ White_controller_1.tsx
│ │ White_skeleton_1.tsx
│ │ White_sofa_1.tsx
│ │ White_table_1.tsx
│ │ Wine_glass_1.tsx
│ │ Wood_chair_1.tsx
│ │ Wood_desk_0.tsx
│ │ Wood_desk_1.tsx
│ │ Wood_desk_2.tsx
│ │ Wood_drawer_1.tsx
│ │ Wood_shelve.tsx
│ │ Wood_table_1.tsx
│ │ Yellow_sofa_1.tsx
│ │
│ ├─Loading
│ │ Loading.tsx
│ │
│ ├─Login
│ │ ├─LoginForm
│ │ │ LoginForm.tsx
│ │ │ styles.tsx
│ │ │
│ │ ├─Models
│ │ │ │ CameraAndLight.tsx
│ │ │ │ F1.tsx
│ │ │ │ F2.tsx
│ │ │ │ F3.tsx
│ │ │ │ LoginModel.tsx
│ │ │ │ M1.tsx
│ │ │ │ M2.tsx
│ │ │ │ M3.tsx
│ │ │ │
│ │ │ └─OtherModles
│ │ │ F1_Other.tsx
│ │ │ F2_Other.tsx
│ │ │ F3_Other.tsx
│ │ │ M1_Other.tsx
│ │ │ M2_Other.tsx
│ │ │ M3_Other.tsx
│ │ │
│ │ ├─UserCharacter
│ │ │ styles.tsx
│ │ │ UserCharacter.tsx
│ │ │
│ │ ├─UserCharacterWrapper
│ │ │ styles.tsx
│ │ │ UserCharacterWrapper.tsx
│ │ │
│ │ └─UserInfoForm
│ │ styles.tsx
│ │ UserInfoForm.tsx
│ │
│ ├─Main
│ │ ├─Models
│ │ │ AirBalloon.tsx
│ │ │ Bloomer.tsx
│ │ │ Car.tsx
│ │ │ Csquiz_font.tsx
│ │ │ CS_direct.tsx
│ │ │ Deco.tsx
│ │ │ DoLearn.tsx
│ │ │ F1_Main.tsx
│ │ │ F2_Main.tsx
│ │ │ F3_Main.tsx
│ │ │ Feed.tsx
│ │ │ Feed_direct.tsx
│ │ │ Feed_font.tsx
│ │ │ Floor.tsx
│ │ │ Flower.tsx
│ │ │ Grass.tsx
│ │ │ Ground.tsx
│ │ │ House.tsx
│ │ │ ItemShopMap.tsx
│ │ │ ItemShop_font.tsx
│ │ │ Learnway.tsx
│ │ │ M1_Main.tsx
│ │ │ M2_Main.tsx
│ │ │ M3_Main.tsx
│ │ │ Maker.tsx
│ │ │ Myroom_font.tsx
│ │ │ NewCsQuiz.tsx
│ │ │ Obaek.tsx
│ │ │ Osakak.tsx
│ │ │ Room_direct.tsx
│ │ │ Sellog.tsx
│ │ │ Shop_direct.tsx
│ │ │ Stone.tsx
│ │ │ Tantan.tsx
│ │ │ Tree.tsx
│ │ │ Weather.tsx
│ │ │ Ydg.tsx
│ │ │
│ │ └─ToggleButton
│ │ styles.tsx
│ │ ToggleButton.tsx
│ │
│ ├─MyGoals
│ │ ├─Accumulate
│ │ │ Accumulate.tsx
│ │ │ styles.tsx
│ │ │
│ │ ├─Chart
│ │ │ Chart.tsx
│ │ │ styles.tsx
│ │ │
│ │ ├─DailyDoneItem
│ │ │ DailyDoneItem.tsx
│ │ │ styles.tsx
│ │ │
│ │ ├─DailyDoneList
│ │ │ DailyDoneList.tsx
│ │ │ styles.tsx
│ │ │
│ │ ├─DailyDoneModal
│ │ │ DailyDoneModal.tsx
│ │ │ styles.tsx
│ │ │
│ │ ├─GoalsSetting
│ │ │ GoalsSetting.tsx
│ │ │ styles.tsx
│ │ │
│ │ ├─GoalsSettingModal
│ │ │ GoalsSettingModal.tsx
│ │ │ styles.tsx
│ │ │
│ │ ├─RCalendar
│ │ │ RCalendar.tsx
│ │ │ styles.tsx
│ │ │
│ │ ├─Record
│ │ │ Record.tsx
│ │ │ styles.tsx
│ │ │
│ │ └─SettingButtons
│ │ SettingButtons.tsx
│ │ styles.tsx
│ │
│ └─MyRoom
│ ├─EditProfile
│ │ EditProfile.tsx
│ │ styles.tsx
│ │
│ ├─EditProfileModal
│ │ EditProfileModal.tsx
│ │ styles.tsx
│ │
│ ├─InstallModal
│ │ InstallModal.tsx
│ │ styles.tsx
│ │
│ ├─Models
│ │ Room1.tsx
│ │ Room2.tsx
│ │ Room3.tsx
│ │ Room4.tsx
│ │
│ ├─MyItemItem
│ │ MyItemItem.tsx
│ │ styles.tsx
│ │
│ ├─MyItemList
│ │ MyItemList.tsx
│ │ styles.tsx
│ │
│ ├─MyProfile
│ │ MyProfile.tsx
│ │ styles.tsx
│ │
│ ├─MyRoomContainer
│ │ MyRoomContainer.tsx
│ │ styles.tsx
│ │
│ ├─NoTarget
│ │ NoTarget.tsx
│ │ styles.tsx
│ │
│ ├─RoomEditContainer
│ │ │ RoomEditContainer.tsx
│ │ │
│ │ └─Models
│ │ Bedside_light_1.tsx
│ │ Black_chair_1.tsx
│ │ Black_coffeemachine_1.tsx
│ │ Black_cup_1.tsx
│ │ Black_leather_sofa_1.tsx
│ │ Black_speaker_1.tsx
│ │ Black_teatable_1.tsx
│ │ Blue_bed.tsx
│ │ Blue_chair_1.tsx
│ │ Blue_chair_2.tsx
│ │ Blue_sofa_1.tsx
│ │ Brown_table_1.tsx
│ │ Brown_table_2.tsx
│ │ Brown_table_3.tsx
│ │ Brown_table_4.tsx
│ │ Coffee_cup_1.tsx
│ │ Elec_guitar_1.tsx
│ │ Elec_guitar_2.tsx
│ │ Elec_guitar_3.tsx
│ │ Giant_sofa_1.tsx
│ │ Green_sofa_1.tsx
│ │ Grey_bin_1.tsx
│ │ Group_guitar_1.tsx
│ │ House_tree_1.tsx
│ │ Imac_computer_1.tsx
│ │ Katana_decoration_1.tsx
│ │ Leopard_chair_1.tsx
│ │ Low_table_1.tsx
│ │ Marble_table_1.tsx
│ │ Marble_table_2.tsx
│ │ Old_computer_1.tsx
│ │ Old_computer_2.tsx
│ │ Old_microwave_1.tsx
│ │ Old_tv_1.tsx
│ │ Orange_sofa_1.tsx
│ │ Photo_frame_1.tsx
│ │ Photo_frame_2.tsx
│ │ Red_chair_1.tsx
│ │ Red_lights_1.tsx
│ │ Red_sofa_1.tsx
│ │ Red_telephone_1.tsx
│ │ Retro_arcadegame_1.tsx
│ │ Round_table_1.tsx
│ │ Small_speaker_1.tsx
│ │ Stall_white_chair_1.tsx
│ │ Starwars_trooper_1.tsx
│ │ Teddybear_1.tsx
│ │ Tree_vase_1.tsx
│ │ Trooper_figure_1.tsx
│ │ White_chair_1.tsx
│ │ White_controller_1.tsx
│ │ White_skeleton_1.tsx
│ │ White_sofa_1.tsx
│ │ White_table_1.tsx
│ │ Wine_glass_1.tsx
│ │ Wood_chair_1.tsx
│ │ Wood_desk_0.tsx
│ │ Wood_desk_1.tsx
│ │ Wood_desk_2.tsx
│ │ Wood_drawer_1.tsx
│ │ Wood_shelve.tsx
│ │ Wood_table_1.tsx
│ │ Yellow_sofa_1.tsx
│ │
│ ├─RoomEditItems
│ │ └─Models
│ │ ChairEdit.tsx
│ │ WoodDeskEdit.tsx
│ │
│ └─WithdrawModal
│ styles.tsx
│ WithdrawModal.tsx
│
├─pages
│ ├─CSQuiz
│ │ CSQuiz.tsx
│ │ styles.tsx
│ │
│ ├─CSQuizBattleResult
│ │ CSQuizBattleResult.tsx
│ │ styles.tsx
│ │
│ ├─CSQuizMap
│ │ │ CSQuizMap.tsx
│ │ │ styles.tsx
│ │ │
│ │ └─Models
│ │ OMark.tsx
│ │ XMark.tsx
│ │
│ ├─CSQuizMatching
│ │ CSQuizMatching.tsx
│ │ styles.tsx
│ │
│ ├─CSQuizProgress
│ │ CSQuizProgress.tsx
│ │ styles.tsx
│ │
│ ├─CSQuizResult
│ │ CSQuizResult.tsx
│ │ styles.tsx
│ │
│ ├─CSQuizSelect
│ │ CSQuizSelect.tsx
│ │ styles.tsx
│ │
│ ├─Feed
│ │ Feed.tsx
│ │ styles.tsx
│ │
│ ├─Info
│ │ Info.tsx
│ │ styles.tsx
│ │
│ ├─ItemShop
│ │ ItemShop.tsx
│ │ styles.tsx
│ │
│ ├─Login
│ │ Login.tsx
│ │ styles.tsx
│ │
│ ├─Main
│ │ Main.tsx
│ │ styles.tsx
│ │
│ ├─MyGoals
│ │ MyGoals.tsx
│ │ styles.tsx
│ │
│ ├─MyRoom
│ │ │ MyRoom.tsx
│ │ │ styles.tsx
│ │ │
│ │ └─MyItems
│ │ MyItems.tsx
│ │ styles.tsx
│ │
│ ├─NotFound
│ │ NotFound.tsx
│ │ styles.tsx
│ │
│ ├─OauthRedirect
│ │ OauthRedirect.tsx
│ │
│ └─TermsOfUse
│ styles.tsx
│ TermsOfUse.tsx
│
├─recoil
│ ├─csquiz
│ │ atoms.tsx
│ │ selectors.tsx
│ │ useCSquiz.tsx
│ │
│ ├─feed
│ │ atoms.tsx
│ │ selectors.tsx
│ │ useFeed.tsx
│ │
│ ├─itemshop
│ │ atoms.tsx
│ │ selectors.tsx
│ │ useItemshop.tsx
│ │
│ ├─mainpage
│ │ atoms.tsx
│ │ selectors.tsx
│ │ useMainpage.tsx
│ │
│ ├─mygoals
│ │ atoms.tsx
│ │
│ ├─myroom
│ │ atoms.tsx
│ │ myroom.tsx
│ │ selectors.tsx
│ │
│ └─user
│ atom.ts
│
├─typeModels
│ ├─Feed
│ │ feedinterfaces.ts
│ │
│ ├─ItemShop
│ │ iteminterfaces.ts
│ │
│ ├─mygoals
│ │ myGoalInterfaces.ts
│ │ myRecordInterfaces.ts
│ │
│ ├─MyRoom
│ │ MyroomInterfaces.ts
│ │
│ └─user
│ userEditInfo.ts
│ userSignup.ts
│
└─utils
itemDefaultInfo.ts
token.ts
Back-end
C:.
│ README.md
│
├─back-end
│ │ .gitignore
│ │ build.gradle
│ │ Dockerfile
│ │ gradlew
│ │ gradlew.bat
│ │ settings.gradle
│ │
│ ├─gradle
│ │ └─wrapper
│ │ gradle-wrapper.jar
│ │ gradle-wrapper.properties
│ │
│ └─src
│ ├─main
│ │ ├─java
│ │ │ └─com
│ │ │ └─example
│ │ │ └─selog
│ │ │ │ SelogApplication.java
│ │ │ │
│ │ │ ├─config
│ │ │ │ JasyptConfig.java
│ │ │ │ JpaAuditingConfiguration.java
│ │ │ │ QueryDslConfig.java
│ │ │ │ RestTemplateConfig.java
│ │ │ │ S3Config.java
│ │ │ │ SecurityConfig.java
│ │ │ │
│ │ │ ├─controller
│ │ │ │ ExamController.java
│ │ │ │ FeedController.java
│ │ │ │ GitHubController.java
│ │ │ │ MemberController.java
│ │ │ │ RecordController.java
│ │ │ │ RoomController.java
│ │ │ │ StoreController.java
│ │ │ │ WebHookController.java
│ │ │ │
│ │ │ ├─dto
│ │ │ │ ├─exam
│ │ │ │ │ ExamDto.java
│ │ │ │ │
│ │ │ │ ├─feed
│ │ │ │ │ FeedDto.java
│ │ │ │ │
│ │ │ │ ├─github
│ │ │ │ │ GitHubDto.java
│ │ │ │ │
│ │ │ │ ├─member
│ │ │ │ │ MemberDto.java
│ │ │ │ │ MemberUpdateDto.java
│ │ │ │ │ SignUpDto.java
│ │ │ │ │ TargetDto.java
│ │ │ │ │ TokenDto.java
│ │ │ │ │ TokenRequestDto.java
│ │ │ │ │
│ │ │ │ ├─oauth
│ │ │ │ │ OAuthAttributes.java
│ │ │ │ │
│ │ │ │ ├─record
│ │ │ │ │ RecordDto.java
│ │ │ │ │ RecordMaintainDto.java
│ │ │ │ │ RecordRequestDto.java
│ │ │ │ │ RecordResponseDto.java
│ │ │ │ │
│ │ │ │ ├─room
│ │ │ │ │ StoreItemDto.java
│ │ │ │ │ UserItemDto.java
│ │ │ │ │
│ │ │ │ └─store
│ │ │ │ ItemDto.java
│ │ │ │
│ │ │ ├─entity
│ │ │ │ Authority.java
│ │ │ │ BaseTime.java
│ │ │ │ Exam.java
│ │ │ │ Feed.java
│ │ │ │ GitHub.java
│ │ │ │ Item.java
│ │ │ │ Member.java
│ │ │ │ Record.java
│ │ │ │ Room.java
│ │ │ │ UserItem.java
│ │ │ │
│ │ │ ├─exception
│ │ │ │ │ CustomException.java
│ │ │ │ │ JwtAccessDeniedHandler.java
│ │ │ │ │ JwtAuthenticationEntryPoint.java
│ │ │ │ │ OpenAIException.java
│ │ │ │ │
│ │ │ │ └─error
│ │ │ │ ErrorCode.java
│ │ │ │
│ │ │ ├─handler
│ │ │ │ CustomOAuth2UserRequestEntityConverter.java
│ │ │ │ CustomRequestEntityConverter.java
│ │ │ │ CustomTokenResponseConverter.java
│ │ │ │ Oauth2FailHandler.java
│ │ │ │ Oauth2SuccessHandler.java
│ │ │ │
│ │ │ ├─jwt
│ │ │ │ JwtFilter.java
│ │ │ │ JwtSecurityConfig.java
│ │ │ │ TokenProvider.java
│ │ │ │
│ │ │ ├─repository
│ │ │ │ ExamRepository.java
│ │ │ │ FeedRepository.java
│ │ │ │ GitHubRepository.java
│ │ │ │ ItemRepository.java
│ │ │ │ MemberRepository.java
│ │ │ │ QExamRepository.java
│ │ │ │ QExamRepositoryImpl.java
│ │ │ │ QFeedRepository.java
│ │ │ │ QFeedRepositoryImpl.java
│ │ │ │ QGitHubRepository.java
│ │ │ │ QGitHubRepositoryImpl.java
│ │ │ │ QItemUserItemRepository.java
│ │ │ │ QItemUserItemRepositoryImpl.java
│ │ │ │ QRecordRepository.java
│ │ │ │ QRecordRepositoryImpl.java
│ │ │ │ QRoomRepository.java
│ │ │ │ QUserItemRepository.java
│ │ │ │ QUserItemRepositoryImpl.java
│ │ │ │ RecordRepository.java
│ │ │ │ RoomRepository.java
│ │ │ │ UserItemRepository.java
│ │ │ │
│ │ │ ├─response
│ │ │ │ ErrorResponse.java
│ │ │ │ SuccessResponse.java
│ │ │ │
│ │ │ ├─service
│ │ │ │ CustomOauth2UserService.java
│ │ │ │ CustomUserDetailsService.java
│ │ │ │ ExamService.java
│ │ │ │ FeedService.java
│ │ │ │ GitHubService.java
│ │ │ │ MemberService.java
│ │ │ │ RecordService.java
│ │ │ │ RoomService.java
│ │ │ │ S3Uploader.java
│ │ │ │ StoreService.java
│ │ │ │ WebHookService.java
│ │ │ │
│ │ │ └─util
│ │ │ SecurityUtil.java
│ │ │
│ │ └─resources
│ │ application.properties
│ │
│ └─test
│ ├─java
│ │ └─com
│ │ └─example
│ │ └─selog
│ │ │ SelogApplicationTests.java
│ │ │
│ │ ├─config
│ │ │ JasyptConfigTest.java
│ │ │ TestConfig.java
│ │ │
│ │ ├─controller
│ │ │ ExamControllerTest.java
│ │ │ FeedControllerTest.java
│ │ │ GitHubControllerTest.java
│ │ │ MemberControllerTest.java
│ │ │ RecordControllerTest.java
│ │ │ RoomControllerTest.java
│ │ │ StoreControllerTest.java
│ │ │ WebHookControllerTest.java
│ │ │
│ │ ├─jwt
│ │ │ JwtFilterTest.java
│ │ │ TokenProviderTest.java
│ │ │
│ │ ├─repository
│ │ │ ExamRepositoryTest.java
│ │ │ FeedRepositoryTest.java
│ │ │ GitHubRepositoryTest.java
│ │ │ ItemRepositoryTest.java
│ │ │ MemberRepositoryTest.java
│ │ │ RecordRepositoryTest.java
│ │ │ RoomRepositoryTest.java
│ │ │ UserItemRepositoryTest.java
│ │ │
│ │ └─service
│ │ ExamServiceTest.java
│ │ FeedServiceTest.java
│ │ GitHubServiceTest.java
│ │
│ └─resources
│ application-test.properties
│
├─back-matching
│ │ .gitignore
│ │ build.gradle
│ │ Dockerfile
│ │ gradlew
│ │ gradlew.bat
│ │ settings.gradle
│ │
│ ├─gradle
│ │ └─wrapper
│ │ gradle-wrapper.jar
│ │ gradle-wrapper.properties
│ │
│ └─src
│ ├─main
│ │ ├─java
│ │ │ └─com
│ │ │ └─example
│ │ │ └─realtime
│ │ │ │ MatchingApplication.java
│ │ │ │
│ │ │ ├─config
│ │ │ │ RabbitMQConfig.java
│ │ │ │
│ │ │ ├─dto
│ │ │ │ MatchingDto.java
│ │ │ │
│ │ │ └─schedule
│ │ │ Matching.java
│ │ │ MatchingAlgorithm.java
│ │ │ MatchingListener.java
│ │ │ MatchingQueue.java
│ │ │ SendMatching.java
│ │ │
│ │ └─resources
│ │ application.properties
│ │
│ └─test
│ └─java
│ └─com
│ └─example
│ └─realtime
│ MatchingApplicationTests.java
│
├─back-realtime
│ │ .gitignore
│ │ build.gradle
│ │ Dockerfile
│ │ gradlew
│ │ gradlew.bat
│ │ settings.gradle
│ │
│ ├─gradle
│ │ └─wrapper
│ │ gradle-wrapper.jar
│ │ gradle-wrapper.properties
│ │
│ └─src
│ ├─main
│ │ ├─java
│ │ │ └─com
│ │ │ └─example
│ │ │ └─realtime
│ │ │ │ RealtimeApplication.java
│ │ │ │
│ │ │ ├─config
│ │ │ │ JasyptConfig.java
│ │ │ │ QueryDslConfig.java
│ │ │ │ RabbitMQConfig.java
│ │ │ │ SecurityConfig.java
│ │ │ │ WebSocketConfig.java
│ │ │ │
│ │ │ ├─controller
│ │ │ │ MatchingController.java
│ │ │ │ RealTimeController.java
│ │ │ │
│ │ │ ├─dto
│ │ │ │ ExamDto.java
│ │ │ │ MatchingDto.java
│ │ │ │ MemberDto.java
│ │ │ │ RealTimeInfoDto.java
│ │ │ │
│ │ │ ├─entity
│ │ │ │ Authority.java
│ │ │ │ Exam.java
│ │ │ │ Member.java
│ │ │ │
│ │ │ ├─exception
│ │ │ │ │ CustomException.java
│ │ │ │ │
│ │ │ │ └─error
│ │ │ │ ErrorCode.java
│ │ │ │
│ │ │ ├─handler
│ │ │ │ StompHandler.java
│ │ │ │ WebSocketEventListener.java
│ │ │ │
│ │ │ ├─jwt
│ │ │ │ TokenProvider.java
│ │ │ │
│ │ │ ├─repository
│ │ │ │ ExamRepository.java
│ │ │ │ MemberRepository.java
│ │ │ │ QExamRepository.java
│ │ │ │ QExamRepositoryImpl.java
│ │ │ │
│ │ │ ├─response
│ │ │ │ ErrorResponse.java
│ │ │ │ SuccessResponse.java
│ │ │ │
│ │ │ ├─service
│ │ │ │ ChatService.java
│ │ │ │ ExamService.java
│ │ │ │ MatchingService.java
│ │ │ │ MemberService.java
│ │ │ │
│ │ │ └─util
│ │ │ SecurityUtil.java
│ │ │
│ │ └─resources
│ │ application.properties
│ │
│ └─test
│ └─java
│ └─com
│ └─example
│ └─realtime
│ RealtimeApplicationTests.java
│
├─back-schedule
│ │ .gitignore
│ │ build.gradle
│ │ Dockerfile
│ │ gradlew
│ │ gradlew.bat
│ │ settings.gradle
│ │
│ ├─gradle
│ │ └─wrapper
│ │ gradle-wrapper.jar
│ │ gradle-wrapper.properties
│ │
│ └─src
│ ├─main
│ │ ├─java
│ │ │ └─com
│ │ │ └─example
│ │ │ └─estable
│ │ │ │ EstableApplication.java
│ │ │ │
│ │ │ ├─config
│ │ │ │ JpaAuditingConfiguration.java
│ │ │ │
│ │ │ ├─dto
│ │ │ │ FeedDto.java
│ │ │ │ RecordDto.java
│ │ │ │
│ │ │ ├─entity
│ │ │ │ Authority.java
│ │ │ │ BaseTime.java
│ │ │ │ Feed.java
│ │ │ │ Member.java
│ │ │ │ Record.java
│ │ │ │
│ │ │ ├─repository
│ │ │ │ FeedRepository.java
│ │ │ │ MemberRepository.java
│ │ │ │ RecordRepository.java
│ │ │ │
│ │ │ ├─schedule
│ │ │ │ ├─baekjoon
│ │ │ │ │ CrawlingService.java
│ │ │ │ │
│ │ │ │ └─feed
│ │ │ │ FeedService.java
│ │ │ │
│ │ │ └─util
│ │ │ RSSReader.java
│ │ │
│ │ └─resources
│ │ application.properties
│ │
│ └─test
│ └─java
│ └─com
│ └─example
│ └─estable
│ EstableApplicationTests.java
│
├─chrome-extension
│ │ .eslintrc
│ │ .gitignore
│ │ .prettierrc
│ │ LICENSE
│ │ manifest.json
│ │ package.json
│ │ popup.html
│ │ popup.js
│ │ README.md
│ │ rules.json
│ │ welcome.html
│ │ welcome.js
│ │
│ ├─assets
│ │ profile1.png
│ │ ribbon.png
│ │ sellogo.png
│ │ smile.png
│ │ tag.png
│ │ tistory.png
│ │ tornado.png
│ │
│ ├─css
│ │ │ popup.css
│ │ │ welcome.css
│ │ │
│ │ ├─baekjoon
│ │ │ inject.css
│ │ │
│ │ ├─programmers
│ │ │ inject.css
│ │ │
│ │ └─swexpertacademy
│ │ inject.css
│ │
│ ├─library
│ │ FileSaver.min.js
│ │ jquery-3.3.1.min.js
│ │ jszip.min.js
│ │ semantic.min.js
│ │ sha1.min.js
│ │ spin.js
│ │
│ └─scripts
│ │ authorize.js
│ │ background.js
│ │ enable.js
│ │ Github.js
│ │ oauth2.js
│ │ storage.js
│ │ toast.js
│ │ util.js
│ │
│ ├─baekjoon
│ │ baekjoon.js
│ │ parsing.js
│ │ storage.js
│ │ uploadfunctions.js
│ │ util.js
│ │ variables.js
│ │
│ ├─programmers
│ │ parsing.js
│ │ programmers.js
│ │ uploadfunctions.js
│ │ util.js
│ │ variables.js
│ │
│ ├─swexpertacademy
│ │ parsing.js
│ │ storage.js
│ │ swexpertacademy.js
│ │ uploadfunctions.js
│ │ util.js
│ │ variables.js
│ │
│ ├─tistory
│ │ tistory.js
│ │ uploadfunctions.js
│ │
│ └─velog
│ uploadfunctions.js
│ velog.js
- GitHub ID를 통한 소셜 로그인으로 서비스를 이용할 수 있습니다.
- 신규 회원이라면 소셜로그인 후 캐릭터, 이름, 좌우명을 필수 사항으로 입력받으며, 이메일, GitHub, 블로그 주소를 선택 사항으로 입력받습니다. 입력받은 정보는 메인 페이지 및 MyRoom 페이지에서 활용됩니다.
- 회원가입을 완료하면 전체적인 서비스에 대한 이용 안내 페이지로 이동합니다.
- 스크롤을 통해 서비스의 주요기능들에 대한 안내사항을 볼 수 있으며, 좌측 상단의 버튼을 누르면 메인 페이지로 이동할 수 있습니다.
- 스크롤을 최하단으로 이동하면 서비스의 핵심 요소인 Chrome Extension에 대한 설명을 확인할 수 있고, INSTALL 버튼을 클릭하여 Extension의 설치 페이지로 이동할 수 있습니다.
- 유저의 캐릭터와 맵이 3D로 표시되며, 마우스 클릭을 통해 맵을 자유롭게 이동할 수 있습니다.
- CS, FEED, SHOP, ROOM 4가지의 길로 이동 가능합니다.
- 각 페이지의 Spot으로 이동하면 해당 페이지로 이동할 수 있는 버튼이 나타납니다.
- 우측 상단의 토글 버튼을 통해서도 원하는 페이지로 이동할 수 있습니다.
- MyRoom의 좌측 탭에서는 유저의 프로필 정보와 유저가 설정한 습관을 확인할 수 있습니다.
- 우측 탭에서는 유저의 3D 방을 볼 수 있습니다.
- 우측 하단에 있는 MyItems를 클릭하면 좌측 탭이 전환되며 유저가 보유한 아이템을 카테고리별로 확인할 수 있습니다.
- 아이템을 클릭하면 방에 해당 아이템이 나타나며, 원하는 위치와 각도를 설정하여 방을 꾸밀 수 있습니다.
- 아이템은 올리기, 내리기, 회전, 삭제가 가능합니다.
-
My Goals 페이지에서는 5가지(Github, Blog, Algorithm, Feed, CS Quiz)의 습관을 설정할 수 있고, 달성한 습관들에 대한 통계 및 상세 정보를 확인할 수 있습니다.
-
습관 설정
- 좌측 탭에서 각 습관 설정 버튼을 누르면 모달을 통해 유저가 원하는 습관 주기를 설정할 수 있습니다.
- 습관 주기는 추천 주기가 제시되며, 추천 주기로 설정할 시 누적보상을 획득할 수 있습니다.
- 추천 주기는 커밋의 경우 1일 1커밋, 블로그는 7일 1포스팅, 알고리즘 문제는 1일 1문제풀기로 이외의 경우는 누적보상을 지급하지 않습니다.
-
통계 및 상세정보
- 우측 탭의 상단에서는 각 습관별 유지 중인 일수와 누적 보상 정보를 확인할 수 있습니다.
- 차트를 통해 각 습관을 달성한 횟수를 시각적으로 확인할 수 있습니다.
- 우측 탭의 하단에서는 캘린더를 통해 일자별 달성한 습관의 상세정보를 확인할 수 있습니다.
- 확인하고 싶은 일자를 선택하면 해당 일자에 달성한 습관들이 표시됩니다. 표시된 습관을 누르면 달성한 습관의 상세 정보가 표시됩니다.
- Item Shop 페이지에서는 습관 달성을 통해 획득한 포인트로 아이템을 구매할 수 있습니다.
- 아이템들은 카테고리로 구분되어 있으며, 좌측 버튼을 통해 카테고리별 아이템을 확인할 수 있습니다.
- 각 아이템을 클릭하면 미리보기 화면이 3D로 제공되며, 마우스를 통해 회전시켜 다양한 각도에서 아이템을 확인할 수 있습니다.
- Solo Play에서는 5가지(Data Structure, Operating System, Database, Network, Programming Common)의 영역 중 한 가지를 선택하면 5문제가 출제됩니다.
- 각 문제는 4지선다로 이루어져 있으며, 2분의 제한시간이 있습니다.
- 1vs1 Battle에서는 다른 유저와 실시간 CS Quiz 대결을 할 수 있습니다.
- 매칭이 이루어지면 3개의 OX 퀴즈가 출제되며, 각 문제당 10초의 제한시간이 있습니다.
- 더 많은 문제를 맞힌 유저가 승리하게 됩니다.
- 개발자 피드 페이지에서는 유명 IT 기업들의 기술 블로그를 모아 볼 수 있습니다.
- 좌측 nav바에서는 조회수가 높은 게시글 10개를 확인 할 수 있습니다.
- 한 유저가 같은 게시물을 보더라도 조회수는 1번만 증가하게 됩니다.
- 유저가 블로그 글을 작성하면 Sellog의 Chrome Extension을 통해 자동으로 감지하여 습관 달성 여부를 판단합니다.
- ChatGPT를 통해 유저가 작성한 글을 검증하여 자체 필터링을 합니다.
- 유저가 온라인 저지 사이트에서 알고리즘 문제를 풀면 Sellog의 Chrome Extension을 통해 자동으로 감지하여 습관 달성 여부를 판단합니다.
- 유저가 Github에 commit을 하면 repository에 등록된 webhook요청을 서버가 받아 습관 commit을 기록하게 됩니다.
- 유저가 Sellog의 CS Quiz를 다 푼 경우 문제를 풀었다는 정보가 서버에 기록됩니다.
- 유저가 Sellog의 Feed를 선택하여 읽게 되면 조회수 증가와 Feed를 읽었다는 정보가 서버에 기록됩니다.
구분 | 기본보상 | 누적 일수 1-6일 | 누적 일수 ~11일 | 누적 일수 ~16일 | 누적 일수 ~21일 | 누적 일수 ~26일 | 누적 일수 ~66일 |
---|---|---|---|---|---|---|---|
github | 10 point | 10 point | 10 point | 10 point | 20 point | 10 point | 20 point |
blog 포스팅 | 40 point | 10 point | 10 point | 10 point | 40 point | 10 point | 40 point |
algorithm | 15 point | 10 point | 10 point | 10 point | 10 point | 10 point | 10 point |
cs 문제 풀기 | 2 point | 없음 | 없음 | 없음 | 없음 | 없음 | 없음 |
개발 피드 | 5 point | 없음 | 없음 | 없음 | 없음 | 없음 | 없음 |
※ 뇌가 습관을 인식하는데 21일, 몸이 습관을 받아들이는데는 66일이 걸린다는 점을 참고해, 21일과 66일 달성시에는 추가 누적 포인트 지급함.
🎥 UCC 보러가기
구분 | 링크 |
---|---|
포팅 매뉴얼 | 포팅 매뉴얼 바로가기 |
시연 시나리오 | 시연 시나리오 바로가기 |
DB 덤프 데이터 | DB 덤프 데이터 |