Skip to content

중고 의류를 거래하고, 나누며, 창의적 활동을 통해 지속 가능한 패션을 실현하는 플랫폼입니다

Project-FitLoop/FitLoop-BE

Repository files navigation

👗 FITLOOP - Backend

FITLOOP Logo

FITLOOP은 사용자가 옷을 사고팔 수 있는 패션 거래 플랫폼입니다.
사용자는 마켓에서 옷을 사고팔 수 있으며, 룩북을 통해 스타일을 공유하고, 챌린지에 참여해 트렌디한 패션 문화를 즐길 수 있습니다.



🛠️ 프로젝트 개요

  • 프로젝트명: FITLOOP
  • 목적: 사용자들이 패션 아이템을 사고팔고, 룩북과 챌린지를 통해 스타일을 공유하는 패션 커뮤니티 플랫폼 제공

✨ 주요 기능

  • 🛒 마켓플레이스: 사용자가 직접 패션 아이템을 등록 및 판매
  • 📸 룩북: 사진 업로드를 통한 스타일 공유
  • 🎥 챌린지: 태그 + 영상 기반의 패션 챌린지 참여 기능
  • ⭐ 즐겨찾기(북마크): 관심 있는 상품 및 룩북을 저장하여 쉽게 다시 보기
  • 🔍 필터링: 스타일, 브랜드, 가격대 등의 조건으로 검색 가능


💻 개발 환경

카테고리 라이브러리 설명
프레임워크 Spring Boot (v3.2.1) Spring 기반 웹 애플리케이션 프레임워크
Spring Security 인증 및 권한 관리 라이브러리
데이터 처리 Spring Data JPA ORM(Object Relational Mapping) 데이터 처리 라이브러리
데이터베이스 MySQL 관계형 데이터베이스
MySQL Connector MySQL 데이터베이스 연동 드라이버
보안 JWT (io.jsonwebtoken) JSON Web Token 기반 인증 및 인가
Spring OAuth2 Client OAuth2 기반 소셜 로그인 및 인증 처리
유효성 검사 Spring Boot Validation 데이터 검증 라이브러리
유틸리티 Project Lombok 코드 간결화를 위한 애노테이션 라이브러리
Spring Cloud AWS AWS 서비스 연동을 위한 라이브러리
테스트 Spring Boot Test Spring 기반 테스트 프레임워크
Spring Security Test 보안 기능 테스트 지원 라이브러리


🚀 설계 방향

FITLOOP 백엔드는 Spring Boot & Spring Security 기반으로 구축되었으며, 보안과 유지보수성을 고려한 설계를 적용하였습니다.

🔐 인증 및 권한 관리

  • Spring Security & JWT 기반 인증 시스템 적용

    • 로그인 시 Access Token과 Refresh Token을 발급
    • Access Token을 헤더에 저장하여 요청 시 포함
    • 리프레시 토큰은 HttpOnly 쿠키 에 저장하여 보안 강화
    • DB에 리프레시 토큰을 저장하여 유효성 검증을 추가로 수행
    • 요청마다 JWT 필터를 통해 토큰 유효성 및 권한을 검증
  • 역할(Role) 기반 접근 제어

    • Spring Security의 SecurityConfig를 활용하여 API 접근 권한 관리
    • 사용자 역할(MEMBER, ADMIN)에 따라 접근 가능한 엔드포인트를 구분
    • 로그인 응답 시 사용자 권한 및 개인정보 입력 여부 를 반환하여 프론트엔드의 UI 렌더링을 지원
  • 안전한 로그아웃 처리

    • Spring Security 로그아웃 필터 구현
    • 로그아웃 시 DB에서 리프레시 토큰 삭제
    • 쿠키 만료 처리를 통해 클라이언트의 보안 유지

🏛️ 엔티티 설계 및 매핑

  • JPA를 활용한 엔티티 설계 및 단방향 매핑 적용
    • 유지보수성을 고려하여 단방향 매핑을 기본 원칙으로 설계
    • 필요할 경우 지연 로딩을 적용하여 성능 최적화

🚨 예외 처리

  • 커스텀 에러 코드 사용
    • 에러 유형을 명확히 정의하고, 일관된 JSON 형식으로 응답하여 프론트엔드의 오류 처리 용이성 향상

🧩 Kafka 적용

대량의 사용자 이벤트를 비동기적으로 처리하기 위해 Kafka를 도입하였습니다.

FITLOOP Kafka

  • 사용 목적: 좋아요 이벤트 처리, 향후 알림/조회수/활동 로그 처리 확장 대비

  • 적용 범위: Like 기능 전반 (이벤트 발행/소비)

  • Kafka 토픽 구성:

    • user-like-events: 유저가 좋아요한 상품 ID 기록용
    • product-like-events: 특정 상품의 좋아요 수 집계용
  • 설정 값:

    • 파티션: 3개 (병렬 처리)
    • 복제: 2개 (데이터 내구성 확보)

Kafka를 중심으로 Producer (서비스)TopicConsumer (Redis 반영)Spring BatchDB 저장까지의 구조를 구성함으로써, 확장성 · 내결함성 · 비동기성을 동시에 확보하였습니다.



코드 컨벤션

✅ Backend Convention

  • 변수, 메소드, 인스턴스를 작성할 때는 기본적으로 “Camel Case(카멜 케이스)”를 사용합니다.
  • 메소드명을 작성할 때는 동사 + 명사 형태로 구성합니다.
  • Class, Constructor를 작성할 때는 “Pascal Case(=upper 카멜 케이스)”를 사용합니다.
  • 약어는 가능하면 사용하지 않습니다.
  • Repository/Controller/Service 경우, (엔티티명) + Repository/Controller/Service 형태로 작명합니다.
  • DTO가 요청/응답 중 어떤 상황에서 어떤 역할에서 사용되는지를 반드시 나타내야 합니다. 기본적으로 매핑에 사용되는 DTO인 경우 (엔티티명) + Request/Response 형태로 작명합니다.
  • 클래스를 import 할 때는 반드시 와일드카드(*) 없이 모든 클래스명을 다 써야 합니다.
  • 클래스, 메소드, 인스턴스 변수의 제한자는 Java Lauguage Specification에서 명시한 아래의 순서를 준수합니다.
  • 조건/반복문의 실행문이 한 줄로 끝나도 중괄호를 사용합니다.
  • 빈 줄은 명령문 그룹의 영역을 표시하기 위하여 사용합니다.
  • 식별자와 여는 소괄호 ()사이에는 공백을 삽입하지 않습니다. 생성자와 메소드의 선언, 호출, 어노테이션 선언 뒤에 쓰이는 소괄호가 이에 해당합니다.



⚙️ ERD 설계

📚 API 명세 (Swagger 기반)

FITLOOP 프로젝트는 Swagger(OpenAPI 3.0)를 활용하여 REST API 명세를 자동화하였으며, SwaggerHub를 통해 팀원들과 API 문서를 공유하고 관리하고 있습니다.

🔗 API 문서 보기

  • SwaggerHub 문서 보기
  • 또는 fitloop-api.yaml 파일을 Postman 또는 Swagger Editor에서 불러와 사용 가능

🧪 테스트 방법

Swagger UI (로컬 테스트)

  • 주소: http://localhost:8080/swagger-ui/index.html
  • Try it out 버튼 클릭 후 실제 API 호출 가능 (JWT access 헤더 필요 시 수동 입력)

Postman 테스트

  1. fitloop-api.yaml 파일을 다운로드
  2. Postman → ImportFile → YAML 파일 선택
  3. 각 API 요청 실행 (access 헤더 등 필요 시 수동 입력)

📌 주요 API 목록

Method Endpoint 설명
POST /api/v1/register 회원가입
POST /api/v1/users/profile 사용자 프로필 등록
GET /api/v1/user 유저 정보 조회
POST /api/v1/products/register 상품 등록
GET /api/v1/products/{id} 상품 상세 조회
GET /api/v1/products/recent 최근 상품 목록 조회
POST /api/v1/cart/add 장바구니 담기
GET /api/v1/cart 장바구니 조회
DELETE /api/v1/cart/remove 장바구니 항목 삭제
DELETE /api/v1/cart/clear 장바구니 전체 비우기
POST /api/v1/reissue JWT 토큰 재발급
GET /api/v1/auth/{provider} 소셜 로그인 (Google 등)
GET /health-check 서버 상태 확인

🧾 요청 예시

회원가입

{
  "username": "testuser",
  "password": "P@ssw0rd!",
  "name": "홍길동",
  "birthday": "1995-05-15",
  "email": "test@example.com"
} 



🗓️ FITLOOP 프로젝트 개발 히스토리

본 프로젝트는 애자일 방법론 중 하나인 스크럼(Scrum)을 적용하여 짧은 주기로 기능을 개발하고,
지속적인 논의와 피드백을 통해 점진적으로 완성도를 높이는 방식으로 진행하였습니다.

📅 2024년 12월 개발 히스토리 보기
날짜 작업 내용
12.20 프로젝트 구조 설계 시작, 기능 구상
12.21 프로젝트 기능 기획
12.23 프로젝트 상세 기능 기획
12.24 프로젝트명 확정(FitLoop), 컨벤션 논의
12.26 ERD 논의 시작
12.27 로고 제작, 테이블 구성 논의
12.28 이미지 정책, 구독 서비스, Enum 논의
12.29 상태 이력 테이블 필요성 검토
12.30 ERD 구현 및 관계 설정, 배송지 테이블 추가
12.31 구독형 서비스 논의
📅 2024년 1월 개발 히스토리 보기
날짜 작업 내용
01.02 개발 일정 수립, JWT/SSR/Middleware 정리
01.03 Gradle 설정, 예외 처리 설계
01.04 로고 및 GitHub 라벨 확정
01.05 이슈/PR 템플릿 작성, AWS 및 쿠버네티스 학습
01.06 Ant Design 학습, 피그마 초안
01.07 인증/인가 구조, HttpOnly 쿠키 정리
01.08 JWT와 SSR/CSR 개념 비교
01.09 ESLint 대응, 이미지 최적화 논의
01.10 리프레시 토큰 구조, 삭제 처리 논의
01.11 JWT 로그인 로직 구성, 토큰 저장 전략 수립, 캐시(redis) 대해 논의
01.12 회원 상태(status), @Transactional 처리 논의
01.13 테이블 통합 vs 분리 → 분리 설계 선택
01.14 JWT 기반 코드 구현 시작
01.15 Axios 도입, JSON 전송 방식 결정
01.16 API 명세서 및 버튼 UI 기획
01.17 계정 정보 페이지 개발
01.19 시스템 기능 구현 내용 정리
01.20 공통 에러 코드 및 전역 예외 처리 구성
01.21 사용자 정의 예외 클래스 정리
01.22 Spring Security 필터 설정 논의
01.23 CORS 설정 및 토큰 로직 정리
01.24 RefreshToken 로직 개발 시작
01.25 프론트 상태 관리, 진행률 UI 구성
01.26 회원가입 유효성 검사 추가
01.27 사용자 정의 에러 반환 방식 정리
📅 2024년 2월 개발 히스토리 보기
날짜 작업 내용
02.14 Enum/Boolean 필드 설계, 생일 예외 처리 개선
02.21 로그인 후 개인정보 입력 여부 분기 설계
02.23 JWT 필터 permitAll 이슈 해결 방식 논의
02.24 마이페이지 설계, 로그아웃 필터 개발
02.25 로그아웃 필터 완성, 마이페이지 UI 구성
02.26 상품 도메인 기획 및 등록/목록 페이지 분배
02.28 공통 색상 시스템 구축, 광고 이미지 연동 설계
📅 2024년 3월 개발 히스토리 보기
날짜 작업 내용
03.03 Tailwind 및 스크롤바 스타일 개선
03.04 카테고리 UI 및 페이지 이동 로직 구현, AWS 진행
03.08 상품 등록 시 카테고리 선택 UI 논의
03.11 UserDetails ID 이슈 해결, 개인정보 입력 UI 보완
03.12 S3 광고 이미지 연동 컨트롤러 설계, 마이페이지 구성
03.13 URL 명칭 통일, 회원가입 UX 개선, 사용자 통계 테이블 설계
03.14 상품 등록 URL 정의, 사용자 통계 테이블 설계 및 ERD 수정, 수정/삭제 버튼 피그마 반영 논의
03.24 카테고리 태그 설정 방식 정리, 최근 본 상품 Redis 저장 구조 논의, 제품 조건 enum 지정
03.25 personalInfo undefined 이슈 해결, 쿠키 vs localStorage 비교, 이미지 업로드 구조 및 작업 분배
03.26 상품 조건 관리 방식 정리, 빈 값 처리 로직 정의, 좋아요 기능 책임 분리 및 트리거 논의
03.28 SSR 대응을 위한 Next.js fetch 패턴 정리, 썸네일 처리 방식 통일, mypage API URL 통합
03.29 카테고리 및 상품 상태 관리 방식 정리, 무한스크롤 UX 보완, redis 최근 본 상품 길이 제한
📅 2024년 4월 개발 히스토리 보기
날짜 작업 내용
04.01 메인페이지 탭별 API 연동 방식 정리, useEffect 초기 요청 흐름 점검
04.06 마이페이지 설계, 개인정보 수정 구조 재설계, 최근 본 상품 로직 연결 방식 정리
04.21 카테고리 및 정렬 모달 toggle 방식 논의, 선택 필터 유지 방식 정리
04.22 필터 API 연동 방식 정리, 상품 정렬 상태 유지 로직 정의
04.23 정렬 및 필터 클릭 구조 설계, UI 리팩토링 방향 논의
04.27 썸네일 리팩토링, 드래그 스크롤 버그 수정, 최근 본 상품 뷰 개선
04.29 인기상품 가로 스크롤 구조 설계, 드래그 중 클릭 방지 처리 논의
04.30 메인페이지 통합 스크롤 컨테이너 구조 적용, 상태 업데이트 흐름 점검
📅 2024년 5월 개발 히스토리 보기
날짜 작업 내용
05.01 인기상품 가로 스크롤 드래그 최적화 및 클릭 구분 처리
05.05 상품 상세페이지 요구사항 반영, 텍스트 설명 toggle 구조 설계
05.06 중고 상품 상태 안내 toggle 정리, 탄소 절감 정보 toggle 로직 구현
05.09 좋아요 실시간 반영 구조 설계, Redis 연동 구조 확인
05.10 좋아요 상태 값 Zustand 관리 전환, 실시간 값 반영 방식 논의
05.11 Zustand로 like 상태 연동, Redis 반영 로직 점검
05.12 Redis에 좋아요 상태 저장 방식 정의, Kafka 이벤트 발행 구조 설계
05.13 Kafka 도입에 따른 Like 흐름 정리, 비동기 반영 방식 논의
05.14 배치 도입 방향 논의, Partition 및 Consumer 그룹 분리 설계
05.15 Spring Batch 적용 구조 정리, Kafka 이벤트 별 Topic 분리 논의
05.22 draw.io 흐름도 스타일 조정, 사용자 중심 화살표 흐름 반영
05.23 좋아요 누른 뒤 상태 유지 전략 점검, revalidate 방식 적용
05.24 ProductCard 드래그 클릭 구분 최적화, MainPage 인터랙션 정리
05.25 Kafka 이벤트 처리 흐름 정리, Redis 상태 캐싱 구조 확정
05.26 Spring Batch로 Redis 데이터를 DB에 주기적 반영 구조 완료
05.28 마이페이지 최근 본 상품 데이터 구조 정리, SSR 대응 상태 관리
📅 2024년 6월 개발 히스토리 보기
날짜 작업 내용
06.04 MainPage lazyload 적용, Kakao Map 초기화 방식 변경 논의
06.05 Banner carousel 연결 구조 개선, 인기상품 목록 흐름 정리
06.16 Kafka 파티션 구조 검토, Redis key 구조 통일 논의
06.17 좋아요 흐름 도식화 및 Redis-Kafka-DB 전이 구조 정리
06.22 회의록 문서 통합 및 히스토리 관리 기준 확정

About

중고 의류를 거래하고, 나누며, 창의적 활동을 통해 지속 가능한 패션을 실현하는 플랫폼입니다

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 3

  •  
  •  
  •  

Languages