Skip to content

Latest commit

ย 

History

History
70 lines (53 loc) ยท 4.08 KB

File metadata and controls

70 lines (53 loc) ยท 4.08 KB

๐ŸŒฟ ๋™๋ฌผ์˜ ์ˆฒ (๋™์–‘๋ฏธ๋ž˜ ์‹๋ฌผ์˜ ์ˆฒ)

๋™๋ฌผ์˜ ์ˆฒ์€ ๋‚˜์˜ ๋ฐ˜๋ ค ์‹๋ฌผ์„ ๋“ฑ๋กํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋ฉฐ, ์‹๋ฌผ ์„ฑ์žฅ์— ์ค‘์š”ํ•œ ๋‚ ์”จ ์ •๋ณด๋ฅผ ์‹ค์‹œ๊ฐ„์œผ๋กœ ํ™•์ธํ•˜๊ณ  ์•Œ๋ฆผ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ์•ˆ๋“œ๋กœ์ด๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ž…๋‹ˆ๋‹ค.

๐Ÿ“ฑ ํ”„๋กœ์ ํŠธ ์†Œ๊ฐœ

์ด ํ”„๋กœ์ ํŠธ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ํ‚ค์šฐ๋Š” ์‹๋ฌผ์˜ ๋ฌผ์ฃผ๊ธฐ ์ฃผ๊ธฐ๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ , ์„ฑ์žฅ ๊ณผ์ •์„ ๊ธฐ๋กํ•˜๋ฉฐ, ์™ธ๋ถ€ ๋‚ ์”จ API๋ฅผ ํ™œ์šฉํ•ด ์‹๋ฌผ ๊ด€๋ฆฌ์— ํ•„์š”ํ•œ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. MySQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์ง์ ‘ ์—ฐ๋™ํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•˜๋ฉฐ, Flask ์„œ๋ฒ„๋ฅผ ํ†ตํ•ด ์ด๋ฏธ์ง€๋ฅผ ์—…๋กœ๋“œํ•˜๋Š” ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ํ†ต์‹  ๋ฐฉ์‹์„ ์ฑ„ํƒํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

โœจ ์ฃผ์š” ๊ธฐ๋Šฅ (Key Features)

1. ๐ŸŒผ ์‹๋ฌผ ๊ด€๋ฆฌ (Plant Management)

  • ์‹๋ฌผ ๋“ฑ๋ก ๋ฐ ์กฐํšŒ: ์‹๋ฌผ์˜ ์ข…๋ฅ˜, ๋ณ„๋ช…, ๋ฌผ์ฃผ๊ธฐ ์ฃผ๊ธฐ, ์ž…์–‘ ๋‚ ์งœ ๋“ฑ์„ ๋“ฑ๋กํ•˜๊ณ  StaggeredGridLayout์„ ํ†ตํ•ด ์นด๋“œ ํ˜•ํƒœ๋กœ ๋ชจ์•„๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋ฌผ์ฃผ๊ธฐ ์•Œ๋ฆผ ์‹œ์Šคํ…œ:
    • ๋“ฑ๋ก๋œ last_watered_date์™€ watering_cycle์„ ๊ณ„์‚ฐํ•˜์—ฌ ๋ฌผ์ฃผ๊ธฐ๊ฐ€ ํ•„์š”ํ•œ ๋‚ ์งœ๋ฅผ ์ž๋™์œผ๋กœ ํŒ๋‹จํ•ฉ๋‹ˆ๋‹ค.
    • ๋ฌผ์ฃผ๊ธฐ๊ฐ€ ํ•„์š”ํ•œ ๋‹น์ผ, ๋ฉ”์ธ ํ™”๋ฉด์˜ ์•Œ๋ฆผ ์•„์ด์ฝ˜์ด ํ™œ์„ฑํ™”๋˜๋ฉฐ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
    • AlarmManager๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋งค์ผ ์„ค์ •๋œ ์‹œ๊ฐ„์— ํ‘ธ์‹œ ์•Œ๋ฆผ์„ ๋ฐœ์†กํ•ฉ๋‹ˆ๋‹ค.
  • ์„ฑ์žฅ ๊ธฐ๋ก: ์‹๋ฌผ๋ณ„๋กœ ์‚ฌ์ง„๊ณผ ๋ฉ”๋ชจ๋ฅผ ๋‚จ๊ฒจ ์„ฑ์žฅ ๊ณผ์ •์„ ํƒ€์ž„๋ผ์ธ์ฒ˜๋Ÿผ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (DB ํ…Œ์ด๋ธ” plant_memos, plant_images ์—ฐ๋™)

2. โ›… ๋‚ ์”จ ์ •๋ณด ๋ฐ ์Šค๋งˆํŠธ ์•Œ๋ฆผ (Smart Weather Alerts)

  • ์‹ค์‹œ๊ฐ„ ๋‚ ์”จ ๋ชจ๋‹ˆํ„ฐ๋ง:
    • OpenWeatherMap API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž๊ฐ€ ์ €์žฅํ•œ ์ง€์—ญ์˜ ์‹ค์‹œ๊ฐ„ ๋‚ ์”จ(์˜จ๋„, ์ƒํƒœ)๋ฅผ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค.
    • ViewPager2๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์—ฌ๋Ÿฌ ์ง€์—ญ์˜ ๋‚ ์”จ ์ •๋ณด๋ฅผ ์Šค์™€์ดํ”„ํ•˜์—ฌ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์‚ฌ์šฉ์ž ๋งž์ถคํ˜• ๊ธฐ์ƒ ์•Œ๋ฆผ:
    • WorkManager๋ฅผ ์ด์šฉํ•ด ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์ฃผ๊ธฐ์ ์œผ๋กœ ๋‚ ์”จ๋ฅผ ์ฒดํฌํ•ฉ๋‹ˆ๋‹ค.
    • ์‚ฌ์šฉ์ž๊ฐ€ ์„ค์ •ํ•œ ์กฐ๊ฑด(๋น„/๋ˆˆ ์˜ˆ๋ณด, ํŠน์ • ์ตœ์ €/์ตœ๊ณ  ์˜จ๋„ ๋„๋‹ฌ) ์ถฉ์กฑ ์‹œ ์•Œ๋ฆผ์„ ๋ฐœ์†กํ•˜์—ฌ ์‹๋ฌผ์„ ์‹ค๋‚ด๋กœ ๋“ค์ด๊ฑฐ๋‚˜ ๋ณดํ˜ธํ•  ์ˆ˜ ์žˆ๋„๋ก ๋•์Šต๋‹ˆ๋‹ค.

3. ๐Ÿ‘ค ์‚ฌ์šฉ์ž ์‹œ์Šคํ…œ (User System)

  • ํšŒ์›๊ฐ€์ž… ๋ฐ ๋กœ๊ทธ์ธ: MySQL ๊ธฐ๋ฐ˜์˜ ํšŒ์› ์ธ์ฆ ์‹œ์Šคํ…œ์„ ๊ฐ–์ถ”๊ณ  ์žˆ์œผ๋ฉฐ, ๋น„๋ฐ€๋ฒˆํ˜ธ๋Š” ํ•ด์‹ฑ ์ฒ˜๋ฆฌ๋˜์–ด ์•ˆ์ „ํ•˜๊ฒŒ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.
  • ๊ณ„์ • ๊ด€๋ฆฌ: ์ด๋ฉ”์ผ ๋ณ€๊ฒฝ(์ธ์ฆ ํฌํ•จ), ๋น„๋ฐ€๋ฒˆํ˜ธ ๋ณ€๊ฒฝ, ๋ฐ์ดํ„ฐ ์ดˆ๊ธฐํ™” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • ์ž๋™ ๋กœ๊ทธ์ธ: SharedPreferences๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์•ฑ ์žฌ์‹คํ–‰ ์‹œ ๋กœ๊ทธ์ธ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.

4. ๐Ÿ“ธ ์ด๋ฏธ์ง€ ์ฒ˜๋ฆฌ

  • ์‚ฌ์ง„ ์—…๋กœ๋“œ: Retrofit2๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Flask ๊ธฐ๋ฐ˜์˜ ์›น ์„œ๋ฒ„๋กœ ์‹๋ฌผ ์ด๋ฏธ์ง€๋ฅผ ์—…๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.
  • ์ด๋ฏธ์ง€ ๋กœ๋”ฉ: Glide ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋ฏธ์ง€๋ฅผ ํšจ์œจ์ ์œผ๋กœ ๋กœ๋”ฉํ•˜๊ณ  ์บ์‹ฑํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ›  ๊ธฐ์ˆ  ์Šคํƒ (Tech Stack)

  • Language: Java 11
  • SDK: Min SDK 28 (Android 9.0) / Target SDK 35
  • UI Components: RecyclerView, ViewPager2, DrawerLayout, CardView, CoordinatorLayout
  • Networking:
    • Retrofit2 & OkHttp3: ๋‚ ์”จ API ์กฐํšŒ ๋ฐ ์ด๋ฏธ์ง€ ์—…๋กœ๋“œ ์„œ๋ฒ„ ํ†ต์‹ 
    • JDBC (MySQL Connector): ์›๊ฒฉ MySQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ง์ ‘ ์—ฐ๊ฒฐ ๋ฐ ์ฟผ๋ฆฌ ์ˆ˜ํ–‰
  • Async & Background:
    • WorkManager: ์ฃผ๊ธฐ์ ์ธ ๋‚ ์”จ ์ฒดํฌ ์ž‘์—… ์˜ˆ์•ฝ
    • Thread & Handler: DB ์ž‘์—… ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ๋ฐ UI ์—…๋ฐ์ดํŠธ
  • Image Loader: Glide 4.12.0

โš™๏ธ ํ™˜๊ฒฝ ์„ค์ • (Configuration)

์ด ํ”„๋กœ์ ํŠธ๋Š” ๋ณด์•ˆ์„ ์œ„ํ•ด API ํ‚ค์™€ ์„œ๋ฒ„ ์ •๋ณด๋ฅผ local.properties ํŒŒ์ผ์—์„œ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์•ฑ์„ ๋นŒ๋“œํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ์˜ local.properties ํŒŒ์ผ์— ๋‹ค์Œ ํ•ญ๋ชฉ๋“ค์„ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

# local.properties

# Android SDK ๊ฒฝ๋กœ
sdk.dir=...

# Database Connection (MySQL)
db.host=YOUR_DB_HOST
db.name=YOUR_DB_NAME
db.user=YOUR_DB_USER
db.password=YOUR_DB_PASSWORD

# Image Server (Flask)
server.ip=YOUR_SERVER_IP

# External APIs
geo.apikey=YOUR_GEOCODING_API_KEY
weather.apikey=YOUR_OPENWEATHERMAP_API_KEY