#1 Module?
#1-1 What
ํ๋์ build.gradle์ ์ข ์๋ ์ฝ๋์ ๋ฒ์
= ๋น๋์ ์ต์ ๋จ์
= ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ต์ ๋จ์
์๋๋ก์ด๋ ์ฑ์ Gradle๋ก ๋น๋๋๊ณ , ๊ทธ ๋น๋์ ๋ช ์ธ๋ build.gradle์ ์ ํ๋ค. ๋ชจ๋์ด build.gradle ํ์ผ์ ์ข ์๋๋ค๋ ๋ง์ ์ฆ ๋ชจ๋์ "๋น๋์ ์ต์ ๋จ์"๋ผ๊ณ ๋ป์ด ๋๋ค.
#1-2 Why
์ ์ด๋ฐ ๋จ์๋ฅผ ์ธ๊น? ๋ค์ ๋งํด, ์ "๋น๋์ ์ต์ ๋จ์"๋ก์ ๋ชจ๋์ ์ธ๊น? ์์ฒด์ ์ธ ๋น๋ ๊ตฌ์ฑ์ ๊ฐ์ง๊ณ ์๋ค(= build.gradle ํ์ผ์ ๊ฐ์ง๊ณ ์๋ค)๋ ๋ง์, ์์ฒด์ ์ผ๋ก ์ปดํ์ผํ ๊ฒฐ๊ณผ๋ฌผ์ ์์ฐํ ์ ์๋ค๋ ์๊ธฐ๋ค. ์ฆ, ์ธ๋ถ(ํ์ธ)์์ ์คํํ ์ ์๋๋ก ๋ฐฐํฌ(= ๋ผ์ด๋ธ๋ฌ๋ฆฌํ)๊ฐ ๊ฐ๋ฅํ ์ต์ ๋จ์๊ฐ ๋๋ค.
๋ผ์ด๋ธ๋ฌ๋ฆฌํ๊ฐ ๊ฐ๋ฅํ๋ค๋ ์ด์ผ๊ธฐ๋ ๊ธฐ๋ฅ๋ค์ ๋ถ๋ฆฌํ์ฌ ๊ฐ๊ฐ ๋ ๋ฆฝ์ ์ผ๋ก ๊ฐ๋ฐํ ์ ์๋ค๋ ์๊ธฐ๋ค. "์ ๊ฐ์ฒด์งํฅ์ ์ฌ์ฉํ๋๊ฐ? (์ฅ์ ์ด ๋ฌด์์ธ๊ฐ?)"๋ผ๋ ์ง๋ฌธ์ ๋ํ ๋๋ต๊ณผ ๊ฐ์ ๋งฅ๋ฝ์ด๋ค.
๊ทธ๋ ๋ค๋ฉด '๊ฐ์ฒด์งํฅ์ ๋ฌธ์ ์ (๋จ์ )'๋ ๋น์ทํ๊ฒ ๊ณต์ ํ ๊ฒ์ด๋ค. ๋ณต์์ ๋ชจ๋๋ก ์ด๋ฃจ์ด์ง ํ๋ก์ ํธ๋ ๊ทธ ๋ชจ๋๋ค์ build.gradle์ด Java ๋ฒ์ , Kotlin ์ต์ , dependency ๋ฑ์ ์ฐจ์ด๊ฐ ์์ ์ ์๋ค. ์ด ํํธํ๋ ์ ์ฌ์ ์ธ ์๋ฌ๋ฅผ ์ ๋ฐํ ๊ฒ์ด๊ณ , ์ด๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ๊ท์ฐฎ์ ์์ ์ ํด์ผ๋ ์๋ ์๋ค.
#1-3 package์์ ๋น๊ต
์๋๋ก์ด๋ ์ฑ์ ์์ค์ฝ๋๋ package๋ผ๋ ์ด๋ฆ์ ํด๋๋ก ์นดํ ๊ณ ๋ฆฌํ๋๋ค. package๋ ํ์ผ ํธ๋ฆฌ ์์์ ๋ ผ๋ฆฌ์ ์ผ๋ก ๊ฐ์ฒด๋ฅผ ๋ถ๋ฆฌํ๋ ๊ฒ์ด๋ค. ๊ทธ๋ฆฌ๊ณ package๋ ๋ ผ๋ฆฌ์ ๋ถ๋ฆฌ๋ง์ ์ํํ ๋ฟ, ๋น๋์ ๋ฒ์์๋ ๊ด๋ จ์ด ์๋ค. ๋ฐ๋ผ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌํ๊ฐ ๊ฐ๋ฅํ module๊ณผ ๋ฌ๋ฆฌ package๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌํ๊ฐ ๋ถ๊ฐ๋ฅํ๋ค (์ข ๋ ์ ํํ๋, ์ ์ด์ ๊ฐ๋ฅใ๋ถ๊ฐ๋ฅ์ ๋ ผํ ์ ์๋ค).
#2 Module์ ์ข ๋ฅ
#2-1 AAR ํ์ผ๊ณผ APK ํ์ผ
์๋๋ก์ด๋ ํ๋ก์ ํธ๋ฅผ ๋น๋ํ๋ค๊ณ ๋ฐ๋์ (์ค๋งํธํฐ ์์์) ์คํ์ํฌ ์ ์๋ ๊ฑด ์๋๋ค. ์๋ํ๋ฉด ๋น๋์ ๊ฒฐ๊ณผ๋ฌผ์ AAR(Android ARchive) ํ์ผ ๋๋ APK(Android PacKage) ํ์ผ์ธ๋ฐ, ์ด ์ค APK ํ์ผ๋ง์ด ์คํ ๊ฐ๋ฅํ ํ์ผ์ด๊ธฐ ๋๋ฌธ์ด๋ค.AAR ํ์ผ์ ์ด๋ฆ(Android ARchive)์์ ์ ์ ์๋ฏ, ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ์ฌ์ฉ๋๊ธฐ ์ํ ํ์ผ์ด๋ค. AAR ํ์ผ์ APK ํ์ผ์ ๋๋ ๋ ๋ค๋ฅธ AAR ํ์ผ์ ์ข ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ์ฌ์ฉ๋๋ค. APK ํ์ผ์ ํ์ํ ๊ฒฝ์ฐ AAR ํ์ผ์ ์ทจํ์ง๋ง, ๊ธฐ๋ณธ์ ์ผ๋ก ๋ ๋ฆฝ ์คํ์ด ๊ฐ๋ฅํ ๋น๋ ๊ฒฐ๊ณผ๋ฌผ์ด๋ค.
#2-2 App Module
๋น๋ํ์๋ APK ํ์ผ์ด ๋์ค๋ ๋ชจ๋์ด๋ค. ์๋๋ก์ด๋ ์คํ๋์ค์์ ๋น ํ๋ก์ ํธ๋ฅผ ์์ฑํ์ ๋ "app"์ด๋ผ๋ ์ด๋ฆ์ผ๋ก ๊ธฐ๋ณธ ์์ฑ๋๋ ๋ชจ๋์ด ๋ฐ๋ก App Module์ด๋ค. build.gradle์ ๋ณด๋ฉด applicationId, target sdk, version code, version name, ... ๋ฑ ๋ ๋ฆฝ ์คํ์ ์ํด ํ์ํ ๋ค์ํ ์ ๋ณด๋ฅผ ํ์ธํ ์ ์๋ค
#2-3 Library Module
๋น๋ํ์๋ AAR ํ์ผ์ด ๋์ค๋ ๋ชจ๋์ด๋ค. build.gradle์ ๋ณด๋ฉด App Module๊ณผ๋ ๋ฌ๋ฆฌ ๋๋ฝ๋ ์ ๋ณด๊ฐ ๋ง๋ค. ๊ฐ๋ น, applicationId๊ฐ ์๋ค. applicationId๋ Google Play Store์์ ์ฑ์ ๊ตฌ๋ถํ๋ ์ฉ๋, ์์คํ ์์ ์ฑ์ ์๋ณํ๋ ์ฉ๋๋ก ์ฐ์ด๋๋ฐ Library Module์ ์ ์ด์ ๋ ๋ฆฝ ์คํ์ด ์๋๋ฏ๋ก ๊ตณ์ด applicationId๊ณผ ๊ฐ์ ์๋ณ์๊ฐ ํ์์๊ธฐ ๋๋ฌธ์ด๋ค.
#2-4 ๋น๋ ์์
App module๊ณผ Library module์ด ์์ธ ํ๋ก์ ํธ์์์ ๋น๋๋ ์๋์ ๊ฐ์ ์์๋ฅผ ๋ฐ๋ฅธ๋ค.
1. ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ชจ๋ 1: ์์ค ์ฝ๋ + ๋ฆฌ์์ค (+ ํ์ํ AAR) → AAR ํ์ผ
2. ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ชจ๋ 2: ์์ค ์ฝ๋ + ๋ฆฌ์์ค (+ ํ์ํ AAR) → AAR ํ์ผ
3. ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ชจ๋ 3: ์์ค ์ฝ๋ + ๋ฆฌ์์ค (+ ํ์ํ AAR) → AAR ํ์ผ
...
n. ์ฑ ๋ชจ๋: ์์ค ์ฝ๋ + ๋ฆฌ์์ค + (+ ํ์ํ AAR) → APK ํ์ผ
#3 ๋ชจ๋ ๊ตฌํํด๋ณด๊ธฐ
์์ฑ๋ ํ๋ก์ ํธ๋ #4์์ ์ ์ฒด ์์ค์ฝ๋๋ฅผ ๋ค์ด๋ก๋ํ ์ ์๋ค.
#3-1 ๋ ํผ๋ฐ์ค ์ฝ๋
[Android] Retrofit - MVVM ๊ตฌ์กฐ
#1 ์ด์ ๊ธ [Android] Retrofit - ๊ธฐ์ด#1 ์ด์ ๊ธ [Android] Retrofit - ๋ฐฐ๊ฒฝ๊ณผ ๊ตฌ์กฐ#1 Restrofit์ ๋ฐฐ๊ฒฝ#1-1 REST API REST API (REpresentational State Transfer Application Programming Interface)#1 ๋ฌด์(What)์ ๋ํ API์ธ๊ฐ?#1-1 ๊ฐ์RE
kenel.tistory.com
์์ ์ ๋ง๋ค์ด๋ ์ฝ๋๋ฅผ ๋ฆฌํฉํ ๋งํด์ 2๊ฐ์ ๋ชจ๋๋ก ๋๋๊ฒ ๋ค. ๋จผ์ ์ ๊ฒ์๊ธ์ ์๋ '์์ฑ๋ ์ฑ'์ ๊ทธ๋๋ก ๊ฐ์ ธ์๋ค. ๊ธฐ๋ณธ ๋ชจ๋์ธ "app"์ ๋ค์ด์๋ retrofit ๊ด๋ จํ ์ฝ๋๋ค์, "network"๋ผ๋ ์ ๋ชจ๋๋ก ์ฎ๊ธธ ์์ ์ด๋ค (๋ฉํฐ ๋ชจ๋ํ).
#3-2 ๋ชจ๋ ๋ง๋ค๊ธฐ

[Project ํญ์์ ๋น ๊ณต๊ฐ ์ฐํด๋ฆญ] -> [New] -> [Module]
๋๋ [File] -> [New] -> [New Module...]

[Create New Module] -> [Android Library] -> [๋ชจ๋ ์ด๋ฆ ์ค์ (์ฌ๊ธฐ์๋ "network")] -> [๋๋จธ์ง๋ ๊ทธ๋๋ก ๋๊ณ Finish]
์ด์จ๋ ์ด๋ ๊ฒ ์ ๋ชจ๋์ ์ถ๊ฐํ๋ ๊ฑด ๊ธฐ๋ณธ ๋ชจ๋์ธ "app" ๋ชจ๋์ ๋ณต์ ํ๋ ๊ฒ๊ณผ ๊ฐ์ ๊ณผ์ ์ด๋ค. ๊ฐ ๋ง๋ค์ด์ง network ๋ชจ๋์ ๋ณด๋ฉด res ํด๋๊ฐ ์๋ค. ๋ฌผ๋ก ๋คํธ์ํฌ ๊ด๋ จ ์ฝ๋๋ฅผ ๋ฃ์ ๊ฒ์ด๋ฏ๋ก res ํด๋๊ฐ ์์ ์ด์ ๋ ์๊ฒ ์ง๋ง, ํ์ํ๋ค๋ฉด app ๋ชจ๋์ด res ํด๋๋ฅผ ์ง๋๊ณ ์๋ ๊ฒ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ๊ทธ๋ฅ ์์ฑํด์ฃผ๋ฉด ๊ทธ๋ง์ผ ๊ฒ์ด๋ค.
#3-3 ์ฝ๋ ๋๋๊ธฐ

"app" ๋ชจ๋์ ์๋ "retrofit" ํจํค์ง์ ๋ชจ๋ ํ์ผ์ "network" ๋ชจ๋๋ก ์ฎ๊ฒผ๋ค. ์ด์ด์, "retrofit" ํจํค์ง๋ ์ญ์ ํ๋ค.
implementation("com.squareup.retrofit2:retrofit:2.9.0")
implementation("com.squareup.retrofit2:converter-gson:2.9.0")
์ฎ๊ธด ์ฝ๋๋ค์ retrofit ๋ฐ gson ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ข ์๋์ด ์๋ค. ๋ฐ๋ผ์ "network" ๋ชจ๋ ์ build.gradle ํ์ผ์ dependencies { ... }์ ์์ ๊ฐ์ด retrofit ๋ฐ gson ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ถ๊ฐํ๋ค.
#3-4 ๊ฐ์์ฑ ํ๋ณด
#3-3์์ ์ฝ๋๋ฅผ ์ฎ๊ฒผ๋ค๊ณ ๋๋ ๊ฑธ๊น? ์๋๋ค. ์๋ํ๋ฉด, "app" ๋ชจ๋์ "network" ๋ชจ๋์ ์กด์ฌ๋ฅผ ๋ชจ๋ฅด๊ธฐ ๋๋ฌธ์ด๋ค. ์ ์ด์ ์๋ก ๋ ๋ฆฝ์ ์ผ๋ก ๋น๋๋๋, ๋ชจ๋์ ๋จ์๊ฐ ๋ค๋ฅด๊ธฐ์ ์๋ก ์ ์ด์ ๋ ์๋ค (import๋ฌธ ํ ์ค๋ก ๋ฐ๋ก ์ฝ๋๋ฅผ ๊ฐ์ ธ์ฌ ์ ์์๋ package ๋จ์์ ๋๋น๋๋ค).
"app" ๋ชจ๋์ด "network" ๋ชจ๋์ ์ฝ๋๋ฅผ ์ฐธ์กฐํ ์ ์๊ฒ ํ๋ ค๋ฉด (= ๊ฐ์์ฑ์ ํ๋ณดํ๋ ค๋ฉด), "app" ๋ชจ๋ ์ build.gradle์ dependencies { ... }์ "network" ๋ชจ๋์ ์ ๋ณด๋ฅผ ์ ์ด์ฃผ์ด์ผ ํ๋ค.
implementation(project(":network"))
์์ ๊ฐ์ ์ฝ๋๋ฅผ ์ ์ผ๋ฉด, "app" ๋ชจ๋์ด "network" ๋ชจ๋์ ์ฐธ์กฐํ ์ ์๊ฒ ๋๋ค.
์ฃผ์ํ ์ ์, ๋น์ฐํ๊ฒ๋ private ์ ๊ทผ์ ์ด์๊ฐ ๋ถ์ ์ฝ๋๋ ๋ฌด์จ ์ง์ ํด๋ ์ฐธ์กฐํ ์ ์๋ค๋ ๊ฒ์ด๋ค. ํ์ผ ๋จ์์ ์ฐธ์กฐ ๋ฒ์๋ฅผ ์ง๋๋ private ๊ทธ๋ฆฌ๊ณ ๋ชจ๋ ๋จ์์ ์ฐธ์กฐ ๋ฒ์๋ฅผ ์ง๋๋ internal ๋ชจ๋ ์ฐธ์กฐํ ์ ์๋ค. Library Module์ ๋ง๋ค ๋๋, ๋ ๋ค๋ฅธ Library Module ๋๋ App Module์ ๊ณต๊ฐ์ ์ผ๋ก ์ ๊ณตํ API๋ง์ public ์ ๊ทผ์ ์ด์๋ก ๋ฌ์ผํ ๊ฒ์ด๋ค.
#4 ์์ฑ๋ ์ฑ
android-practice/architecture/ModuleSample at master · Kanmanemone/android-practice
Contribute to Kanmanemone/android-practice development by creating an account on GitHub.
github.com
#5 ์ฐธ๊ณ
'๊นจ์ ๊ฐ๋ ๐ > Android' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [Android] Pointer input - Drag (0) | 2025.05.13 |
|---|---|
| [Android] App layout - Custom layouts (0) | 2025.02.27 |
| [Android] UI architecture - Phase์ State (1) | 2025.02.27 |
| [Android] UI architecture - Phases (0) | 2025.02.27 |
| [Android] App layout - ๊ธฐ์ด (0) | 2025.02.27 |