![온보딩-2](https://private-user-images.githubusercontent.com/33044667/403649155-9549bded-4270-4c95-8fd0-bd662b24d616.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkwNTIzODcsIm5iZiI6MTczOTA1MjA4NywicGF0aCI6Ii8zMzA0NDY2Ny80MDM2NDkxNTUtOTU0OWJkZWQtNDI3MC00Yzk1LThmZDAtYmQ2NjJiMjRkNjE2LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDglMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA4VDIyMDEyN1omWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTQxMzcwMzY2NjkzNTA5OTU2NzdhNTQwMmMwZGQzZGMxYTQyZWI0ZjBkNTM3OGMxYTg5MmI2OTA3NmRhMjYyMTUmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.HeVbqhDZOARMqpyuJSW8IEKlVD6vhx_R8MvfWA43vpw)
![온보딩-1](https://private-user-images.githubusercontent.com/33044667/403649149-79f6296b-4d13-476c-b3fb-988583acb051.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkwNTIzODcsIm5iZiI6MTczOTA1MjA4NywicGF0aCI6Ii8zMzA0NDY2Ny80MDM2NDkxNDktNzlmNjI5NmItNGQxMy00NzZjLWIzZmItOTg4NTgzYWNiMDUxLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDglMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA4VDIyMDEyN1omWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWM1N2ZmYjA4MjdkNjE1M2E3NjhjMjk0ZTIxYzYzZmRiOTMxZGU0OWFlZmIzNDY5ZmUzZjAxMzAxMzZlZGJjNDgmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.V8Szxaxkuh5GhLuueFJ1T9PHFa42_7RO6ppRVDfTIDY)
![온보딩](https://private-user-images.githubusercontent.com/33044667/403649160-99c4b41c-7cfa-422e-b32e-db03ec852c24.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkwNTIzODcsIm5iZiI6MTczOTA1MjA4NywicGF0aCI6Ii8zMzA0NDY2Ny80MDM2NDkxNjAtOTljNGI0MWMtN2NmYS00MjJlLWIzMmUtZGIwM2VjODUyYzI0LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDglMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA4VDIyMDEyN1omWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWUyNDVhZGJkNmE1NmM3MWNjMjI3YjZiZjY4ODAyMDM2OWRlNzRlYzEwZGIyNTFkMTg3YzhiZTlmMmI5ZTViYjQmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.r_eurduELG2K3aJSUVGWaE9tKGZbcS95QX-kzab7qec)
- 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