내가 탈 비행기, 과거에 무슨 일이 있었을까?
PlaneBlackBox는 비행편 번호만 입력하면 해당 항공기의 기종과 등록번호를 즉시 확인하고, 과거 사고 이력까지 조회할 수 있는 모바일 앱입니다.
기존에는 항공기 사고 기록을 확인하려면 여러 해외 사이트를 직접 검색해야 했습니다. PlaneBlackBox는 이 과정을 하나의 앱 안에서 해결합니다.
| 기능 | 설명 |
|---|---|
| 비행편 조회 | 비행편 번호 입력 → 항공기 기종 및 등록번호 자동 조회 |
| 사고 이력 검색 | 항공기 등록번호 기반 과거 사고 기록 조회 |
| 소셜 로그인 | 카카오, 애플 간편 로그인 |
| 다크/라이트 테마 | 시스템 설정 연동 자동 전환 |
graph TB
subgraph client [Client]
RN["React Native App\niOS / Android"]
end
subgraph backend [Backend]
SB[Spring Boot 3.4.2]
SEC[Spring Security JWT]
JPA[Spring Data JPA]
CACHE[Redis Cache]
SCRAPER[Web Scraper]
end
subgraph database [Database]
PG[(PostgreSQL)]
RD[(Redis)]
end
subgraph external [External Services]
FA[FlightAware API]
ASN[Aviation Safety Network]
end
RN -->|REST API| SB
SB --> SEC
SB --> JPA
SB --> CACHE
SB --> SCRAPER
JPA --> PG
CACHE --> RD
SB -->|Flight Data| FA
SCRAPER -->|Accident Data| ASN
레이어드 아키텍처 기반 Spring Boot 애플리케이션
graph LR
subgraph presentation [Presentation Layer]
AUTH_CTRL[AuthController]
MEMBER_CTRL[MemberController]
FLIGHT_CTRL[FlightInfoController]
ACCIDENT_CTRL[PlaneAccidentController]
end
subgraph business [Business Layer]
AUTH_SVC[AuthService]
MEMBER_SVC[MemberService]
FLIGHT_SVC[FlightAwareService]
SCRAPING_SVC[ScrapingService]
end
subgraph data [Data Layer]
MEMBER_REPO[MemberRepository]
ACCIDENT_REPO[AccidentRepository]
AIRCRAFT_REPO[AircraftRepository]
end
subgraph infra [Infrastructure]
PG[(PostgreSQL)]
RD[(Redis)]
EXT[External APIs]
end
presentation --> business
business --> data
data --> infra
business --> infra
| 레이어 | 역할 |
|---|---|
| Controller | REST API 엔드포인트 제공 |
| Service | 비즈니스 로직 처리, 외부 API 연동 |
| Repository | JPA 기반 데이터 접근 계층 |
| Security | JWT 기반 인증/인가 (Access + Refresh Token) |
| Scraper | Selenium + JSoup 기반 항공 사고 데이터 수집 |
React Navigation 기반 네비게이션 + Zustand / React Query 상태 관리
graph TB
subgraph nav [Navigation Structure]
ROOT[RootNavigator]
ROOT --> AUTH_STACK[AuthStackNavigator]
ROOT --> MAIN_TAB[MainTabNavigator]
AUTH_STACK --> LOGIN[LoginScreen]
AUTH_STACK --> SIGNUP[SignupScreen]
AUTH_STACK --> KAKAO[KakaoLoginScreen]
MAIN_TAB --> SEARCH_STACK[SearchStackNavigator]
MAIN_TAB --> USER_STACK[UserStackNavigator]
SEARCH_STACK --> SEARCH_HOME[SearchHomeScreen]
SEARCH_STACK --> SEARCH_DETAIL[SearchIdentScreen]
USER_STACK --> USER_HOME[UserHomeScreen]
USER_STACK --> USER_EDIT[UserEditScreen]
end
subgraph state [State Management]
ZUSTAND["Zustand\nClient State"]
RQ["React Query\nServer State"]
end
MAIN_TAB -.-> ZUSTAND
MAIN_TAB -.-> RQ
| 구분 | 라이브러리 | 용도 |
|---|---|---|
| Client State | Zustand | 사용자 프로필, 테마 설정 등 |
| Server State | React Query | API 데이터 캐싱, 동기화, 리페칭 |
src/main/java/com/suhkang/inquiryingaccident/
├── controller/ # REST API 컨트롤러
├── service/ # 비즈니스 로직
├── repository/ # JPA 레포지토리
├── object/
│ ├── dao/ # JPA 엔티티
│ ├── dto/ # 데이터 전송 객체
│ └── mapper/ # MapStruct 매퍼
├── config/ # 설정 (Security, Redis, CORS 등)
└── global/ # 공통 모듈 (예외 처리, 필터, AOP 로깅)
src/
├── api/ # Axios 인스턴스 및 API 호출
├── components/ # 재사용 UI 컴포넌트
├── screens/ # 화면 컴포넌트
├── navigations/ # 네비게이션 설정
├── store/ # Zustand 스토어
├── hooks/ # 커스텀 훅 (React Query 포함)
├── types/ # TypeScript 타입 정의
├── constants/ # 상수 (색상, 설정)
└── utils/ # 유틸리티 함수
| 이름 | GitHub | 역할 |
|---|---|---|
| 강주현 | @juhyunk0820 | Frontend |
| 서새찬 | @Cassiiopeia | Backend |
| 윤지희 | @jihee127 | Design |
PlaneBlackBox — 비행의 기록을 추적하다