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를 도입하였습니다.
-
사용 목적: 좋아요 이벤트 처리, 향후 알림/조회수/활동 로그 처리 확장 대비
-
적용 범위: Like 기능 전반 (이벤트 발행/소비)
-
Kafka 토픽 구성:
user-like-events: 유저가 좋아요한 상품 ID 기록용product-like-events: 특정 상품의 좋아요 수 집계용
-
설정 값:
- 파티션: 3개 (병렬 처리)
- 복제: 2개 (데이터 내구성 확보)
Kafka를 중심으로 Producer (서비스) → Topic → Consumer (Redis 반영) → Spring Batch → DB 저장까지의 구조를 구성함으로써, 확장성 · 내결함성 · 비동기성을 동시에 확보하였습니다.
- 변수, 메소드, 인스턴스를 작성할 때는 기본적으로 “Camel Case(카멜 케이스)”를 사용합니다.
- 메소드명을 작성할 때는 동사 + 명사 형태로 구성합니다.
- Class, Constructor를 작성할 때는 “Pascal Case(=upper 카멜 케이스)”를 사용합니다.
- 약어는 가능하면 사용하지 않습니다.
- Repository/Controller/Service 경우, (엔티티명) + Repository/Controller/Service 형태로 작명합니다.
- DTO가 요청/응답 중 어떤 상황에서 어떤 역할에서 사용되는지를 반드시 나타내야 합니다. 기본적으로 매핑에 사용되는 DTO인 경우 (엔티티명) + Request/Response 형태로 작명합니다.
- 클래스를 import 할 때는 반드시 와일드카드(*) 없이 모든 클래스명을 다 써야 합니다.
- 클래스, 메소드, 인스턴스 변수의 제한자는 Java Lauguage Specification에서 명시한 아래의 순서를 준수합니다.
- 조건/반복문의 실행문이 한 줄로 끝나도 중괄호를 사용합니다.
- 빈 줄은 명령문 그룹의 영역을 표시하기 위하여 사용합니다.
- 식별자와 여는 소괄호 ()사이에는 공백을 삽입하지 않습니다. 생성자와 메소드의 선언, 호출, 어노테이션 선언 뒤에 쓰이는 소괄호가 이에 해당합니다.
FITLOOP 프로젝트는 Swagger(OpenAPI 3.0)를 활용하여 REST API 명세를 자동화하였으며, SwaggerHub를 통해 팀원들과 API 문서를 공유하고 관리하고 있습니다.
- SwaggerHub 문서 보기
- 또는
fitloop-api.yaml파일을 Postman 또는 Swagger Editor에서 불러와 사용 가능
- 주소:
http://localhost:8080/swagger-ui/index.html Try it out버튼 클릭 후 실제 API 호출 가능 (JWT access 헤더 필요 시 수동 입력)
fitloop-api.yaml파일을 다운로드- Postman →
Import→File→ YAML 파일 선택 - 각 API 요청 실행 (
access헤더 등 필요 시 수동 입력)
| 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"
} 본 프로젝트는 애자일 방법론 중 하나인 스크럼(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 | 회의록 문서 통합 및 히스토리 관리 기준 확정 |

