<aside>

Backend

  1. Java 17
    1. LTS(Long-term-service) 버전으로 장기적인 안정성이 보장되며 스프링 부트 3.x 버전과의 호환성을 위해서 선택.
  2. Spring Boot
    1. Java 기반의 안정적이고 생산성 높은 프레임워크로, 빠른 서버 구축과 다양한 확장 기능 제공을 위해 선택.
  3. Spring Security
    1. 인증(Authentication)과 인가(Authorization)를 구조화된 방식으로 처리할 수 있도록 도와주며, 다양한 보안 위협에 대비한 필터 체인을 기본 제공하여 안전한 인증 시스템 구축에 유리.
  4. OAuth2
    1. 카카오 소셜 로그인 연동을 손쉽게 구현할 수 있어 사용자 접근성을 높임.
  5. JWT(Json Web Token)
    1. 토큰 기반의 무상태(stateless) 인증 방식을 제공해 서버 세션 관리가 필요 없고, 마이크로서비스 환경이나 모바일 클라이언트 연동 시에도 유리.
  6. Spring Data JPA
    1. 다중 엔티티 관계 최적화: 사용자-즐겨찾기-브랜드-카테고리 간의 복잡한 연관관계를 JPA 어노테이션으로 선언적 정의하고 Lazy Loading으로 성능 최적화하여 대용량 데이터 처리 효율성 확보.
    2. 트랜잭션 관리 자동화: 브랜드 매장 정보 수정과 통계 데이터 업데이트가 동시에 발생하는 복잡한 비즈니스 로직에서 @Transactional 선언적 트랜잭션으로 데이터 일관성이 보장.
    3. 팀 협업 효율성: Repository 패턴을 통한 데이터 접근 계층 표준화로 프론트엔드 개발자도 이해하기 쉬운 명확한 API 설계 및 백엔드 팀 내 코드 일관성 유지 가능.
  7. Springdoc Swagger
    1. API 명세 문서를 자동으로 생성하고, 협업 시 인터페이스 확인 및 테스트를 용이하게 하기 위해 선택.
  8. Liquibase
    1. DB 스키마 버전 관리를 자동화하기 위해 선택하였다. 각 개발자가 동일한 환경에서 작업할 수 있도록 데이터베이스 변경 사항을 형상 관리하고, 배포 시점마다 일관된 마이그레이션을 보장.
  9. QueryDSL
    1. 가독성이 높고 확장가능한 동적 쿼리를 작성하기 위해 도입.
    2. JPA를 통해 구현하지 못하는 복잡한 쿼리, 동적 쿼리를 구현할 수 있다는 장점 활용.
    3. 쿼리를 코드를 통해 작성하기 때문에 오타가 발생할 확률이 줄고, 객체 지향적으로 개발.
  10. JUnit 5
    1. Java에서 가장 많이 사용되는 단위 테스트 프레임워크
    2. 코드의 안정성을 검증할 때 많이 사용한다. 이전 버전과 달리 모듈 기반 구조로 설계됐고, 확장성이 높아져 선택.
  11. Mockito
    1. Java 오픈소스 테스트 프레임워크로 모방 객체인 Mock 객체를 생성하여 단위 테스트를 쉽게 수행.
    2. 복잡한 의존성을 제거하고 테스트 데이터를 간편히 구성할 수 있어 외부 API, DB를 사용하는 서비스에서 직접 연결 없이 다양한 상황을 시뮬레이션.
  12. Fast API
    1. 추천 알고리즘 처리 서버를 분리하기 위해 도입.
    2. 파이썬 전용 서버를 구성하여 추천 알고리즘에 필요한 라이브러리를 활용하기 위해 선택.
    3. 비동기 처리 지원, 빠른 응답성과 경량성, Swagger 지원 기능 제공.
  13. LightFM
    1. 고려한 기술 : surprise, Implicit
    2. 콘텐츠 기반 + 협업 필터링 기반 하이브리드 추천 시스템 구축을 위해 도입.
    3. Implicit는 사용자 행동 로그 데이터 사용에 있어서는 빠르고 효과적일 수 있으나, 사용자 정보와 제휴처 특성을 명시적으로 feature에 사용이 불가하여 유저 정보나 카테고리 정보를 활용하기 어려움.
    4. Surprise는 사용 편의성이 높으나, feature 기반 제휴처 필터링 기능을 지원하지 않으며, 콜드 스타트 대응이 어려워 실사용자 기반 고도화에 제한이 있음. </aside>

<aside>

Frontend

  1. React
    1. 컴포넌트 기반 아키텍처: 권한별 UI(사용자/관리자) 모듈화와 재사용 가능한 지도 컴포넌트 구현.
    2. Virtual DOM 최적화: 지도 마커 대량 렌더링 시 효율적인 DOM 업데이트로 60fps 인터랙션 보장.
    3. 생태계 성숙도: 지도 API 통합 레퍼런스와 위치 기반 서비스 라이브러리 풍부.
    4. 팀 숙련도: 복잡한 상태 관리와 컴포넌트 최적화 경험을 통한 안정적 개발 일정 확보.
  2. Recharts
    1. React 생태계 완벽 통합: 컴포넌트 기반 선언적 API로 권한별 대시보드(사용자/관리자) 조건부 렌더링과 Zustand 상태 변경 시 자동 차트 업데이트 구현.
    2. 동적 데이터 처리 최적화: TanStack Query와 연동하여 실시간 즐겨찾기 변동이나 사용자 활동 통계 업데이트 시 React 리렌더링 과정에서 자연스러운 차트 동기화.
    3. 개발 생산성과 성능 균형: SVG 기반 벡터 렌더링으로 모바일 환경에서의 선명도 확보와 동시에 복잡한 Canvas 관리 없이 8월 1일 개발 완료 일정 내 빠른 구현 가능.
  3. TypeScript
    1. 복잡한 다중 사용자 권한 시스템과 지도 API 연동 시 런타임 오류 방지 및 팀 협업 생산성 향상.
  4. Zustand
    1. Redux 대비 보일러플레이트 최소화로 지도 상태와 사용자 권한 관리를 경량화 하면서도 직관적 상태 구조 유지.
  5. TanStack Query (React Query)
    1. 위치 기반 제휴처 데이터의 효율적 캐싱과 백그라운드 동기화로 지도 성능 최적화 및 네트워크 요청 최소화.
  6. Axios
    1. Spring Boot와 일관된 HTTP 통신 구조 + 인터셉터를 통한 JWT 토큰 자동 갱신으로 안정적 API 통신.
  7. Tailwind CSS + Shadcn UI
    1. 권한별 차별화 UI 빠른 구현 + 디자인 시스템 일관성 유지로 1개월 개발 기간 내 완성도 높은 인터페이스 제공.
  8. Storybook
    1. 권한별 컴포넌트(사용자/관리자) 및 지도에 활용될 UI 컴포넌트를 독립적 개발 및 테스트를 통해 복잡한 UI 시스템의 안정성 확보.
  9. ESLint + Prettier
    1. 팀원의 코드 일관성 자동화와 TypeScript 문법 오류 사전 방지로 협업 효율성 극대화.
  10. Framer Motion
    1. 선언적 애니메이션과 제스처 처리로 Bottom Sheet의 자연스러운 모바일 UX 구현 및 개발 생산성 향상. </aside>

<aside>

DB

  1. PostgreSQL & PostGIS
    1. PostgreSQL의 PostGIS 공간 확장 기능을 사용해 공간 정보를 PostgreSQL 안에서 저장하고 계산.
    2. “1km 반경 내 카테고리별 제휴처 조회"와 같은 복잡한 지리 공간 쿼리를 PostGIS 도입하여 효율적이고 빠르게 구현 가능.
    3. 경제성 : MySQL의 공간 확장 기능의 경우 기능이 제한적이라는 점, Oracle의 경우 강력한 기능을 지녔으나 비용적인 부담으로 PostgreSQL과 PostGIS가 본 프로젝트에 가장 적합하다고 판단. </aside>

<aside>

Infra

  1. AWS
    1. 글로벌 클라우드 시장 점유율 1위.
    2. EC2, RDS, S3, CodeDeploy 등 세분화된 인프라 서비스 제공.
    3. Auto Scaling, Load Balancer 등을 통한 수평 확장 구조를 쉽게 구축 가능.
    4. 서버 및 데이터베이스 운영의 안정성과 유연성 확보를 위해 Amazon Web Services 인프라를 채택.
  2. Docker
    1. 개발 및 배포 환경의 일관성을 보장하고, 확장성을 확보하기 위해 선택.
    2. 컨테이너 기장 실행 환경을 제공함으로써 개발, 테스트, 운영 환경 간의 설정 차이로 발생할 수 있는 오류를 최소화.
    3. Github Actions 등 CI/CD 도구와의 연동이 용이하여, 배포 자동화 및 테스트 환경 구축에 적합.
  3. Github Actions </aside>