기술 스택 및 선정 이유 - KimGyuBek/Threadly GitHub Wiki
- Java 17:
- Spring Boot 3.3.x:
- Spring Cloud 2023.x:
- Gradle:
- Spring Actuator:
- Prometheus + Grafana:
- PostgreSQL:
- MongoDB:
- Spring Data JPA, Spring Data MongoDB:
- Flyway:
- H2:
- Redis:
- Apache Kafka:
- Spring Cloud Stream:
- Spring WebSocket:
- Spring Batch:
- Spring Security:
- JUnit5, Mockito, AssertJ:
- Spring Mail:
| 기술 | 버전 | 선정 이유 |
|---|---|---|
| Java | 17 | - LTS 버전으로 안정성과 장기 지원 보장 - Record, Sealed Class, Pattern Matching 등 최신 언어 기능 활용 - 엔터프라이즈 환경에서 검증된 성능과 생태계 |
| Spring Boot | 3.3.3 | - Auto-configuration을 통한 빠른 개발 환경 구축 - Spring 6 기반으로 최신 기능 활용 - Spring Cloud와의 완벽한 호환성 |
| Spring Cloud | 2023.0.3 | - MSA 환경에서 필요한 다양한 기능 제공 - Kafka 통합을 위한 Spring Cloud Stream 활용 |
| Gradle | Kotlin DSL | - 타입 안정성과 IDE 지원 - 멀티 모듈 프로젝트 관리 용이 - 빌드 스크립트 가독성 향상 |
| 기술 | 선정 이유 |
|---|---|
| 헥사고날 아키텍처 | - 비즈니스 로직과 인프라 관심사의 완벽한 분리 - Port/Adapter 패턴으로 외부 의존성 교체 용이 - 테스트 용이성 향상 (Core 계층 단위 테스트 독립 실행) - 도메인 중심 설계로 비즈니스 로직 집중 가능 |
| MSA | - 서비스별 독립 배포 및 확장 가능 - 알림 기능을 별도 서비스로 분리하여 책임 분산 - 장애 격리 (한 서비스 장애가 전체 시스템에 영향 최소화) |
| 기술 | 선정 이유 |
|---|---|
| Spring Actuator | - 애플리케이션 상태 모니터링 - Health check, Metrics 엔드포인트 제공 |
| Prometheus | - 시계열 데이터 수집 및 저장 - Grafana와 연동하여 시각화 - Kubernetes 환경과의 우수한 통합성 |
| 기술 | 버전 | 선정 이유 |
|---|---|---|
| SpringDoc OpenAPI | threadly: 2.2.0 notification: 2.6.0 |
- Swagger UI를 통한 대화형 API 문서 제공 - Spring Boot 3.x와의 완벽한 호환 - 자동 문서 생성으로 개발 생산성 향상 |
| 기술 | 버전 | 선정 이유 |
|---|---|---|
| JUnit | 5.10.2 | - Java 표준 테스트 프레임워크 - Parameterized Test, Nested Test 등 풍부한 기능 |
| Mockito | 5.1.1 | - Mock 객체 생성 및 검증 - Spring과의 우수한 통합성 |
| AssertJ | 3.25.1 | - 유창한 인터페이스로 가독성 높은 테스트 코드 작성 - 풍부한 assertion 메서드 제공 |
| Fixture Monkey | 0.4.12 | - 테스트 픽스처 자동 생성 - 반복적인 테스트 데이터 생성 코드 감소 |
| H2 Database | - | - 인메모리 DB로 빠른 테스트 실행 - JPA 테스트 환경 구축 용이 |
| 기술 | 버전 | 선정 이유 |
|---|---|---|
| Lombok | 8.6 (plugin) | - 보일러플레이트 코드 감소 - @Builder, @Data 등으로 생산성 향상 |
| MapStruct | 1.5.3.Final | - 컴파일 타임 매퍼 생성으로 안전성 확보 - Entity ↔ Domain 변환 자동화 |
| Guava | 31.1-jre | - Google의 검증된 유틸리티 라이브러리 - 컬렉션, 캐싱, 동시성 유틸 제공 |
| Apache Commons Lang | 3.12.0 | - String, Date 등 유틸리티 메서드 제공 |
| Apache Commons Collections | 4.4 | - 확장된 컬렉션 자료구조 제공 |
| Jackson | 2.17.1+ | - JSON 직렬화/역직렬화 - Spring과의 기본 통합 |
| 기술 | 선정 이유 |
|---|---|
| PostgreSQL | - ACID 보장으로 트랜잭션 안정성 확보 - 사용자, 게시물, 팔로우 등 관계형 데이터 모델에 적합 - 풍부한 인덱싱 및 쿼리 최적화 기능 - JSON 타입 지원으로 유연한 데이터 저장 가능 |
| Spring Data JPA | - ORM을 통한 객체 지향적 데이터 접근 - 엔티티 기반 데이터 모델링 - 복잡한 쿼리 작성 편의성 |
| Flyway | 11.5.0 |
| 기술 | 선정 이유 |
|---|---|
| Redis | - 인메모리 저장소로 빠른 응답 속도 - 세션 저장소로 활용 - 조회가 빈번한 데이터 캐싱 (사용자 정보, 게시물 등) - TTL 기반 자동 만료 관리 |
| 기술 | 선정 이유 |
|---|---|
| Apache Kafka | - 이벤트 기반 아키텍처 구현 - 서비스 간 느슨한 결합 (threadly-service → notification-service) - 메시지 순서 보장 및 재처리 가능 - 높은 처리량과 확장성 |
| Spring Cloud Stream | - Kafka와의 추상화된 통합 - 선언적 메시지 처리 (@StreamListener 등) - Binder를 통한 메시징 시스템 교체 용이 |
| 기술 | 선정 이유 |
|---|---|
| Object Storage | - 이미지/비디오 등 대용량 파일 저장 - CDN 연동으로 빠른 콘텐츠 전송 - 스토리지 비용 효율성 |
| 기술 | 선정 이유 |
|---|---|
| Spring Batch | - 대량 데이터 처리 작업 (통계, 정산 등) - Chunk 기반 처리로 메모리 효율성 - Job Restart, Skip, Retry 등 장애 처리 기능 - 트랜잭션 관리 자동화 |
| CSV 처리 | Apache Commons CSV 1.10.0 |
| Logstash Encoder | 7.4 |
| Prometheus Pushgateway | 0.16.0 |
| 기술 | 선정 이유 |
|---|---|
| Spring Security | - 인증/인가 처리 - 보안 필터 체인 자동 구성 - CSRF, CORS 등 보안 공격 방어 |
| OAuth2 Client | - 소셜 로그인 구현 (Google, Kakao 등) - 표준화된 인증 프로토콜 - 사용자 편의성 향상 |
| JWT | 0.11.5 (jjwt) |
| 기술 | 선정 이유 |
|---|---|
| MongoDB | - 알림 데이터는 관계보다 문서 구조가 적합 - 스키마 유연성 (다양한 알림 타입 대응) - 수평 확장 용이 (샤딩) - 읽기 성능 우수 (알림 조회 빈도 높음) - JSON 형태로 복잡한 알림 페이로드 저장 가능 |
| Spring Data MongoDB | - MongoDB와의 통합 - Repository 패턴으로 일관된 데이터 접근 - Reactive 지원으로 비동기 처리 가능 |
| 기술 | 선정 이유 |
|---|---|
| Redis | - 읽지 않은 알림 카운트 캐싱 - 실시간 알림 구독자 정보 저장 - WebSocket 세션 관리 |
| 기술 | 선정 이유 |
|---|---|
| WebSocket | - 서버 → 클라이언트 실시간 알림 푸시 - 양방향 통신 지원 - HTTP보다 낮은 오버헤드 - 모바일/웹 클라이언트 모두 지원 |
| Spring WebSocket | - STOMP 프로토콜 지원 - 메시지 브로커 패턴 구현 - SockJS 폴백으로 브라우저 호환성 확보 |
| 기술 | 선정 이유 |
|---|---|
| Spring Mail | - SMTP 기반 이메일 전송 - 비밀번호 찾기, 가입 인증 등에 활용 - 템플릿 기반 이메일 작성 지원 |
| SMTP | Naver SMTP (smtp.naver.com:587) |
| 기술 | 선정 이유 |
|---|---|
| Apache Kafka | - threadly-service로부터 알림 이벤트 수신 - 이벤트 소싱 패턴 구현 - 메시지 유실 방지 (at-least-once delivery) |
| Spring Cloud Stream | - Kafka Consumer 구현 간소화 - 함수형 프로그래밍 스타일 지원 |
| 기술 | 선정 이유 |
|---|---|
| Spring Security | - REST API 보안 - WebSocket Handshake 인증 |
| JWT | - WebSocket 연결 시 JWT 기반 인증 - threadly-service와 동일한 토큰 검증 로직 공유 |
- 비즈니스 로직 보호: 외부 인프라 변경이 도메인 로직에 영향을 주지 않음
- 테스트 용이성: Core 계층만 독립적으로 단위 테스트 가능
- 확장성: Adapter만 교체하여 새로운 기술 스택 적용 용이
- 명확한 책임 분리: App(진입점) - Core(비즈니스) - Adapter(인프라)
- threadly-service: PostgreSQL (관계형 데이터, ACID 보장 필요)
- notification-service: MongoDB (문서형 데이터, 유연한 스키마, 읽기 성능 중시)
각 서비스의 도메인 특성에 최적화된 데이터베이스를 선택하여 성능과 확장성을 확보했습니다.
- 알림 서비스를 독립 서비스로 분리하여 부하 분산
- Kafka를 통한 비동기 통신으로 서비스 간 느슨한 결합 유지
- 각 서비스별 독립 배포 및 확장 가능