![온보딩-2](https://private-user-images.githubusercontent.com/33044667/403649155-9549bded-4270-4c95-8fd0-bd662b24d616.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkwNDA0NjQsIm5iZiI6MTczOTA0MDE2NCwicGF0aCI6Ii8zMzA0NDY2Ny80MDM2NDkxNTUtOTU0OWJkZWQtNDI3MC00Yzk1LThmZDAtYmQ2NjJiMjRkNjE2LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDglMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA4VDE4NDI0NFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWRmMDI0MWVmNzQ0NjEwYmQ2MzU5YzE3ZTI5ZjU3YjFhNjljOGUwNzJhZDI5NDIwNWE3ZmM4MmQ2NzZlYjIyMGImWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.i9NTUqX8iKcp8M_uZpYLw_V_RBTTLHxCC809mb0GUyY)
![온보딩-1](https://private-user-images.githubusercontent.com/33044667/403649149-79f6296b-4d13-476c-b3fb-988583acb051.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkwNDA0NjQsIm5iZiI6MTczOTA0MDE2NCwicGF0aCI6Ii8zMzA0NDY2Ny80MDM2NDkxNDktNzlmNjI5NmItNGQxMy00NzZjLWIzZmItOTg4NTgzYWNiMDUxLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDglMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA4VDE4NDI0NFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTliNjhiZDlhZjkyZmIxMmIyZjJjN2Q4OWY1ZjNmYzA5MWE2Mzc4YWE3Yjk0ZmE3ZmExMzRlZmJiNTk0YWE5OTMmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.scHIYn29SLr2NywAkmAlC0FlTwi9OVGZTasF8kUNYcw)
![온보딩](https://private-user-images.githubusercontent.com/33044667/403649160-99c4b41c-7cfa-422e-b32e-db03ec852c24.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkwNDA0NjQsIm5iZiI6MTczOTA0MDE2NCwicGF0aCI6Ii8zMzA0NDY2Ny80MDM2NDkxNjAtOTljNGI0MWMtN2NmYS00MjJlLWIzMmUtZGIwM2VjODUyYzI0LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDglMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA4VDE4NDI0NFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTY1ZTI2NjM0YWVmN2EyNTc5NGMzYjVjMDBmNzg0NWNmZTg0ZDgwNGYzNjYyMTJiZTIyNjNjMzRjYTgwNzQ0YjcmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.3nhFGFG9hkgYBfE7RA9dBhpd7k_HAKjS0gNajXjvJ-A)
- Architecture
- Multi module (https://developer.android.com/topic/modularization?hl=ko)
- Clean architecture
- MVVM pattern
- Android
- Kotlin
- Jetpack Compose
- Hilt
- Coroutines
- Retrofit2
- Design system
- Version catalogs
- Room
- Design system
- Ktlint with Compose rule
- Testing
- Junit5
- mockk
- Turbine (https://github.com/cashapp/turbine)
- Robolectric (https://developer.android.com/training/testing/local-tests/robolectric?hl=ko)
Multi module based clean architecture
Root project 'LanPetApp'
├── Project ':app'
├── Project ':core'
│ ├── Project ':core:auth'
│ ├── Project ':core:common'
│ ├── Project ':core:designsystem'
│ ├── Project ':core:di'
│ ├── Project ':core:manager'
│ ├── Project ':core:navigation'
│ └── Project ':core:testing'
├── Project ':data'
│ ├── Project ':data:dto'
│ ├── Project ':data:repository'
│ └── Project ':data:service'
├── Project ':domain'
│ ├── Project ':domain:model'
│ ├── Project ':domain:repository'
│ └── Project ':domain:usecase'
└── Project ':feature'
├── Project ':feature:auth'
├── Project ':feature:free'
├── Project ':feature:landing'
├── Project ':feature:myposts'
├── Project ':feature:myprofile'
├── Project ':feature:profile'
├── Project ':feature:settings'
└── Project ':feature:wiki'
Included builds:
└── Project ':build-logic'
1. Install Graphviz
- brew install graphviz
2. Run gradle task
- ./gradlew projectDependencyGraph