Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/woowacourse-teams/2023-diggin-room

๐ŸŽต ์‚ฌ์šฉ์ž ํ™œ๋™์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์Œ์•…์„ ์ถ”์ฒœํ•˜๋Š” ์ˆํผ ์ปจํ…์ธ  ์„œ๋น„์Šค
https://github.com/woowacourse-teams/2023-diggin-room

android kotlin spring spring-boot

Last synced: about 3 hours ago
JSON representation

๐ŸŽต ์‚ฌ์šฉ์ž ํ™œ๋™์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์Œ์•…์„ ์ถ”์ฒœํ•˜๋Š” ์ˆํผ ์ปจํ…์ธ  ์„œ๋น„์Šค

Awesome Lists containing this project

README

        

Diggin' Room


์‚ฌ์šฉ์ž ํ™œ๋™์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์Œ์•…์„ ์ถ”์ฒœํ•˜๋Š” ์ˆํผ ์ปจํ…์ธ  ์„œ๋น„์Šค ๐ŸŽต

![Kotlin](https://img.shields.io/badge/kotlin-%237F52FF.svg?style=for-the-badge&logo=kotlin&logoColor=white)
![Android](https://img.shields.io/badge/Android-3DDC84?style=for-the-badge&logo=android&logoColor=white)
![Java](https://img.shields.io/badge/java-%23ED8B00.svg?style=for-the-badge&logo=openjdk&logoColor=white)
![Spring](https://img.shields.io/badge/spring-%236DB33F.svg?style=for-the-badge&logo=spring&logoColor=white)
![MySQL](https://img.shields.io/badge/mysql-%2300f.svg?style=for-the-badge&logo=mysql&logoColor=white)

# ๊ธฐ๋Šฅ
**์Œ์•… ํƒ์ƒ‰**
- ์ƒˆ๋กœ์šด ์Œ์•…์„ ์ฐพ๊ธฐ ์œ„ํ•ด ์•„๋ž˜๋กœ ์Šค์™€์ดํ”„ ํ•ด๋ณด์„ธ์š”!
- ๋Š๊น€์—†๋Š” ๋ถ€๋“œ๋Ÿฌ์šด ์Šคํฌ๋กค๊ณผ ๋™์˜์ƒ ์žฌ์ƒ์œผ๋กœ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ํƒ์ƒ‰ํ•  ์ˆ˜ ์žˆ์–ด์š”.

**์ถ”์ฒœ ์•Œ๊ณ ๋ฆฌ์ฆ˜**
- ์„ธ์ƒ์˜ ๋ชจ๋“  ์žฅ๋ฅด์—์„œ ์ถ”์ฒœ๋˜๋Š” ์Œ์•…์„ ์ฆ๊ฒจ๋ณด์„ธ์š”!

**์Šคํฌ๋žฉ**
- ํƒ์ƒ‰ํ•˜๋‹ค ๋ฐœ๊ฒฌํ•œ ์ข‹์€ ์Œ์•…์€ ์Šคํฌ๋žฉํ•ด์„œ ๋‚˜์ค‘์— ๋˜ ๋“ค์–ด๋ณด์„ธ์š”!

**๋Œ“๊ธ€**
- ๋‹ค๋ฅธ ์นœ๊ตฌ๋“ค๊ณผ ์Œ์•…์— ๋Œ€ํ•œ ์ƒ๊ฐ์„ ๋‚˜๋ˆ ๋ณด์„ธ์š”!

# ๊ตฌํ˜„

## ์„œ๋ฒ„

**๊ธฐ์ˆ  ์Šคํƒ**
- Spring Boot
- Spring MVC
- ORM(Spring Data JPA)
- MySQL
- ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ๋ฐ ์ธ์ˆ˜ ํ…Œ์ŠคํŠธ(JUnit 5, RestAssured, Mockito ์‚ฌ์šฉ)
- ๋กœ๊น… ํ”„๋ ˆ์ž„์›Œํฌ ์ ์šฉ, ๋ชจ๋‹ˆํ„ฐ๋ง ์‹œ์Šคํ…œ ๊ตฌ์ถ• (์ž์ฒด Filter ๋ฐ Logback ์‚ฌ์šฉ)
- DDL ํ˜•์ƒ ๊ด€๋ฆฌ ๋„๊ตฌ ์ ์šฉ(Flyway)
- ๋ฐฐํฌ ์ž๋™ํ™” (Github Actions, ํ”„๋กœํŒŒ์ผ ๋ณ„ ์„ค์ • ๋ถ„๋ฆฌ)
- ์†Œ์…œ ์‚ฌ์šฉ์ž ์ธ์ฆ(OAuth 2.0 OpenID Connect ๋ฐ ์ž์ฒด ๊ตฌ์กฐ ์‚ฌ์šฉ)
- Salting์ด ์ ์šฉ๋œ DPE(DigginRoom Password Encryption)

## ์•ˆ๋“œ๋กœ์ด๋“œ

**๊ธฐ์ˆ  ์Šคํƒ**
- MVVM
- AAC ViewModel
- Repository ํŒจํ„ด
- UI State
- Retrofit
- MockK
- ์ž์ฒด ์ž๋™ ์˜์กด ์ฃผ์ž…

**[RoomPager](https://github.com/DYGames/RoomPager)**

๋ฌธ์ œ์ 
- ์ถ”์ฒœ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฐ˜์˜์„ ์œ„ํ•œ "์‹ซ์–ด์š”" ์ œ์Šค์ฒ˜๋ฅผ ์œ„ํ•ด 4๋ฐฉํ–ฅ ์Šคํฌ๋กค ์ง€์›์ด ํ•„์š”
- ๊ธฐ์กด์˜ ScrollView ์ค‘์ฒฉ์œผ๋กœ๋Š” WebView ํ˜ธํ™˜์ด ๋ถˆ๊ฐ€๋Šฅ (WebView์—์„œ ํ„ฐ์น˜ ์ด๋ฒคํŠธ๋ฅผ ๊ฐ€๋กœ์ฑ”)
- WebView ์บ์‹ฑ, ๋ทฐ ์žฌํ™œ์šฉ ๋“ฑ ๋ณต์žกํ•œ ์ƒํƒœ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•ด ์ปค์Šคํ…€ ๋ทฐ๋ฅผ ๋งŒ๋“ค ํ•„์š”์„ฑ ์ œ๊ธฐ

๊ธฐ๋Šฅ
- 4๋ฐฉํ–ฅ ์Šคํฌ๋กค
- ๋ถ€๋“œ๋Ÿฌ์šด ํŽ˜์ด์ง•
- ๋Š๊น€์—†๋Š” ๋™์˜์ƒ ์žฌ์ƒ์„ ์œ„ํ•œ ์ด์ „, ๋‹ค์Œ ์˜์ƒ ๋ฏธ๋ฆฌ ๋กœ๋”ฉ
- ์ตœ์†Œํ•œ์˜ ๋ทฐ(3๊ฐœ)๋กœ 4๋ฐฉํ–ฅ ์Šคํฌ๋กค ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋ทฐ ์žฌ์‚ฌ์šฉ
- RecyclerView์™€ ๋™์ผํ•˜๊ฒŒ Adatper์™€ ViewHolder ๊ตฌํ˜„์œผ๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
- ์ƒˆ๋กœ์šด ๋™์˜์ƒ ๋กœ๋“œ, ์žฌ์‚ฌ์šฉ์— ๋Œ€ํ•œ ์ฝœ๋ฐฑ ์ œ๊ณต

**LogResult**

๋ฌธ์ œ์ 
- ๋„คํŠธ์›Œํฌ ์š”์ฒญ, ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์—์„œ ์„ฑ๊ณต๊ณผ ์‹คํŒจ ์ƒํ™ฉ ๋ชจ๋‘ ๋กœ๊ทธ ์ถœ๋ ฅ์ด ํ•„์š”

๊ธฐ๋Šฅ
- kotlin์˜ Result ํด๋ž˜์Šค์™€ ๋น„์Šทํ•˜์ง€๋งŒ ๋กœ๊ทธ๋ฅผ ์ž๋™์œผ๋กœ ์ถœ๋ ฅํ•˜๋Š” LogResult ๊ตฌํ˜„
- logRunCatching ์ „์—ญ ํ•จ์ˆ˜ ์ œ๊ณต
- ๋กœ๊ทธ๋ฅผ ์—ฌ๋Ÿฌ ์ฑ„๋„์—์„œ ์ถœ๋ ฅ ํ•  ์ˆ˜ ์žˆ๋Š” Logger ์ธํ„ฐํŽ˜์ด์Šค ์ œ๊ณต
- logRunCatching์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  onSuccess, onFailure ์ฝœ๋ฐฑ์„ ํ˜ธ์ถœํ•˜๋ฉด์„œ ๋“ฑ๋กํ•œ Logger๋“ค์— ์ž๋™์œผ๋กœ ๋กœ๊ทธ ์ถœ๋ ฅ
- ํ˜„์žฌ ์•ฑ์—๋Š” ์ฝ˜์†”, ํŒŒ์ด์–ด๋ฒ ์ด์Šค ์ฑ„๋„ ๊ตฌํ˜„

**ํ…Œ์ŠคํŠธ**
- ViewModel Test
- Domain Test

**ํ™˜๊ฒฝ**
- Kotlin 1.8.20
- Android Target SDK 33
- Android Gradle Plugin 8.0.2

## ํ˜‘์—…
**Git**
- GitHub Flow ๊ธฐ๋ฐ˜ [DRF (DigginRoomFlow)](https://github.com/woowacourse-teams/2023-diggin-room/wiki/%EA%B9%83-%EB%B8%8C%EB%9E%9C%EC%B9%98-%EC%A0%84%EB%9E%B5)

**Github Wiki**
- ํšŒ๊ณ 
- ํ”„๋กœ์ ํŠธ ์šด์˜ ๋ฐ ๊ณ„ํš
- ๊ฐœ๋ฐœ ๋ฌธ์„œ

**Notion**
- ๋ฐ์ผ๋ฆฌ ๋ฏธํŒ…
- ํšŒ์˜๋ก
- ๊ธฐํš
- ์ž๋ฃŒ
- ๊ณ ๋ฏผํ•˜๊ธฐ
- ํŒ€ ์ปจ๋ฒค์…˜

**Slack**
- ์„œ๋ฒ„ ์žฅ์•  ์•Œ๋ฆผ
- ํŒ€ ๋‚ด ๊ณต์ง€

## ํŒ€์› & ์—ญํ• 



ํŒ€์›
์—ญํ• 




์ฝ”๊ฑด (๊น€๋„์—ฝ)

์ดˆ๊ธฐ ๊ธฐํš

4๋ฐฉํ–ฅ ๋ทฐ ์žฌ์‚ฌ์šฉ ์Šคํฌ๋กค๋ทฐ RoomPager ๊ฐœ๋ฐœ

Android WebView ์—์„œ Youtube IFrame API๋ฅผ ์ด์šฉํ•œ ์˜์ƒ ์žฌ์ƒ

RoomPager์™€ YoutubePlayer๋ฅผ ์ด์šฉํ•œ ๋ถ€๋“œ๋Ÿฌ์šด ์ˆํผ ๊ฒฝํ—˜ ์ œ๊ณต







์šฐ๊ธฐ (๊น€์ง„์šฑ)

๋กœ๊ทธ์ธ, ํšŒ์›๊ฐ€์ž… ๊ธฐ๋Šฅ

๋ฃธ ์ถ”์ฒœ์„ ์œ„ํ•œ ์‚ฌ์šฉ์ž์˜ ์ดˆ๊ธฐ ์žฅ๋ฅด ์ทจํ–ฅ ์„ ํ˜ธ๋„ ์ž…๋ ฅ

์Šคํฌ๋žฉ ๊ธฐ๋Šฅ ๋ฐ ์Šคํฌ๋žฉ๋œ ๋ชฉ๋ก์— ๋Œ€ํ•œ ์œ ํŠœ๋ธŒ ์žฌ์ƒ๋ชฉ๋ก ์ถ”์ถœ







๋ฒ ๋ฆฌ (์šฐํ˜œ๊ฒฝ)

ViewPager2 ๋ฅผ ์ด์šฉํ•œ ์•ฑ ์‚ฌ์šฉ ๊ฐ€์ด๋“œ ์ œ๊ณต

์ถ”์ฒœ ์Œ์•…์— ๋Œ€ํ•œ ์ •๋ณด ํ‘œ์‹œ

์›ํ•˜๋Š” ์Œ์•…์„ ์Šคํฌ๋žฉํ•˜๊ณ  ๋Œ“๊ธ€ ๋‹ฌ ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ ๊ตฌํ˜„







๋•ก์น  (๋ฐ•์„ฑ์ฒ )


์•ˆ์ „ํ•œ ๋น„๋ฐ€๋ฒˆํ˜ธ ์ €์žฅ์„ ์œ„ํ•ด ์•”ํ˜ธํ™” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ตฌํ˜„

์•ˆ์ „ํ•œ DDL ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•ด DDL ๊ฒ€์ฆ ์ž๋™ํ™” ๊ตฌํ˜„

ํ˜‘์—…์šฉ ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘ ํฌ๋กฌ ํ™•์žฅ ๊ฐœ๋ฐœ

์ง„์ž…์žฅ๋ฒฝ ๊ฐ์†Œ๋ฅผ ์œ„ํ•ด ๊ฒŒ์ŠคํŠธ ๋กœ๊ทธ์ธ ๋ฐ ์†Œ์…œ ๋กœ๊ทธ์ธ ๊ตฌํ˜„






์ฝฉํ•˜๋‚˜ (์ตœํ•œ๋นˆ)

๋กœ๊ทธ์ธ, ํšŒ์›๊ฐ€์ž… ๊ธฐ๋Šฅ

๋Œ“๊ธ€ ๋ฌดํ•œ ์Šคํฌ๋กค ๊ธฐ๋Šฅ

๊ฐ€์ค‘์น˜ ๊ธฐ๋ฐ˜ ์ถ”์ฒœ ์•Œ๊ณ ๋ฆฌ์ฆ˜







ํŒŒ์›Œ (์†ก์žฌ๋ฐฑ)


OIDC๋ฅผ ํ™œ์šฉํ•œ ์†Œ์…œ๋กœ๊ทธ์ธ

๋น„๋ฐ€๋ฒˆํ˜ธ ์•”ํ˜ธํ™”

์œ ํŠœ๋ธŒ ํ”Œ๋ ˆ์ด๋ฆฌ์ŠคํŠธ ์ถ”์ถœ ๊ธฐ๋Šฅ

Flyway ๋„์ž… ๋ฐ CI







๋ธ”๋ž™์บฃ (์†ก์šฐ์„)


์ปค์„œ ๋ฐฉ์‹ ๋ฌดํ•œ ๋Œ“๊ธ€ ์กฐํšŒ API ๊ตฌํ˜„

๊ฐ€์ค‘์น˜ ๊ธฐ๋ฐ˜ ๋ฃธ ์ถ”์ฒœ API ๊ตฌํ˜„

๋ฃธ ์Šคํฌ๋žฉ ๋ชฉ๋ก ์กฐํšŒ API ๊ตฌํ˜„

๋ฃธ ์Šคํฌ๋žฉ ์ถ”๊ฐ€ ์‚ญ์ œ API ๊ตฌํ˜„

Flyway๋ฅผ ํ†ตํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜