기술 스택 및 선정 이유 - 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 환경과의 우수한 통합성

API 문서화

기술 버전 선정 이유
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과의 기본 통합

Threadly-Service 기술 스택

데이터베이스

기술 선정 이유
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)

Notification-Service 기술 스택

데이터베이스

기술 선정 이유
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와 동일한 토큰 검증 로직 공유

아키텍처 선정 이유 종합

헥사고날 아키텍처 채택

  1. 비즈니스 로직 보호: 외부 인프라 변경이 도메인 로직에 영향을 주지 않음
  2. 테스트 용이성: Core 계층만 독립적으로 단위 테스트 가능
  3. 확장성: Adapter만 교체하여 새로운 기술 스택 적용 용이
  4. 명확한 책임 분리: App(진입점) - Core(비즈니스) - Adapter(인프라)

DB 분리 전략

  • threadly-service: PostgreSQL (관계형 데이터, ACID 보장 필요)
  • notification-service: MongoDB (문서형 데이터, 유연한 스키마, 읽기 성능 중시)

각 서비스의 도메인 특성에 최적화된 데이터베이스를 선택하여 성능과 확장성을 확보했습니다.

MSA 패턴

  • 알림 서비스를 독립 서비스로 분리하여 부하 분산
  • Kafka를 통한 비동기 통신으로 서비스 간 느슨한 결합 유지
  • 각 서비스별 독립 배포 및 확장 가능

참고 문서

⚠️ **GitHub.com Fallback** ⚠️