Skip to content
Β 
Β 

Repository files navigation

🎣 해루핸 (Haeruhand) - μ•ˆμ „ν•œ ν•΄λ£¨μ§ˆ μ„œλΉ„μŠ€

Spring Boot Java MySQL Redis
React TypeScript Vite Capacitor

κ³΅ν†΅ν”„λ‘œμ νŠΈ 진행상황 μš”μ•½

  • 핡심 κΈ°λŠ₯의 개발이 ν”„λ‘ νŠΈ/λ°±μ—”λ“œ 각자 μ™„λ£Œλ˜μ—ˆμœΌλ©°, μ—°λ™μž‘μ—…μ„ μ§„ν–‰μ€‘μž…λ‹ˆλ‹€.
  • 이번주 μ£Όλ§κΉŒμ§€ 핡심 κΈ°λŠ₯의 MVP κ°œλ°œμ„ μ™„λ£Œν•˜κ³  ν…ŒμŠ€νŠΈλ₯Ό μ§„ν–‰ν•  μ˜ˆμ •μž…λ‹ˆλ‹€.

해루핸 μ†Œκ°œ μ˜μƒ

해루핸 확인 링크

πŸ“‹ λͺ©μ°¨

🎯 ν”„λ‘œμ νŠΈ μ†Œκ°œ

해루핸(Haeruhand)λŠ” ν•΄λ£¨μ§ˆμ„ ν•˜κ³  μ‹Άμ–΄ν•˜λŠ” 초보자λ₯Ό μœ„ν•œ μ’…ν•© 슀마트 μ„œλΉ„μŠ€ ν”Œλž«νΌμž…λ‹ˆλ‹€. μ‹€μ‹œκ°„ μœ„μΉ˜ 곡유, AI 기반 μ–΄μ’… νŒλ³„, κΈˆμ–΄κΈ° 정보 제곡, ν•΄μ–‘ 기상 정보 λ“± ν•΄λ£¨μ§ˆμ— ν•„μš”ν•œ λͺ¨λ“  정보λ₯Ό ν•œ κ³³μ—μ„œ μ œκ³΅ν•©λ‹ˆλ‹€.

ν”„λ‘œμ νŠΈ λͺ©ν‘œ

  • μ•ˆμ „ν•œ ν•΄λ£¨μ§ˆ ν™œλ™ 지원을 μœ„ν•œ μ‹€μ‹œκ°„ μœ„μΉ˜ 곡유 μ‹œμŠ€ν…œ
  • AI κΈ°μˆ μ„ ν™œμš©ν•œ 즉각적인 μ–΄μ’… νŒλ³„ 및 κΈˆμ–΄κΈ° 정보 제곡
  • ν•΄μ–‘ 기상 특보 μ•Œλ¦Όμ„ ν†΅ν•œ 사고 예방
  • ν•΄λ£¨μ§ˆ κ΄€λ ¨ λ²•κ·œ μ€€μˆ˜λ₯Ό μœ„ν•œ 정보 제곡

πŸš€ 핡심 κΈ°λŠ₯

μ‹œμ—° μ˜μƒ

1. πŸ—ΊοΈ μ‹€μ‹œκ°„ μœ„μΉ˜ 곡유 μ‹œμŠ€ν…œ

  • WebSocket/STOMP 기반 μ‹€μ‹œκ°„ 톡신
  • μ΅œλŒ€ 4λͺ…κΉŒμ§€ λ™μ‹œ μœ„μΉ˜ 곡유
  • 호슀트 기반 λ°© 관리 μ‹œμŠ€ν…œ
  • λ”₯링크λ₯Ό ν†΅ν•œ κ°„νŽΈν•œ λ°© μ°Έκ°€
  • 멀버별 색상 ꡬ뢄 μ‹œμŠ€ν…œ

λ™μ˜μƒ 보기

2. πŸ€– AI μ–΄μ’… νŒλ³„ μ‹œμŠ€ν…œ

  • FastAPI AI μ„œλ²„ 연동
  • 이미지 μ—…λ‘œλ“œ β†’ μ–΄μ’… μžλ™ νŒλ³„
  • νŒλ³„λœ μ–΄μ’…μ˜ κΈˆμ–΄κΈ° 정보 μ¦‰μ‹œ 제곡

3. 🚫 κΈˆμ–΄κΈ° 정보 관리

  • 어쒅별 포획 κΈˆμ§€ κΈ°κ°„ DB
  • 지역별(κΆŒμ—­λ³„) μ°¨λ³„ν™”λœ κΈˆμ–΄κΈ° 적용
  • μ΅œμ†Œ 체μž₯/체쀑 μ œν•œ 정보 제곡
  • μ‹€μ‹œκ°„ κΈˆμ–΄κΈ° μœ„λ°˜ μ—¬λΆ€ νŒλ³„

4. πŸ“± ν‘Έμ‹œ μ•Œλ¦Ό μ‹œμŠ€ν…œ

  • Firebase Cloud Messaging (FCM) 기반
  • λ™λ£Œ μ΄νƒˆ μ•Œλ¦Ό
  • ν•΄μ–‘ 기상 특보 μ•Œλ¦Ό
  • 닀쀑 λ””λ°”μ΄μŠ€ 지원

5. 🌊 ν•΄μ–‘ 정보 제곡

  • 쑰수 정보 (만쑰/κ°„μ‘° μ‹œκ°„)
  • 기상 특보 (강풍, ν’λž‘ λ“±)
  • μ–΄μž₯ 정보 (μœ„μΉ˜, νŽΈμ˜μ‹œμ„€)

6. πŸ” λ³΄μ•ˆ 인증 μ‹œμŠ€ν…œ

  • Kakao OAuth 2.0 μ†Œμ…œ 둜그인
  • JWT 기반 인증 (Access Token + Refresh Token)
  • Redis 기반 토큰 관리

πŸ—οΈ μ‹œμŠ€ν…œ μ•„ν‚€ν…μ²˜

alt text

λ°±μ—”λ“œ μ•„ν‚€ν…μ²˜ - 도메인 쀑심 섀계 (DDD)

backend/spring-business/haeruhand/
└── src/main/java/com/ssafy/haeruhand/
    β”œβ”€β”€ domain/
    β”‚   β”œβ”€β”€ user/          # μ‚¬μš©μž 관리
    β”‚   β”œβ”€β”€ location/      # μ‹€μ‹œκ°„ μœ„μΉ˜ 곡유
    β”‚   β”œβ”€β”€ fish/          # μ–΄μ’… 및 κΈˆμ–΄κΈ°
    β”‚   β”œβ”€β”€ ai/            # AI μ–΄μ’… νŒλ³„
    β”‚   β”œβ”€β”€ notification/  # ν‘Έμ‹œ μ•Œλ¦Ό
    β”‚   β”œβ”€β”€ fishery/       # μ–΄μž₯ 정보
    β”‚   β”œβ”€β”€ marine/        # ν•΄μ–‘ 정보
    β”‚   └── weather/       # 날씨 정보
    └── global/            # 곡톡 μ„€μ • 및 μœ ν‹Έλ¦¬ν‹°
        β”œβ”€β”€ config/        # μ„€μ • 클래슀
        β”œβ”€β”€ jwt/           # JWT κ΄€λ ¨
        β”œβ”€β”€ websocket/     # WebSocket μ„€μ •
        └── exception/     # μ˜ˆμ™Έ 처리

ν”„λ‘ νŠΈμ—”λ“œ μ•„ν‚€ν…μ²˜ - Atomic Design Pattern

frontend/
└── src/
    β”œβ”€β”€ components/
    β”‚   β”œβ”€β”€ atoms/          # κΈ°λ³Έ UI μš”μ†Œ
    β”‚   β”‚   β”œβ”€β”€ Button/
    β”‚   β”‚   β”œβ”€β”€ Input/
    β”‚   β”‚   β”œβ”€β”€ Text/
    β”‚   β”‚   └── Icon/
    β”‚   └── molecules/      # 볡합 μ»΄ν¬λ„ŒνŠΈ
    β”‚       β”œβ”€β”€ Card/
    β”‚       β”œβ”€β”€ Form/
    β”‚       β”œβ”€β”€ Header/
    β”‚       └── Modal/
    β”œβ”€β”€ pages/              # νŽ˜μ΄μ§€ μ»΄ν¬λ„ŒνŠΈ
    β”‚   β”œβ”€β”€ MainPage/       # 메인 ν™”λ©΄
    β”‚   β”œβ”€β”€ LoginPage/      # 둜그인
    β”‚   β”œβ”€β”€ WeatherAlertPage/ # 날씨 μ•Œλ¦Ό
    β”‚   β”œβ”€β”€ LocationSharePage/ # μœ„μΉ˜ 곡유
    β”‚   β”œβ”€β”€ FishDetectPage/ # μ–΄μ’… νŒλ³„
    β”‚   β”œβ”€β”€ FisheryMapPage/ # μ–΄μž₯ 지도
    β”‚   └── NotificationPage/ # μ•Œλ¦Ό μ„€μ •
    β”œβ”€β”€ routes/             # λΌμš°νŒ… μ„€μ •
    β”œβ”€β”€ api/                # API 톡신
    β”œβ”€β”€ hooks/              # μ»€μŠ€ν…€ ν›…
    β”œβ”€β”€ stores/             # μ „μ—­ μƒνƒœ 관리
    β”œβ”€β”€ types/              # TypeScript νƒ€μž… μ •μ˜
    └── utils/              # μœ ν‹Έλ¦¬ν‹° ν•¨μˆ˜

πŸ› οΈ 기술 μŠ€νƒ

Backend

  • Spring Boot 3.5.4 - μ΅œμ‹  버전 적용
  • Java 17 - LTS 버전
  • Spring Data JPA - ORM
  • Spring Security - λ³΄μ•ˆ
  • Spring WebSocket - μ‹€μ‹œκ°„ 톡신
  • MySQL - μ£Ό λ°μ΄ν„°λ² μ΄μŠ€
  • Redis - 캐싱 및 μ„Έμ…˜ 관리
  • Firebase Admin SDK - FCM ν‘Έμ‹œ μ•Œλ¦Ό
  • Google Cloud Storage - 이미지 μ €μž₯μ†Œ
  • Kakao OAuth 2.0 - μ†Œμ…œ 둜그인
  • FastAPI - AI μ„œλ²„ 연동
  • Swagger/OpenAPI 3.0 - API λ¬Έμ„œν™”
  • Lombok - μ½”λ“œ κ°„μ†Œν™”
  • JWT (io.jsonwebtoken) - 토큰 관리

Frontend

  • React 19.1.0 - μ΅œμ‹  버전 UI 라이브러리
  • TypeScript 5.8.3 - νƒ€μž… μ•ˆμ •μ„±
  • Vite 7.0.4 - λΉ λ₯Έ λΉŒλ“œ 도ꡬ
  • Capacitor 7.4.2 - 크둜슀 ν”Œλž«νΌ λͺ¨λ°”일 μ•±
  • TanStack Router - νƒ€μž… μ•ˆμ „ λΌμš°νŒ…
  • TanStack Query - μ„œλ²„ μƒνƒœ 관리
  • Zustand - ν΄λΌμ΄μ–ΈνŠΈ μƒνƒœ 관리
  • Axios - HTTP ν΄λΌμ΄μ–ΈνŠΈ
  • CSS Modules - μŠ€νƒ€μΌ μΊ‘μŠν™”
  • React Hook Form - 폼 관리
  • Framer Motion - μ• λ‹ˆλ©”μ΄μ…˜
  • Socket.io Client - WebSocket 톡신

πŸ“‘ API λͺ…μ„Έ

인증 κ΄€λ ¨ API

Method Endpoint Description
POST /v1/user/issue/kakao 카카였 OAuth 둜그인
POST /v1/user/reissue 토큰 μž¬λ°œκΈ‰
GET /v1/user/userinfo μ‚¬μš©μž 정보 쑰회

μœ„μΉ˜ 곡유 API

Method Endpoint Description
POST /v1/location/rooms μœ„μΉ˜ 곡유 λ°© 생성
GET /v1/location/rooms/{roomCode} λ°© 정보 쑰회
DELETE /v1/location/rooms/{roomCode} λ°© κ°•μ œ μ’…λ£Œ

WebSocket μ—”λ“œν¬μΈνŠΈ

Endpoint Description
/v1/ws WebSocket μ—°κ²°
/pub/location.join λ°© μ°Έκ°€
/pub/location.update μœ„μΉ˜ μ—…λ°μ΄νŠΈ
/pub/location.leave λ°© 퇴μž₯
/sub/location.{roomCode} λ°© ꡬ독

AI μ–΄μ’… νŒλ³„ API

Method Endpoint Description
POST /v1/seafood-detect μ–΄μ’… νŒλ³„ μš”μ²­
POST /v1/storage/signed-urls 이미지 μ—…λ‘œλ“œ URL 생성

μ•Œλ¦Ό κ΄€λ ¨ API

Method Endpoint Description
POST /v1/notifications/tokens FCM 토큰 등둝
PUT /v1/notifications/tokens/{tokenId} FCM 토큰 κ°±μ‹ 
DELETE /v1/notifications/tokens/{tokenId} FCM 토큰 μ‚­μ œ

πŸ” λ³΄μ•ˆ 및 인증

JWT 토큰 ꡬ쑰

{
  "accessToken": {
    "expiry": "1μ‹œκ°„",
    "usage": "API μš”μ²­ 인증"
  },
  "refreshToken": {
    "expiry": "7일",
    "usage": "Access Token κ°±μ‹ ",
    "storage": "Redis"
  },
  "joinToken": {
    "expiry": "30λΆ„",
    "usage": "μœ„μΉ˜ 곡유 λ°© μ°Έκ°€"
  }
}

λ³΄μ•ˆ νŠΉμ§•

  • Redis 기반 Refresh Token 관리

API λ¬Έμ„œ

μ„œλ²„ μ‹€ν–‰ ν›„ Swagger UI 접속:

http://haeruhand.o-r.kr/api/swagger-ui/index.html

πŸ“± λͺ¨λ°”일 μ•± 지원

크둜슀 ν”Œλž«νΌ 지원

  • Capacitor 7.4.2 기반 ν•˜μ΄λΈŒλ¦¬λ“œ μ•±
  • iOS/Android λ„€μ΄ν‹°λΈŒ μ•± λΉŒλ“œ 지원
  • Progressive Web App (PWA) λŒ€μ‘

λ„€μ΄ν‹°λΈŒ κΈ°λŠ₯ 연동

  • GPS/μœ„μΉ˜ μ„œλΉ„μŠ€ - μ‹€μ‹œκ°„ μœ„μΉ˜ 좔적
  • 카메라 - μ–΄μ’… 촬영 및 νŒλ³„
  • ν‘Έμ‹œ μ•Œλ¦Ό - FCM 연동
  • λ”₯링크 - μ•± κ°„ 연동 (seafeet://)
  • 둜컬 μŠ€ν† λ¦¬μ§€ - μ˜€ν”„λΌμΈ 데이터 μ €μž₯

πŸ“Š μ„±λŠ₯ μ΅œμ ν™”

λ°±μ—”λ“œ μ΅œμ ν™”

  • STOMP ν”„λ‘œν† μ½œ μ‚¬μš©μœΌλ‘œ λ©”μ‹œμ§€ λΌμš°νŒ… νš¨μœ¨ν™”
  • 배치 처리λ₯Ό ν†΅ν•œ μœ„μΉ˜ 데이터 μ €μž₯ μ΅œμ ν™”
  • @Async μ–΄λ…Έν…Œμ΄μ…˜μ„ ν†΅ν•œ FCM μ•Œλ¦Ό 비동기 전솑

ν”„λ‘ νŠΈμ—”λ“œ μ΅œμ ν™”

  • Code Splitting - 라우트 기반 μ½”λ“œ λΆ„ν• 
  • Lazy Loading - μ»΄ν¬λ„ŒνŠΈ μ§€μ—° λ‘œλ”©
  • 이미지 μ΅œμ ν™” - WebP 포맷 및 responsive images
  • Virtual Scrolling - λŒ€λŸ‰ 데이터 λ Œλ”λ§ μ΅œμ ν™”
  • React.memo - λΆˆν•„μš”ν•œ λ¦¬λ Œλ”λ§ λ°©μ§€

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages