Skip to content

BcKmini/Collection-bird

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

44 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

🐦 야생동물 데이터 μˆ˜μ§‘ μ„œλΉ„μŠ€ (Wildlife Observation)

Backend-FastAPI DB-MySQL κΈ°κ°„

κ΄€μ°°μžκ°€ 야생동물(μ‚¬μ§„Β·μ˜μƒΒ·μ†Œλ¦¬)을 κΈ°λ‘ν•˜λ©΄
λ°±μ—”λ“œκ°€ μ’Œν‘œΒ·μ£Όμ†Œ(카카였 지도)와 κ΄€μ°° μ‹œκ°μ„ μ΄μš©ν•΄ 날씨(OpenWeatherMap)·고도 정보λ₯Ό κ²°ν•©ν•˜μ—¬ μ €μž₯/μ‘°νšŒν•˜λŠ” μ„œλΉ„μŠ€μž…λ‹ˆλ‹€.

λ‹΄λ‹Ή μ—­ν• (본인): λ°±μ—”λ“œ 개발 Β· DB 섀계/ꡬ좕 Β· ν”„λ‘ νŠΈμ™€ 연동(React 데이터 곡급) Β· μ™ΈλΆ€ API 톡합


λͺ©μ°¨


기술 μŠ€νƒ

FastAPI Flask React Vite

MySQL Kakao Map JS SDK OpenWeatherMap

python-dotenv


ν™”λ©΄

메인(κ΄€μ°° μΉ΄λ“œ 리슀트) μ—…λ‘œλ“œ 폼
κ΄€μ°° μœ„μΉ˜ μž…λ ₯(카카였 지도) 상세 νŽ˜μ΄μ§€


핡심 κΈ°λŠ₯

  • κ΄€μ°° μΉ΄λ“œ 리슀트: μ’… 이름, κ΄€μ°° μœ„μΉ˜(μ£Όμ†Œ), κ΄€μ°° μΌμ‹œλ₯Ό μΉ΄λ“œλ‘œ ν‘œμ‹œ. μΉ΄ν…Œκ³ λ¦¬ νƒ­/검색 제곡.
  • μ—…λ‘œλ“œ 폼: 생물쒅 λΆ„λ₯˜Β·μ’… μ΄λ¦„Β·μ„œμ‹μ§€ μœ ν˜• 선택, 사진/λ™μ˜μƒ/μ†Œλ¦¬ μ—…λ‘œλ“œ(λ“œλž˜κ·Έμ•€λ“œλ‘­/파일 선택).
  • 지도 연동: 카카였 μ§€λ„μ—μ„œ 마컀λ₯Ό ν΄λ¦­ν•˜λ©΄ μ£Όμ†Œκ°€ μžλ™ 계산 λ˜μ–΄ μž…λ ₯λž€μ— 반영.
  • 상세 νŽ˜μ΄μ§€: λ―Έλ””μ–΄, μ£Όμ†Œ, 고도/날씨(κΈ°μ˜¨Β·κ°•μˆ˜Β·ν’μ†), κ΄€μ°° μ‹œκ°, 지도, λŒ“κΈ€(이름+λ‚΄μš©) ν‘œμ‹œ.
  • λ‹€κ΅­μ–΄ ν† κΈ€: ν•œκ΅­μ–΄/μ˜μ–΄ UI(ν”„λ‘ νŠΈ 제곡) Β· CORS/λ³΄μ•ˆ μ„€μ •μœΌλ‘œ μ„œλΉ„μŠ€ν™” μ€€λΉ„.

μ•„ν‚€ν…μ²˜

flowchart LR
  A[React Client] -->|REST/JSON Β· multipart| B[FastAPI]
  B -->|SQLAlchemy| C[(MySQL)]
  B -->|OpenWeatherMap API| D[Weather Service]
  B -->|Kakao Map JS SDK| E[Reverse Geocoding]
  subgraph Storage
    C
  end
Loading

데이터 λͺ¨λΈ(ERD)

erDiagram
    observations ||--o{ comments : has

    observations {
        int id
        string species_category
        string species_name
        string habitat_type
        datetime observation_date
        string location
        string memo
        string image_url
        string video_url
        string audio_url
        datetime created_at
        float latitude
        float longitude
    }

    comments {
        int id
        int observation_id
        string username
        string content
        datetime created_at
    }


Loading

둜컬 μ‹€ν–‰

1) μš”κ΅¬μ‚¬ν•­

  • Python 3.10+
  • MySQL 8.x
  • Node.js 18+ (ν”„λ‘ νŠΈ 확인 μ‹œ)

2) ν™˜κ²½ λ³€μˆ˜

λ£¨νŠΈμ— .env 생성:

DB_URL=mysql+pymysql://USER:PASSWORD@localhost:3306/wildlife?charset=utf8mb4
OPENWEATHER_API_KEY=YOUR_OPENWEATHERMAP_KEY
KAKAO_JS_KEY=YOUR_KAKAO_MAP_JS_KEY
CORS_ORIGINS=http://localhost:5173,http://localhost:3000

3) λ°±μ—”λ“œ μ‹€ν–‰

python -m venv .venv
source .venv/bin/activate  # Windows: .venv\Scripts\activate
pip install -r requirements.txt  # λ˜λŠ”: pip install fastapi uvicorn sqlalchemy PyMySQL python-dotenv
uvicorn main:app --reload  # μ‹€μ œ μ—”νŠΈλ¦¬ν¬μΈνŠΈ λͺ¨λ“ˆλͺ…:app

4) ν”„λ‘ νŠΈ(μ˜ˆμ‹œ: Vite)

npm i
npm run dev

폴더 ꡬ쑰

.
β”œβ”€β”€ client/                         # ν”„λ‘ νŠΈμ—”λ“œ(React/Vite λ“±)
β”‚
β”œβ”€β”€ server/                         # λ°±μ—”λ“œ(FastAPI) 루트
β”‚   β”œβ”€β”€ main.py                     # FastAPI μ—”νŠΈλ¦¬ν¬μΈνŠΈ (app, λΌμš°ν„° include, CORS λ“±)
β”‚   β”œβ”€β”€ db.py                       # DB μ—°κ²°/μ„Έμ…˜, Base μ„ μ–Έ, ν™˜κ²½λ³€μˆ˜ λ‘œλ”©
β”‚   β”‚
β”‚   β”œβ”€β”€ models/                     # SQLAlchemy λͺ¨λΈ λ ˆμ΄μ–΄(ν…Œμ΄λΈ”)
β”‚   β”‚   β”œβ”€β”€ comment.py              # λŒ“κΈ€(Comment) λͺ¨λΈ
β”‚   β”‚   └── observation.py          # κ΄€μ°°(Observation) λͺ¨λΈ
β”‚   β”‚
β”‚   β”œβ”€β”€ routers/                    # λΌμš°νŒ…(μ—”λ“œν¬μΈνŠΈ) λͺ¨λ“ˆ
β”‚   β”‚   β”œβ”€β”€ comment_router.py       # /api/observations/{id}/comments λ“± λŒ“κΈ€ API
β”‚   β”‚   └── observation_router.py   # /api/observations CRUD, 파일 μ—…λ‘œλ“œ, 쑰회 λ“±
β”‚   β”‚
β”‚   β”œβ”€β”€ schemas/                    # Pydantic μŠ€ν‚€λ§ˆ(μž…μΆœλ ₯ 검증)
β”‚   β”‚   β”œβ”€β”€ comment_schema.py       # λŒ“κΈ€ μš”μ²­/응닡 μŠ€ν‚€λ§ˆ
β”‚   β”‚   └── observation_schema.py   # κ΄€μ°°/λ―Έλ””μ–΄/날씨 응닡 μŠ€ν‚€λ§ˆ
β”‚   β”‚
β”‚   └── uploads/                    # λŸ°νƒ€μž„ μ—…λ‘œλ“œ μ €μž₯ 경둜(μ„œλΉ„μŠ€μš©)
β”‚       β”œβ”€β”€ audio/                  # μ—…λ‘œλ“œ μ˜€λ””μ˜€
β”‚       β”œβ”€β”€ img/                    # μ—…λ‘œλ“œ 이미지
β”‚       └── mp4/                    # μ—…λ‘œλ“œ λΉ„λ””μ˜€
β”‚
β”œβ”€β”€ Makefile                        # 자주 μ“°λŠ” λͺ…λ Ή(μ„œλ²„ μ‹€ν–‰, ν¬λ§·νŒ… λ“±) μŠ€ν¬λ¦½νŠΈν™”(선택)
β”œβ”€β”€ requirements.txt                # λ°±μ—”λ“œ μ˜μ‘΄μ„±(νŒ¨ν‚€μ§€) λͺ©λ‘
β”œβ”€β”€ readme.md                       # (μ €μž₯μ†Œ μ„€λͺ…) README
β”œβ”€β”€ .env                            # ν™˜κ²½λ³€μˆ˜(둜컬) β€” 컀밋 κΈˆμ§€
β”œβ”€β”€ .gitignore                      # venv, __pycache__, .env, uploads λ“± μ œμ™Έ
β”œβ”€β”€ venv/                           # κ°€μƒν™˜κ²½ β€” 컀밋 κΈˆμ§€
└── assets/                         # (README μ „μš©) μŠ€ν¬λ¦°μƒ· 폴더
    β”œβ”€β”€ main.png
    β”œβ”€β”€ upload.png
    β”œβ”€β”€ location.png
    └── detail.png


λ‚΄ μ—­ν•  & μ„±κ³Ό

  • DB 섀계·ꡬ좕: κ΄€μ°°(Observation)–미디어(Media)β€“λŒ“κΈ€(Comment) μŠ€ν‚€λ§ˆ/관계 μ •μ˜, 인덱슀 μ΅œμ ν™”.
  • 파일 μ—…λ‘œλ“œ νŒŒμ΄ν”„λΌμΈ: 사진/μ˜μƒ/μ˜€λ””μ˜€ λ©€ν‹°νŒŒνŠΈ μ—…λ‘œλ“œ β†’ μ €μž₯ 경둜/메타 μ €μž₯ β†’ 응닡 μŠ€ν‚€λ§ˆ 섀계.
  • μ˜€ν”ˆ API 톡합: κ΄€μ°° μ’Œν‘œΒ·μ‹œκ° 기반 OpenWeatherMap 날씨/고도 계산, 카카였 지도 μ—­μ§€μ˜€μ½”λ”©.
  • ν”„λ‘ νŠΈ 연동: React UI에 데이터 바인딩, 리슀트/상세/μ—…λ‘œλ“œ E2E ν”Œλ‘œμš° 검증.
  • μ½”λ“œ λͺ¨λ“ˆν™”: observation.py, observation_router.py, observation_schema.py, comment.py, comment_schema.py, db.py λ“±μœΌλ‘œ λ„λ©”μΈΒ·λΌμš°νŒ…Β·μŠ€ν‚€λ§ˆ 뢄리.
  • 운영 κ³ λ €: CORS ν™”μ΄νŠΈλ¦¬μŠ€νŠΈ, .env 뢄리, 둜그 κ°œμΈμ •λ³΄ μ΅œμ†Œν™”, μ—…λ‘œλ“œ 파일 검증.

⚠️ λ³Έ μ €μž₯μ†ŒλŠ” 연ꡬ싀 정책에 따라 μ½”λ“œ νŒŒμΌμ€ λΉ„κ³΅κ°œλ‘œ κ΄€λ¦¬λ©λ‹ˆλ‹€.

λ‚΄λΆ€ κ΅¬ν˜„μ€ 연ꡬ싀 Gitty(Private)μ—μ„œ μœ μ§€λ˜λ©°, 이 μ €μž₯μ†ŒλŠ” λ¬Έμ„œΒ·κ΅¬μ‘°Β·μ„±κ³Ό μ€‘μ‹¬μœΌλ‘œλ§Œ κ³΅κ°œλ©λ‹ˆλ‹€.

About

Wildlife Data Collection Service

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 4

  •  
  •  
  •  
  •