<aside>
Backend
- Java 17
- LTS(Long-term-service) 버전으로 장기적인 안정성이 보장되며 스프링 부트 3.x 버전과의 호환성을 위해서 선택.
- Spring Boot
- Java 기반의 안정적이고 생산성 높은 프레임워크로, 빠른 서버 구축과 다양한 확장 기능 제공을 위해 선택.
- Spring Security
- 인증(Authentication)과 인가(Authorization)를 구조화된 방식으로 처리할 수 있도록 도와주며, 다양한 보안 위협에 대비한 필터 체인을 기본 제공하여 안전한 인증 시스템 구축에 유리.
- OAuth2
- 카카오 소셜 로그인 연동을 손쉽게 구현할 수 있어 사용자 접근성을 높임.
- JWT(Json Web Token)
- 토큰 기반의 무상태(stateless) 인증 방식을 제공해 서버 세션 관리가 필요 없고, 마이크로서비스 환경이나 모바일 클라이언트 연동 시에도 유리.
- Spring Data JPA
- 다중 엔티티 관계 최적화: 사용자-즐겨찾기-브랜드-카테고리 간의 복잡한 연관관계를 JPA 어노테이션으로 선언적 정의하고 Lazy Loading으로 성능 최적화하여 대용량 데이터 처리 효율성 확보.
- 트랜잭션 관리 자동화: 브랜드 매장 정보 수정과 통계 데이터 업데이트가 동시에 발생하는 복잡한 비즈니스 로직에서 @Transactional 선언적 트랜잭션으로 데이터 일관성이 보장.
- 팀 협업 효율성: Repository 패턴을 통한 데이터 접근 계층 표준화로 프론트엔드 개발자도 이해하기 쉬운 명확한 API 설계 및 백엔드 팀 내 코드 일관성 유지 가능.
- Springdoc Swagger
- API 명세 문서를 자동으로 생성하고, 협업 시 인터페이스 확인 및 테스트를 용이하게 하기 위해 선택.
- Liquibase
- DB 스키마 버전 관리를 자동화하기 위해 선택하였다. 각 개발자가 동일한 환경에서 작업할 수 있도록 데이터베이스 변경 사항을 형상 관리하고, 배포 시점마다 일관된 마이그레이션을 보장.
- QueryDSL
- 가독성이 높고 확장가능한 동적 쿼리를 작성하기 위해 도입.
- JPA를 통해 구현하지 못하는 복잡한 쿼리, 동적 쿼리를 구현할 수 있다는 장점 활용.
- 쿼리를 코드를 통해 작성하기 때문에 오타가 발생할 확률이 줄고, 객체 지향적으로 개발.
- JUnit 5
- Java에서 가장 많이 사용되는 단위 테스트 프레임워크
- 코드의 안정성을 검증할 때 많이 사용한다. 이전 버전과 달리 모듈 기반 구조로 설계됐고, 확장성이 높아져 선택.
- Mockito
- Java 오픈소스 테스트 프레임워크로 모방 객체인 Mock 객체를 생성하여 단위 테스트를 쉽게 수행.
- 복잡한 의존성을 제거하고 테스트 데이터를 간편히 구성할 수 있어 외부 API, DB를 사용하는 서비스에서 직접 연결 없이 다양한 상황을 시뮬레이션.
- Fast API
- 추천 알고리즘 처리 서버를 분리하기 위해 도입.
- 파이썬 전용 서버를 구성하여 추천 알고리즘에 필요한 라이브러리를 활용하기 위해 선택.
- 비동기 처리 지원, 빠른 응답성과 경량성, Swagger 지원 기능 제공.
- LightFM
- 고려한 기술 : surprise, Implicit
- 콘텐츠 기반 + 협업 필터링 기반 하이브리드 추천 시스템 구축을 위해 도입.
- Implicit는 사용자 행동 로그 데이터 사용에 있어서는 빠르고 효과적일 수 있으나, 사용자 정보와 제휴처 특성을 명시적으로 feature에 사용이 불가하여 유저 정보나 카테고리 정보를 활용하기 어려움.
- Surprise는 사용 편의성이 높으나, feature 기반 제휴처 필터링 기능을 지원하지 않으며, 콜드 스타트 대응이 어려워 실사용자 기반 고도화에 제한이 있음.
</aside>
<aside>
Frontend
- React
- 컴포넌트 기반 아키텍처: 권한별 UI(사용자/관리자) 모듈화와 재사용 가능한 지도 컴포넌트 구현.
- Virtual DOM 최적화: 지도 마커 대량 렌더링 시 효율적인 DOM 업데이트로 60fps 인터랙션 보장.
- 생태계 성숙도: 지도 API 통합 레퍼런스와 위치 기반 서비스 라이브러리 풍부.
- 팀 숙련도: 복잡한 상태 관리와 컴포넌트 최적화 경험을 통한 안정적 개발 일정 확보.
- Recharts
- React 생태계 완벽 통합: 컴포넌트 기반 선언적 API로 권한별 대시보드(사용자/관리자) 조건부 렌더링과 Zustand 상태 변경 시 자동 차트 업데이트 구현.
- 동적 데이터 처리 최적화: TanStack Query와 연동하여 실시간 즐겨찾기 변동이나 사용자 활동 통계 업데이트 시 React 리렌더링 과정에서 자연스러운 차트 동기화.
- 개발 생산성과 성능 균형: SVG 기반 벡터 렌더링으로 모바일 환경에서의 선명도 확보와 동시에 복잡한 Canvas 관리 없이 8월 1일 개발 완료 일정 내 빠른 구현 가능.
- TypeScript
- 복잡한 다중 사용자 권한 시스템과 지도 API 연동 시 런타임 오류 방지 및 팀 협업 생산성 향상.
- Zustand
- Redux 대비 보일러플레이트 최소화로 지도 상태와 사용자 권한 관리를 경량화 하면서도 직관적 상태 구조 유지.
- TanStack Query (React Query)
- 위치 기반 제휴처 데이터의 효율적 캐싱과 백그라운드 동기화로 지도 성능 최적화 및 네트워크 요청 최소화.
- Axios
- Spring Boot와 일관된 HTTP 통신 구조 + 인터셉터를 통한 JWT 토큰 자동 갱신으로 안정적 API 통신.
- Tailwind CSS + Shadcn UI
- 권한별 차별화 UI 빠른 구현 + 디자인 시스템 일관성 유지로 1개월 개발 기간 내 완성도 높은 인터페이스 제공.
- Storybook
- 권한별 컴포넌트(사용자/관리자) 및 지도에 활용될 UI 컴포넌트를 독립적 개발 및 테스트를 통해 복잡한 UI 시스템의 안정성 확보.
- ESLint + Prettier
- 팀원의 코드 일관성 자동화와 TypeScript 문법 오류 사전 방지로 협업 효율성 극대화.
- Framer Motion
- 선언적 애니메이션과 제스처 처리로 Bottom Sheet의 자연스러운 모바일 UX 구현 및 개발 생산성 향상.
</aside>
<aside>
DB
- PostgreSQL & PostGIS
- PostgreSQL의 PostGIS 공간 확장 기능을 사용해 공간 정보를 PostgreSQL 안에서 저장하고 계산.
- “1km 반경 내 카테고리별 제휴처 조회"와 같은 복잡한 지리 공간 쿼리를 PostGIS 도입하여 효율적이고 빠르게 구현 가능.
- 경제성 : MySQL의 공간 확장 기능의 경우 기능이 제한적이라는 점, Oracle의 경우 강력한 기능을 지녔으나 비용적인 부담으로 PostgreSQL과 PostGIS가 본 프로젝트에 가장 적합하다고 판단.
</aside>
<aside>
Infra
- AWS
- 글로벌 클라우드 시장 점유율 1위.
- EC2, RDS, S3, CodeDeploy 등 세분화된 인프라 서비스 제공.
- Auto Scaling, Load Balancer 등을 통한 수평 확장 구조를 쉽게 구축 가능.
- 서버 및 데이터베이스 운영의 안정성과 유연성 확보를 위해 Amazon Web Services 인프라를 채택.
- Docker
- 개발 및 배포 환경의 일관성을 보장하고, 확장성을 확보하기 위해 선택.
- 컨테이너 기장 실행 환경을 제공함으로써 개발, 테스트, 운영 환경 간의 설정 차이로 발생할 수 있는 오류를 최소화.
- Github Actions 등 CI/CD 도구와의 연동이 용이하여, 배포 자동화 및 테스트 환경 구축에 적합.
- Github Actions
</aside>