Instagram ์ฅ์ ์ ๋ณด โ ์ง๋ ์ฝ์ค ์๋ํ
์ธ์คํ๊ทธ๋จ์ โ๋ง์ง/์นดํ ๋ชจ์โ ๊ฒ์๋ฌผ ๋งํฌ๋ฅผ ์ ๋ ฅํ๋ฉด, OCR + ๊ฒ์ API๋ฅผ ํตํด ์ฅ์ ์ ๋ณด๋ฅผ ์๋ ์ถ์ถํ๊ณ ์ง๋๋ก ์๊ฐํํ์ฌ ๋๋ง์ ๋ฐ์ดํธ ์ฝ์ค๋ฅผ ์์ฝ๊ฒ ๋ง๋๋ Android ์ฑ์ ๋๋ค.
SNS์ ๊ฐ์ฑ์ ์ธ ์ฅ์ ํ์์ ์ค์ ์ง๋ ์ฝ์ค๋ก ์ฐ๊ฒฐํ๋ ์๋น์ค์ ๋๋ค.
ํต์ฌ ๊ธฐ๋ฅ
-
์ธ์คํ ๋งํฌ ๋ถ์
- ์ธ์คํ ๊ฒ์๋ฌผ(ํผ๋/์บ๋ฌ์ ) ๋งํฌ ์ ๋ ฅ โ ์ด๋ฏธ์ง/ํ ์คํธ ์๋ ์์ง (Selenium)
- OCR๋ก ์ฅ์๋ช /ํค์๋ ์ถ์ถ
-
์ง๋ ๊ธฐ๋ฐ ํ๋ณด ์ฅ์ ๋์
- ์ฌ๋ฌ ๊ฒ์๋ฌผ์์ ์ถ์ถํ ์ฅ์๋ค์ ์ง๋์์ ํ๋์ ๋น๊ต
- ๋ง์ปค ๋์ ํ์
-
์ฝ์ค ๋น๋
- ํ๋ณด ์ค ์ํ๋ ์ฅ์๋ง ์ ํ
- Drag & Drop์ผ๋ก ์์ ํธ์ง
- Firestore์ ์ ์ฅ
-
์ฝ์ค ์์ธ
- ์ค์ ์ต์ ๊ฒฝ๋ก(Polyline) ์๊ฐํ
- ์ฝ์ ์ก๊ธฐ + ์นด์นด์คํก ๊ณต์
- Kotlin
- MVVM + Jetpack ViewModel + StateFlow
- Retrofit2 (์๋ฒ & Kakao API)
- Coroutines
- Jetpack Compose / XML
- Firebase Authentication
- Firestore (Cloud Firestore)
- Kakao Map SDK
- Kakao Local / Mobility API
- Python
- Flask
- Selenium (์ธ์คํ ์ด๋ฏธ์ง & ํ ์คํธ ํฌ๋กค๋ง)
- Requests / BeautifulSoup (๋ณด์กฐ ์ฒ๋ฆฌ๋ฅผ ์ํ)
- Firebase ML Kit (OCR)
- Firebase Authentication
- Firestore
- Kakao API (๊ฒ์ / ๊ฒฝ๋กํ์ / ์ง๋)
Inscort/
โ
โโโ android-app/ # Android Studio ํ๋ก์ ํธ
โ โโโ app/
โ โโโ gradle/
โ โโโ build.gradle.kts
โ โโโ settings.gradle.kts
โ โโโ ...
โ
โโโ backend/ # Flask + Selenium ์๋ฒ
โ โโโ app.py
โ โโโ requirements.txt
โ โโโ ...
โ
โโโ docs/ # IA, ํ๋ก์ฐ์ฐจํธ, Firestore ์ค๊ณ, API ๋ฌธ์
โ
โโโ .github/ # PR/์ด์ ํ
ํ๋ฆฟ
โ โโโ ISSUE_TEMPLATE/
โ โโโ PULL_REQUEST_TEMPLATE.md
โ
โโโ README.md
Inscort is an Android application built with Jetpack Compose that allows users to discover places, build custom courses, and view them on an interactive map.
This project follows a practical MVVM + Repository architecture, commonly used in Android applications.
-
UI Layer
- Jetpack Compose screens
- Handles rendering and user interaction only
-
ViewModel Layer
- Manages UI state using
StateFlow - Calls repositories and exposes data to UI
- Manages UI state using
-
Repository Layer
- Acts as a data bridge between local database and network APIs
- No domain separation or use-case layer (non-DDD)
-
Data Layer
- Room (local database)
- Retrofit (network communication)
- Place discovery using Kakao Local API
- Course creation with manual ordering of places
- Course data stored locally using Room
- Course detail screen with:
- Kakao Map markers
- Route polyline drawing
- Bottom sheet UI (Material 3)
- OCR support using:
- ML Kit (on-device)
- External Python OCR server (REST API)
- Kakao Map SDK integrated with Jetpack Compose
- Custom
KakaoMapControllerused to:- Add markers
- Draw routes
- Control camera movement
- The app is built as a standard Android APK
- External services (Kakao API, Python OCR server) are accessed via network
- Python code is not embedded in the APK and runs separately
This project focuses on:
- Clear separation of UI, state, and data handling
- Real-world Android architecture without DDD complexity
- Practical integration of maps, databases, and network APIs
| ์ด๋ฆ | ์ญํ | ๋ด๋น ๋ฒ์ |
|---|---|---|
| ์กฐ์ค๊ฒฝ | Backend | Python, Flask, Selenium (์ธ์คํ ํฌ๋กค๋ง API) |
| ๋จ์งํ | App โ OCR/๊ฒ์ | Firebase ML Kit, Kakao Local API, ๋ฐ์ดํฐ ํ์ฑ & ์ขํ ๋ณํ |
| ๊ฐ์ฑ๊ฒฝ | App โ map&navigation | Kakao Map SDK, Mobility API, Polyline ์๊ฐํ, ์ง๋ UI |
| ์ด์๋ | App โ Auth/DB | Firebase Auth, Firestore CRUD, MY ์ฝ์ค ๊ด๋ฆฌ ํ๋ฉด |
cd python-server
python -m venv venv
source venv/bin/activate
pip install -r requirements.txt
python app.py-
mainโ ํญ์ ๋ฐฐํฌ ๊ฐ๋ฅํ ์์ ๋ฒ์ -
devโ ํตํฉ ๊ฐ๋ฐ ๋ธ๋์น -
feature/*โ ๊ธฐ๋ฅ ๋จ์ ๋ธ๋์น- ex)
feature/firebase-auth,feature/insta-crawl,feature/map-polyline
- ex)
- Issue ์์ฑ โ
feature/๊ธฐ๋ฅ๋ช๋ธ๋์น ์์ฑ - ๊ธฐ๋ฅ ๊ฐ๋ฐ
- PR ์์ฑ (dev๋ก)
- ํ ๋ฆฌ๋ทฐ
- Merge โ dev โ main (๊ธฐ๋ฅ ๋๊ฒฐ ์)
feat: ์๋ก์ด ๊ธฐ๋ฅ ์ถ๊ฐ
fix: ๋ฒ๊ทธ ์์
chore: ํ๊ฒฝ์ค์ /๋น๋/์์กด์ฑ
refactor: ์ฝ๋ ๊ตฌ์กฐ ๊ฐ์
docs: ๋ฌธ์ ์์
style: ํฌ๋งท/์ธ๋ฏธ์ฝ๋ก ๋ฑ
- ์ธ์คํ ์ฅ์ ํ์ โ ์ง๋ ์ฝ์ค ์์ฑ๊น์ง์ ๋ชจ๋ ๊ท์ฐฎ์ ์์ ์ ์๋ํํ๋ ์ฌ์ฉ์ ์ค์ฌ ์๋น์ค
- ๊ฐ์ฑ ์ฝํ ์ธ (SNS) + ์ค์ ๋์ (์ง๋/๊ฒฝ๋ก) ๊ฐ๋ ์ ์ฐ๊ฒฐํ๋ ์๋ก์ด ๋ฐ์ดํธ ํ๋๋ ๊ฒฝํ ์ ๊ณต
I implemented the map-related features using the Kakao Map SDK and integrated them with Jetpack Compose.
- Embedded Kakao Map into Compose using
AndroidView - Managed map lifecycle and state through a custom controller (
KakaoMapController)
- Displayed course places as map markers
- Dynamically added and cleared markers based on course data
- Supported ordered markers to reflect the sequence of places in a course
- Requested route data from Kakao Navigation API
- Parsed route polyline coordinates
- Drew routes directly on the map using polyline overlays
- Automatically moved the camera to fit course locations
- Updated camera position when course data changed
- Connected map updates with
StateFlowandLaunchedEffect - Ensured map rendering reacts to data changes without recreating the map view
This implementation focuses on real-time data-driven map updates while keeping the UI responsive and lifecycle-safe within a Compose-based architecture.