|
1 | 1 | # Gridgestagram |
2 | | - |
3 | | -Instagram 클론 프로젝트 - Spring Boot 기반의 소셜 미디어 플랫폼 |
4 | | - |
5 | | -## 프로젝트 개요 |
6 | | - |
| 2 | +- Spring Boot 기반의 소셜 미디어 플랫폼 |
7 | 3 | - **프로젝트명**: gridgestagram |
8 | 4 | - **Java 버전**: 17 |
9 | 5 | - **Spring Boot 버전**: 3.5.5 |
10 | 6 | - **빌드 도구**: Gradle |
11 | 7 |
|
12 | | -## 기술 스택 |
13 | | - |
14 | | -| 카테고리 | 기술 | 설명 | 선택 이유 | |
15 | | -|---------|------|------|------------------------------------------------------------------------------------| |
16 | | -| **프레임워크** | Spring Boot 3.5.5 | 메인 애플리케이션 프레임워크 | 소셜 미디어의 복잡한 비즈니스 로직과 다양한 API 엔드포인트를 효율적으로 관리하며, 자동 설정과 내장 서버로 빠른 개발과 배포가 가능 | |
17 | | -| **보안** | Spring Security | 인증/인가 관리 | 사용자 계정, 개인정보, 콘텐츠 보호가 핵심인 소셜 플랫폼에서 OAuth2, JWT 토큰 인증, 역할 기반 권한 관리를 통합적으로 제공 | |
18 | | -| **데이터베이스** | MySQL | 메인 데이터베이스 | 사용자, 피드, 팔로우 관계 등 복잡한 관계형 데이터 구조를 안정적으로 처리하며, 트랜잭션 일관성과 ACID 속성을 보장하여 데이터 무결성 확보 | |
19 | | -| **ORM** | Spring Data JPA | 객체-관계 매핑 | 복잡한 엔티티 관계(User-Feed-Subscription 등)를 객체 지향적으로 관리하고, 반복적인 CRUD 작업을 자동화하여 개발 생산성 향상 | |
20 | | -| **쿼리** | QueryDSL | 타입 안전한 쿼리 작성 | 피드 검색, 사용자 필터링, 구독 이력 조회 등 복잡한 동적 쿼리를 컴파일 시점에 검증하여 런타임 오류를 방지하고 유지보수성 향상 | |
21 | | -| **인증** | JWT | 토큰 기반 인증 시스템 | Stateless 인증을 지원하며, 확장성이 뛰어나고 서버 부하를 줄이면서 사용자 세션을 안전하게 관리 | |
22 | | -| **캐싱** | Redis | 캐싱 및 세션 관리 | 피드 좋아요 데이터를 메모리에 캐싱하여 응답 속도를 개선하고, 데이터베이스 부하를 줄여 처리 능력 향상 | |
23 | | -| **파일 저장소** | AWS S3 | 이미지/동영상 파일 저장 | Instagram과 같은 미디어 중심 플랫폼에서 대용량 이미지/동영상 파일을 안정적으로 저장 가능 | |
24 | | -| **설정 관리** | AWS Parameter Store | 환경별 설정 관리 | 개발/스테이징/프로덕션 환경별 데이터베이스 연결 정보, API 키 등 민감한 설정을 안전하게 중앙 관리하고 암호화된 상태로 저장 | |
25 | | -| **컨테이너** | Docker | 애플리케이션 컨테이너화 | 개발 환경과 프로덕션 환경의 일관성을 보장하고, 마이크로서비스 아키텍처로의 확장과 CI/CD 파이프라인 구축을 위한 기반 제공 | |
26 | | -| **API 문서** | Swagger | REST API 문서화 | 프론트엔드 팀과의 협업 효율성을 높이고, API 명세를 자동으로 생성하여 개발 속도를 향상시키며 API 테스트 환경 제공 | |
27 | | -| **코드 생성** | Lombok | 보일러플레이트 코드 자동 생성 | Entity, DTO 클래스의 getter/setter, builder 패턴 등 반복적인 코드를 자동 생성하여 코드 가독성을 높이고 개발 시간 단축 | |
28 | | -| **빌드 도구** | Gradle | 의존성 관리 및 빌드 | Maven보다 빠른 빌드 속도와 유연한 설정을 제공하며, 멀티 모듈 프로젝트 관리와 다양한 플러그인을 통한 확장성 제공 | |
29 | | -| **언어** | Java 17 | 프로그래밍 언어 | LTS 버전으로 안정성을 보장 | |
| 8 | +# 기술 스택 & 아키텍처 |
| 9 | + |
| 10 | +## 핵심 기술 스택 |
| 11 | + |
| 12 | +### **백엔드 프레임워크** |
| 13 | +- **Java 17** - LTS 버전으로 안정성과 보안 업데이트 보장 |
| 14 | +- **Spring Boot 3.5.5** - 자동 설정과 내장 서버로 복잡한 소셜 미디어 비즈니스 로직을 빠르게 구현 |
| 15 | +- **Spring Security** - 사용자 인증부터 콘텐츠 권한 관리까지 소셜 플랫폼 보안 요구사항을 통합 지원 |
| 16 | +- **Spring Data JPA** - 사용자-피드-구독 간 복잡한 엔티티 관계를 객체 지향적으로 관리 |
| 17 | + |
| 18 | +### **데이터베이스 & 저장소** |
| 19 | +- **MySQL** - 사용자 관계와 피드 데이터의 복잡한 관계형 구조를 ACID 보장하며 안정적으로 처리 |
| 20 | +- **Redis** - 좋아요 카운트와 리프레시 토큰을 메모리에서 고속 처리하여 사용자 경험 향상 |
| 21 | +- **AWS S3** - 인스타그램 스타일의 대용량 미디어 파일을 무제한 확장 가능하게 저장 |
| 22 | + |
| 23 | +### **개발 도구 & 라이브러리** |
| 24 | +- **QueryDSL** - 피드 검색과 사용자 필터링 등 복잡한 동적 쿼리를 컴파일 시점에 검증 |
| 25 | +- **JWT** - 확장성을 위한 무상태 인증으로 서버 부하 최소화 |
| 26 | +- **Lombok** - 엔티티와 DTO의 반복적인 getter/setter 코드를 자동 생성하여 개발 속도 향상 |
| 27 | +- **Gradle** - Maven 대비 빠른 빌드와 멀티 모듈 프로젝트 관리의 유연성 제공 |
| 28 | + |
| 29 | +### **운영 & 배포** |
| 30 | +- **Docker** - 개발/프로덕션 환경 일관성 보장과 마이크로서비스 확장 기반 마련 |
| 31 | +- **AWS Parameter Store** - 데이터베이스 연결 정보와 API 키를 암호화하여 중앙 집중 관리 |
| 32 | +- **Swagger** - 프론트엔드 팀과의 협업 효율성을 위한 실시간 API 명세 및 테스트 환경 제공 |
| 33 | + |
| 34 | +--- |
30 | 35 |
|
31 | 36 | ## 프로젝트 구조 |
32 | 37 |
|
33 | 38 | ``` |
34 | 39 | src/main/java/org/example/gridgestagram/ |
35 | | -├── GridgestagramApplication.java # 메인 애플리케이션 클래스 |
36 | | -├── annotation/ # 커스텀 어노테이션 |
37 | | -│ ├── LogAction.java # 로그 액션 어노테이션 |
38 | | -│ └── LoggingAspect.java # AOP 로깅 관점 |
39 | | -├── config/ # 설정 클래스들 |
40 | | -│ ├── AsyncConfig.java # 비동기 처리 설정 |
41 | | -│ ├── CacheConfig.java # 캐시 설정 |
42 | | -│ ├── CorsConfig.java # CORS 설정 |
43 | | -│ ├── JacksonDateTimeConfig.java # 날짜/시간 직렬화 설정 |
44 | | -│ ├── PasswordEncoderConfig.java # 비밀번호 암호화 설정 |
45 | | -│ ├── QuerydslConfig.java # QueryDSL 설정 |
46 | | -│ ├── RedisConfig.java # Redis 설정 |
47 | | -│ ├── S3Config.java # AWS S3 설정 |
48 | | -│ ├── SchedulingConfig.java # 스케줄링 설정 |
49 | | -│ ├── SecurityConfig.java # Spring Security 설정 |
50 | | -│ ├── SwaggerConfig.java # API 문서화 설정 |
51 | | -│ └── WebConfig.java # 웹 관련 설정 |
52 | | -├── controller/ # REST API 컨트롤러 |
53 | | -│ ├── admin/ # 관리자 기능 |
54 | | -│ ├── auth/ # 인증 관련 |
55 | | -│ ├── feed/ # 피드 관련 |
56 | | -│ ├── file/ # 파일 관련 |
57 | | -│ ├── subscription/ # 구독 관련 |
58 | | -│ └── user/ # 사용자 관련 |
59 | | -├── data/ # 데이터 관련 클래스 |
60 | | -├── exceptions/ # 커스텀 예외 클래스 |
61 | | -├── repository/ # 데이터 접근 계층 |
62 | | -│ ├── feed/ # 피드 리포지토리 |
63 | | -│ ├── files/ # 파일 리포지토리 |
64 | | -│ ├── log/ # 로그 리포지토리 |
65 | | -│ ├── payment/ # 결제 리포지토리 |
66 | | -│ ├── refreshToken/ # 리프레시 토큰 리포지토리 |
67 | | -│ ├── subscription/ # 구독 리포지토리 |
68 | | -│ ├── term/ # 약관 리포지토리 |
69 | | -│ └── user/ # 사용자 리포지토리 |
70 | | -├── security/ # 보안 관련 클래스 |
71 | | -├── service/ # 비즈니스 로직 계층 |
72 | | -│ ├── domain/ # 도메인 서비스 |
73 | | -│ └── facade/ # 파사드 패턴 서비스 |
74 | | -└── utils/ # 유틸리티 클래스 |
| 40 | +├── 📄 GridgestagramApplication.java # 애플리케이션 진입점 |
| 41 | +│ |
| 42 | +├── 🏷️ annotation/ # 커스텀 어노테이션 |
| 43 | +│ ├── LogAction.java # 로그 액션 마킹 |
| 44 | +│ └── LoggingAspect.java # AOP 로깅 구현 |
| 45 | +│ |
| 46 | +├── ⚙️ config/ # 시스템 설정 |
| 47 | +│ ├── AsyncConfig.java # 비동기 처리 |
| 48 | +│ ├── CacheConfig.java # 캐시 전략 |
| 49 | +│ ├── SecurityConfig.java # 보안 정책 |
| 50 | +│ ├── RedisConfig.java # Redis 연결 |
| 51 | +│ ├── S3Config.java # AWS S3 설정 |
| 52 | +│ └── SwaggerConfig.java # API 문서화 |
| 53 | +│ |
| 54 | +├── 🌐 controller/ # REST API 엔드포인트 |
| 55 | +│ ├── auth/ # 로그인, 회원가입 |
| 56 | +│ ├── user/ # 사용자 프로필 관리 |
| 57 | +│ ├── feed/ # 피드 CRUD 및 좋아요 |
| 58 | +│ ├── subscription/ # 구독 관리 |
| 59 | +│ ├── file/ # 파일 업로드/다운로드 |
| 60 | +│ └── admin/ # 관리자 기능 |
| 61 | +│ |
| 62 | +├── 🗃️ repository/ # 데이터 액세스 계층 |
| 63 | +│ ├── user/ # 사용자 데이터 |
| 64 | +│ ├── feed/ # 피드 데이터 |
| 65 | +│ ├── subscription/ # 구독 관계 |
| 66 | +│ ├── files/ # 파일 메타데이터 |
| 67 | +│ └── log/ # 시스템 로그 |
| 68 | +│ |
| 69 | +├── 🔧 service/ # 비즈니스 로직 |
| 70 | +│ ├── domain/ # 핵심 도메인 서비스 |
| 71 | +│ └── facade/ # 복합 서비스 조합 |
| 72 | +│ |
| 73 | +├── 🔐 security/ # 보안 구현체 |
| 74 | +├── ❌ exceptions/ # 예외 처리 |
| 75 | +├── 📊 data/ # 데이터 전송 객체 |
| 76 | +└── 🛠️ utils/ # 공통 유틸리티 |
75 | 77 | ``` |
76 | | -## erd |
| 78 | + |
| 79 | +--- |
| 80 | + |
| 81 | +## 아키텍처 패턴 & 설계 철학 |
| 82 | + |
| 83 | +### **도메인 중심 설계 (DDD)** |
| 84 | +비즈니스 도메인을 중심으로 코드를 구성하여 복잡한 소셜 미디어 로직을 직관적으로 이해할 수 있도록 설계했습니다. 사용자, 피드 등 각 도메인이 명확히 분리되어 유지보수와 확장이 용이합니다. |
| 85 | + |
| 86 | +### **헥사고날 아키텍처 (Ports & Adapters)** |
| 87 | +비즈니스 로직을 외부 의존성(데이터베이스, 외부 API)으로부터 완전히 분리했습니다. 이를 통해 데이터베이스나 파일 저장소를 변경하더라도 핵심 비즈니스 로직은 영향받지 않아 테스트와 확장성이 크게 향상됩니다. |
| 88 | + |
| 89 | +### **파사드 패턴 (Facade Pattern)** |
| 90 | +여러 도메인 서비스를 조합하는 복잡한 비즈니스 플로우를 파사드로 단순화했습니다. 예를 들어, 피드 생성 시 이미지 업로드, 메타데이터 저장, 알림 발송 등의 과정을 하나의 파사드로 통합하여 클라이언트가 쉽게 사용할 수 있도록 구성했습니다. |
| 91 | + |
| 92 | +### **관리자 기능** |
| 93 | +소셜 플랫폼 운영에 필수적인 관리자 기능을 체계적으로 구현했습니다: |
| 94 | + |
| 95 | +- 사용자 관리: 회원 정보 조회, 계정 상태 관리, 신고 처리 |
| 96 | +- 콘텐츠 모니터링: 부적절한 피드 검토 및 제재, 대량 콘텐츠 관리 |
| 97 | +- 시스템 모니터링: 서비스 상태 확인, 로그 분석, 성능 지표 추적 |
| 98 | +- 권한 분리: 관리자, 유저 역할을 명확히 구분하여 보안성과 운영 효율성 확보 |
| 99 | + |
| 100 | +### **성능 중심 캐싱 전략** |
| 101 | +소셜 미디어의 특성상 좋아요와 인증 토큰은 매우 빈번하게 접근됩니다: |
| 102 | +- **좋아요 캐싱**: 실시간 카운트 업데이트를 위해 Redis에서 고속 처리 |
| 103 | +- **리프레시 토큰 관리**: 사용자 세션의 빠른 검증과 갱신을 위해 메모리 기반 저장 |
| 104 | + |
| 105 | +### **확장성과 보안의 균형** |
| 106 | +- **무상태 JWT 인증**: 서버 확장 시 세션 동기화 부담 없이 수평 확장 가능 |
| 107 | + |
| 108 | +--- |
| 109 | + |
| 110 | + |
| 111 | +## ERD |
77 | 112 | <img width="4020" height="1682" alt="gridge-test (2)" src="https://github.com/user-attachments/assets/e51d54ef-cb8e-4ee0-add6-b8028e54334b" /> |
78 | 113 |
|
79 | | -## system archictecture |
| 114 | +## System Architecture |
80 | 115 | <img width="1140" height="641" alt="gridgestagram architecture drawio (4)" src="https://github.com/user-attachments/assets/d5264490-0877-4982-be92-85e05d5a9d74" /> |
81 | 116 |
|
82 | 117 |
|
|
0 commit comments