Do You Coding?

[회고] SSAFY 2학기 공통 프로젝트 회고 본문

Project/Retrospect

[회고] SSAFY 2학기 공통 프로젝트 회고

1. 프로젝트 개요

프로젝트명 : SSABREE TIME (싸브리 타임)

서비스 개요 : SSAFY (삼성 청년 소프트웨어 아카데미) 교육생들을 위한 커뮤니티 플랫폼
내용 : 웹, Android, iOS 세 가지 클라이언트를 지원하는 풀스택 멀티 플랫폼 프로젝트로, 26.01.06 ~ 02.09, 약 6주간 진행


2. 프로젝트 요약

프로젝트 수치 정리

항목 수치
총 커밋 수 761개
개발 기간 35일 (1/6 ~ 2/9)
브랜치 수 100+개 (feature 브랜치 포함)
팀 인원 6명
플랫폼 4개 (Backend, Web, Android, iOS)

팀원별 커밋 기여도

팀원 커밋 수 주요 담당
김*재 ~237 Backend + Frontend + Infra
김*영 ~158 Backend
김*규 ~116 Android
김*호 ~80 iOS + 브랜치 관리
이*영 ~65 Android
이*주 ~56 Android

일별 커밋 추이

일자 기간 설명 추이 커밋 건 수 비고
1/19-25 설계기 ████░░░░░░░░░░░░░░░░ 52건  
1/26-27 개발 초기 ████████░░░░░░░░░░░░ 36건  
1/28-31 개발 가속 ████████████████████ 242건 최고 집중 구간
2/01-04 기능 완성 ██████████████████░░ 277건  
2/05-08 QA+마무리 ███████████░░░░░░░░░ 146건  
2/09 최종 배포 █░░░░░░░░░░░░░░░░░░░ 8건  

 


기술 스택

분류 기술 버전 핵심 선정 이유
Backend Java + Spring Boot 21 / 4.0.1 엔터프라이즈 안정성, 통합 생태계
  PostgreSQL 15 고급 SQL, 관계형 데이터 최적화
  Redis 7 알림 큐 + 캐시 이중 활용
  JWT (JJWT) 0.11.5 Stateless 멀티 플랫폼 인증
  STOMP/SockJS - 실시간 채팅, 경량 메시지 브로커
  Firebase Admin 9.2.0 크로스 플랫폼 푸시 알림 (FCM)
  Gemini API 2.5-flash AI 콘텐츠 자동 검열
Frontend React + TypeScript 19 / 5.9 선언적 UI, 타입 안전성
  Vite 7.2 극속 HMR, 최적 빌드
Android Kotlin + Compose Latest Google 공식, 선언적 UI
  Retrofit + OkHttp 3.0 / 4.12 선언적 API, 인터셉터
  Room 2.6 타입 안전 로컬 DB
iOS Swift + SwiftUI Latest Apple 공식, 선언적 UI
  Combine Built-in 네이티브 반응형 프레임워크
Infra Docker Compose Latest 10개 서비스 통합 관리
  Nginx Alpine 리버스 프록시, 경로 라우팅
  GitLab CI/CD - SSAFY 인프라 통합
  Prometheus + Grafana Latest 메트릭 + 시각화
  Loki + Promtail Latest 로그 수집 + 검색
  NetData Latest 실시간 시스템 모니터링

아키텍처 이미지

 


3. 프로젝트 타임라인

: 26.01.06 ~ 26.02.09 (6주) 의 기간동안 진행된 SSAFY 2학기 공통 프로젝트 "SSABREE TIME (싸브리 타임)"의 타임라인


[ 1주차 (26.01.06 ~ 26.01.11) ] - 초기 아이디어 기획 단계

 

  • 주요 활동
    • 팀원 6명 전원 아이디어 브레인스토밍 및 Zoom 화상 회의 진행
    • 총 15개 후보 주제에 대해 투표 진행 (1인당 3표)
  • 난관
    • 압도적인 지지를 받는 아이템의 부재로 인한 의견 통합 실패
    • 투표 결과가 분산되어 2표를 받은 주제만 7개가 나오는 등 동률 상황 반복
  • 1차 결론
    • 수차례의 재투표(최최최최최종)를 거쳐 '회사형 스터디 플랫폼' 아이디어를 선정했으나,
      주제가 단순하고 깊이가 부족하다는 내부 평가로 인해 재검토 결정

 


[ 2주차 (26.01.12 ~ 26.01.18) ] - 아이디어 기획 확정 단계

...유기견 디지털 펫

 

  • 방향성 수정: 기존 안을 폐기하고 각자 추가 아이디어를 발굴하여 재논의
  • 시도 1: 유기견 디지털 펫
    • 내용: 유기견 보호와 디지털 펫 육성을 결합한 서비스 기획 및 구체화
    • 피드백: 담당 컨설턴트님의 긍정적인 초기 반응 확보
    • 결과: 구체화 단계에서 법적 제약 사항 및 현실적 사용성 문제 등 현실적인 장벽에 부딪혀 폐기
  • 시도 2: SSAFY 커뮤니티 플랫폼 (최종 선정)
    • 내용: 대학생 커뮤니티 '에브리타임'의 기능을 벤치마킹하여, SSAFY 교육생들에게 최적화한 커뮤니티 플랫폼
    • 결과: 팀원 전원 합의로 최종 주제 채택 및 상세 기획 착수

 


[ 3주차 (26.01.19 ~ 26.01.25) ] - 개발 설계 단계

팀 커밋 32건 | 내 커밋 (김*영) 5건

팀 주요 활동

날짜 활동 담당
01.19 Spring Boot 초기 프로젝트 생성, Android 프로젝트 생성, README 작성 김*재, 김*규, 김*호
01.20 Android 프로젝트 구조화 (패키지, 모듈 분리) 김*규
01.21 ERD 초고~2차 작성, 로그인/회원가입 스켈레톤,
게시판 스켈레톤, Repository/유틸 클래스 생성
김*재, 김*영, 김*규, 김*호
01.22 .gitignore/nginx 설정, 기본 API 작동 확인, ViewModel 팩토리 설계,
홈 화면 작업 시작, ERD 3차 수정
김*재, 김*호, 김*규, 김*영
01.23~24 다크/라이트 Theme 정리, 홈 화면 중간 저장, 싸피 교육생 인증 기능 추가 김*규, 김*영
01.25 홈 화면/네비게이션바/스플래시 완성, 게시판 스켈레톤,
아이디/비밀번호 찾기 스켈레톤, 회원가입 기능
김*규, 김*호, 김*영

팀 난관

  • ERD 설계 반복 수정
    : 초고부터 3차까지 4일간 계속 수정이 필요했음.
    요구사항이 명확히 정리되지 않은 상태에서 설계를 시작하여 반복 작업 발생
  • Android 아키텍처 결정
    : ViewModel 팩토리 패턴, SavedStateHandle 필요 여부,
    Repository 구조 등 초기 아키텍처 설계에서 여러 번의 시행착오
  • 바텀 네비게이션 바 UI 겹침
    : 스크롤 가능한 컨텐츠가 bottom navigation bar에 가려지는 문제 반복 발생

해결 방법

  • ERD는 팀 전체가 리뷰하며 점진적으로 완성해나가는 방식 채택 (김*영 + 김*재 공동 작업)
  • Android는 AssistedViewModel / SimpleViewModel 분리 패턴으로 확정 (김*호 제안)
  • 바텀바 패딩 문제는 Scaffold의 contentPadding 파라미터로 해결 (김*호, 김*규 협업)

결과

  • Backend: Spring Boot 프로젝트 초기화, ERD 3차까지 완성, 싸피 인증/회원가입 API 완성
  • Android: 프로젝트 구조 확정, 로그인/회원가입/홈/게시판 스켈레톤 완성, Theme 시스템 구축
  • 6명 모두 각자의 담당 영역이 명확히 잡힌 상태

회고

첫 주는 "뼈대를 세우는 주간"이었다.

 

우선 요구사항 명세서 API 명세서를 설계함과 동시에, figma 디자인도 병행하며,

팀 전부 설계에 모두 힘을 쏟아서 기초 뼈대를 열심히 만들었다.

 

ERD 설계에 예상보다 시간이 걸렸지만, 이 과정에서 팀원 간 데이터 구조에 대한 이해가 맞춰졌다.

아이디어 주간에 설계를 완벽히 끝내지 못하여, 개발과 설계를 동시에 진행하다보니 API 설계와 개발이 꼬이기도 했다.

 

Android 쪽은 스켈레톤 화면을 빠르게 만들어 시각적으로 진행감을 확인할 수 있었다.

다만 Backend와 Android가 아직 연결되지 않아 각자 독립적으로 작업하는 구간이었다.


나의 3주차 활동 정리

주요 활동

날짜 시간 커밋 내용
01.21 17:51 Feat ERD 1차 수정 - 테이블 관계 초안 정리
01.21 22:05 Feat ERD 2차 수정 및 검토 - 팀 리뷰 반영
01.22 17:54 Feat ERD 3차 수정 - 최종 스키마 확정
01.24 21:03 Feat 싸피 교육생 인증 기능 추가 - Mattermost 연동 검증 로직
01.25 19:34 Feat 회원가입 기능 추가 - 인증 기반 가입 플로우 완성

난관

  • ERD 설계 시 팀/스터디/게시판 등 다양한 엔티티 간 관계가 복잡하여 3차까지 수정 필요
  • 싸피 교육생 인증이라는 도메인 특화 기능의 검증 로직 설계

해결 방법

  • Mattermost API 연동을 통한 실명 인증 방식 채택 (Incoming Webhook 을 사용!)
  • ERD는 김*재님과 공동으로 리뷰하며 점진적 수정

결과

  • 프로젝트의 데이터 설계 기반 확립 (ERD 3차 완성)
  • 싸피 교육생 인증 → 회원가입 플로우 백엔드 완성

회고

첫 주는 API 설계 및 DB 설계에 집중한 주간이었다.

ERD를 3번 수정하면서 "처음부터 완벽한 설계는 불가능하다"는 것을 체감했다.
API 설계가 완벽하지 않은 상태에서 DB를 만들어서 조금 순서가 어긋난 듯하다.

 

API 명세서 (전)

 

특히 API 설계 시에 단순히 GET, POST와 엔드포인트만 작성해뒀었는데,

Request body, Response body를 작성해두지 않은게 추후에 너무 뼈아픈 일이었다.

 

API 명세서 (후)

 

Request body, Response body를 포함하여 API 명세서를 작성했더니,
개발 과정에서 프론트엔드에서 백엔드로 요청, 재요청, 추가요청.. 이 없이 순조롭게 잘 진행되었다.

 

이 과정이 이후 개발의 기반이 되었기에 의미 있는 시간이었다.

주 후반에 인증/회원가입 기능을 빠르게 구현하며 API 개발의 리듬을 잡기 시작했다.


[ 4주차 (26.01.26 ~ 26.02.01) ] - 개발 가속 단계

팀 커밋 176건 | 내 커밋 (김*영) 27건

팀 주요 활동

날짜 활동 담당
01.26 게시물/게시판 기초 구현, Swagger 세팅, CSR 작성,
프로젝트 구조 리팩토링, AuthService 구현, 게시글 기능
김*재, 김*호, 김*규
01.27 알림 목록 스켈레톤, 마이페이지/스터디 상세 스켈레톤,
팀 목록 스켈레톤, 기본 MVC 구현
이*영, 이*주, 김*재, 김*규
01.28 CI/CD 파이프라인 구축, 그룹관리/팀원관리, 쪽지/디데이 스켈레톤,
게시글 작성, 테스트 페이지, API 수정 반영
김*재, 이*주, 이*영, 김*규, 김*영
01.29 반(class) CRUD, 에러 핸들링 체계, 회원가입/로그인 기능 완성,
알림 시스템 기초, 설정화면/다크모드, Projects 파트, iOS 스켈레톤
김*재, 김*규, 이*주, 김*영, 김*호
01.30 설정 도메인 완성, 회원관리 이슈 통합, soft delete,
팀/스터디 기초, 게시글 투표/검색, 식단 조회, Mattermost 매칭
김*재, 이*주, 김*영, 이*영, 김*규
01.31 UI 라이트/다크 모드 통합, 게시판 API 연동, 커서기반 페이지네이션,
쪽지 기능, 채팅 실시간, 게시판 필터 UI
김*규, 김*호, 김*영, 이*주
02.01 마이페이지/포트폴리오 완성, Hot 게시판, 조회수, 댓글 soft-delete,
백준 연동, 채팅 Nginx, 그룹 멤버 역할 구분
김*규, 김*영, 김*재, 김*호, 이*영

팀 난관

  • CI/CD 구축 난항 - GitLab Runner 설정, Docker 권한 문제, 이미지 빌드 실패 등으로
    01.28 하루 동안 김*재가 10회 이상 커밋하며 파이프라인 안정화
  • Swagger-Spring Boot 버전 비호환 - 에러 핸들링 도입 과정에서 Swagger와 Spring Boot 4.0 간 호환성 문제 발생
  • lombok @Builder.Default 이슈 - 엔티티에 기본값을 설정할 때 lombok 빌더와의 충돌로 반복적인 수정 필요
  • AppNavGraph 충돌 폭발 - 여러명이 동시에 새 화면을 추가하면서 네비게이션 파일에서 merge conflict 빈번 발생
  • 바텀바가 컴포넌트를 가리는 문제 재발 - UI 통합 과정에서 이전에 해결한 문제가 다시 발생

해결 방법

  • CI/CD : Docker 명령어 수정, 권한 재설정으로 배포 자동화 완성
  • Swagger : 에러 핸들링 방식을 Spring Boot 4 호환 방식으로 전환, IllegalArgumentException - 400 에러 핸들링 추가
  • lombok : @Builder.Default 어노테이션 명시적 추가, 중복 문제 해결
  • NavGraph : 이*주가 네비게이션 허브 역할을 맡아 24회 수정으로 통합 관리
  • 바텀바 : 김*규가 HOT Fix로 즉시 대응

결과

  • Backend: API 5차 반영 완료, 에러 핸들링 체계 확립, CI/CD 파이프라인 가동, 알림 시스템 기초 완성
  • Android: 전체 화면의 80% + 스켈레톤 완성, UI 라이트/다크 모드 통합 80%, 게시판 API 첫 연동 성공
  • Frontend: 테스트 페이지 생성으로 Backend 검증 시작
  • 주간 176커밋 - 프로젝트 전체의 37%가 이 한 주에 집중

회고

4주차는 모든 것이 동시에 진행된 가장 바쁜 주간이었다.

 

Backend와 Android가 처음으로 연결되기 시작하면서

"내 코드가 실제로 화면에 보인다"는 성취감이 팀 전체의 동력이 되었다.

 

다만 CI/CD 구축에 많은 투자를 해야 했고,

여러명이 같은 파일(AppNavGraph.kt)을 동시에 수정하면서 충돌 지옥을 경험했다.

1월 30일에는 팀 전원이 풀 가동되어 하루에 37커밋이라는 최고 기록을 세웠다.


나의 4주차 활동정리

주요 활동

날짜 시간 커밋 내용
01.28 16:58 Fix API 수정 및 추가사항 반영 (3차)
01.29 13:34 Feat Projects 파트 추가 — 포트폴리오 프로젝트 엔티티
01.29 13:48 Fix Projects 부분 버그 수정
01.29 16:35 Feat API 수정 및 추가사항 4차 반영
01.29 16:48 Fix PostController 오류 수정
01.30 14:17 Feat API 수정 및 추가사항 5차 반영
01.30 14:37 Fix Team, Study Deleted_at 추가 - soft delete 버그 수정
01.30 14:45 Fix @Builder.Default 추가
01.30 20:29 Feat Mattermost 데이터 매칭 확인 기능 추가
01.30 21:38 Feat 검색 기능 및 게시글 투표 기능 추가
01.30 22:04 Fix 캠퍼스별 식단 조회 기능 수정
01.30 22:25 Feat 게시판별 게시글 목록 조회 기능 추가
01.31 16:11 Fix 캠퍼스별 식단 이미지 업로드/조회 수정
01.31 17:58 Feat 쪽지 기능 구현
01.31 19:23 Feat 게시글 커서기반 페이지네이션 추가
01.31 22:23 Feat 채팅 기능 전반적 수정 및 실시간 기능 추가
01.31 22:56 Fix 게시글 목록에서 댓글 갯수 안 세는 현상 해결
02.01 16:16 Feat Hot 게시판 기능 추가
02.01 17:43 Feat 조회수 기능 추가
02.01 18:07 Feat 댓글 soft-delete 변경
02.01 18:43 Feat 백준 아이디 연동 → Solved.ac 티어 가져오기
02.01 22:37 Feat 채팅 기능 Nginx 수정
02.01 23:45 Feat 포트폴리오 URL type 제거
02.01 23:57 Fix URL type 필드 수정 핫픽스
02.02 00:14 Fix JwtToken 관련 수정

난관

  • API 반영 반복 - 3~5차까지 프론트엔드 요구사항에 맞춰 API를 계속 수정해야 했음
  • soft delete 처리 - Deleted_at 필드 누락으로 삭제된 데이터가 조회되는 버그 발생
  • @Builder.Default - lombok 빌더와 기본값 설정 간 충돌
  • 채팅 실시간 구현 - WebSocket + STOMP 기반 실시간 채팅의 Nginx 프록시 설정

해결 방법

  • API 수정은 이슈 번호를 매겨 체계적으로 관리 (3차 ~ 5차 반영)
  • soft delete는 @Where(clause = "deleted_at IS NULL") 또는 @SQLRestriction 활용
  • 채팅은 Nginx의 WebSocket 프록시 설정(upgrade, connection 헤더)으로 해결
  • 커서기반 페이지네이션으로 대량 게시글 조회 성능 확보

결과

  • 하루에 4~8커밋씩 꾸준히 기능을 추가하여 검색, 투표, 쪽지, 채팅, Hot 게시판, 조회수, 백준 연동 등 핵심 기능 대부분 완성

회고

4주차는 "API를 쏟아내는 주간" 이었다.

 

하루에 여러 기능을 동시에 구현하면서 속도감 있게 진행했지만,

API 수정이 3차 ~ 5차까지 반복된 것은 초기에 Frontend/Android 팀과 API 스펙을 더 상세히 합의했으면 줄일 수 있었을 것이다.

(초기 설계의 문제점을 깨닫고 Request body, Response body를 포함하여 API 명세서를 작성한 것이 이 시기였다.)

 

Mattermost나 백준 API 등 외부 API도 활용해보고 여러 기능들을 상세하게 만들어봐서 좋은 경험이었다.

실시간 채팅 기능 (Web socket 활용), 페이지네이션 등 처음 해보는 것들도 있었지만 잘 완성해서 다행이다.


[ 5주차 (26.02.02 ~ 26.02.08) ] - 기능 완성 및 QA 단계

팀 커밋 259건 | 내 커밋(김*영) 45건

팀 주요 활동

날짜 활동  담당
02.02 AI 검열 시스템 구축 (Ollama→OpenAI→Gemini), 디데이/포트폴리오 UI 개선,
다크모드 설정, 알림 연동, 초기설정 데이터, 팀/스터디 API 전면 수정, 웹 프론트 생성 시작
김*재, 김*규, 김*호, 이*영, 김*영
02.03 관리자 공지, FCM 알림 수정, 홈화면 연결(디데이/게시판/그룹), 마이페이지 로그아웃,
Grafana 모니터링 도입, 댓글 페이지네이션, Lazy 오류
김*영, 이*영, 김*재, 김*호
02.04 iOS 프로젝트 시작, 팀/스터디 버그 전면 수정, Redis 캐시 도입,
FCM 재동기화, Jackson 3 마이그레이션, 웹 프론트 본격 개발, Android 버그 수정 85~90%
김*호, 김*영, 김*재, 김*규
02.05 팀/스터디 동기화, 자진 탈퇴, 익명성 보장 처리, FCM 알림(지원/수락),
게시판 사진 5개 제한, 그룹 수정/점심 확대/마이페이지
김*영, 김*재, 김*규, 김*호, 이*영
02.06 회원탈퇴 hard delete, 탈퇴 시 리더 null 처리, 모니터링(Prometheus/NetData),
알림 설정 간소화, 그룹 찾기/상세 보정, QA 50%
김*영, 김*재, 김*호, 김*규
02.07 회원탈퇴 side effect 해결, 쪽지 버그 수정, APK 빌드, 공휴일 반영 D-day,
채팅/게시판 UI 개선, v1.0.3 배포
김*영, 김*규, 김*호
02.08 iOS 기능 대량 구현 (FCM, 채팅, 공지 CRUD, 과제), 웹 프론트 전체 기능 구현
(게시판, 채팅, 마이페이지, 포트폴리오, 랜딩 페이지)
김*호, 김*재

팀 난관

  • AI 검열 시스템 삽질 - Ollama(내장 모델) → OpenAI API → Gemini Flash Lite까지 3번 변경.
    내장 모델(qwen:4b)은 서버 리소스 과다, OpenAI는 비용 문제, 최종적으로 Gemini 무료 버전으로 전환
  • Jackson 3 마이그레이션 지옥 - Spring Boot 4가 Jackson 3을 요구하면서 기존 2.x 코드와의 호환성 문제.
    JsonProcessingException → JacksonException 등 패키지 변경으로 7커밋 연속 수정
  • Redis 캐시 직렬화 문제 - Jackson 3 전환 과정에서 Redis 직렬화 설정도 함께 변경 필요.
    김*영이 5번 연속 "redis 재수정" 커밋
  • Hibernate LazyInitializationException - 팀/스터디 엔티티의 Lazy 로딩이 세션 밖에서 접근될 때 발생.
  • 회원탈퇴 side effect 연쇄 - hard delete로 변경 후 리더 null, soft delete된 게시물/댓글 처리,
    팀/스터디 탈퇴 로직 등 연쇄적 문제 발생
  • iOS 프로젝트 일정 압박 - 02.04에 시작하여 5일 만에 주요 기능 구현 필요

해결 방법

  • AI 검열 : Gemini 2.5 Flash Lite + 커스텀 프롬프트로 최종 확정, isBlinded 필드로 검열된 게시글 처리
  • Jackson 3 : 패키지 전체를 tools.jackson.core로 통일, @Primary 설정 충돌 해결
  • Redis : Jackson 3 호환 직렬화 설정으로 완전 마이그레이션
  • Lazy : @Transactional 범위 조정 및 Fetch Join 적용으로 전면 수정
  • 회원탈퇴 : 리더 null 처리, 게시물/댓글 수정, 팀/스터디 탈퇴 로직 순차적 해결
  • iOS : 김*호가 집중 개발, AI 도구 활용하여 Android 코드 기반 빠르게 전환

결과

  • Backend: AI 검열, 익명성 보장, 회원탈퇴 hard delete, FCM 고도화, Redis 캐시, 모니터링 시스템 완성
  • Android: 버그 수정 90% 완료, v1.0.3 APK 배포, QA 2차까지 완료
  • iOS: 5일간 로그인, 채팅, 알림, 공지까지 주요 기능 구현
  • Frontend(Web): 게시판, 채팅, 마이페이지, 포트폴리오, 랜딩 페이지 전체 구현

회고

5주차는 "통합의 고통과 성취가 공존한" 주간이었다.

 

Jackson 3 마이그레이션, Redis 직렬화, Lazy 오류 등 기술적 난관이 동시다발적으로 터졌고,

특히 김*영과 김*재 (Backend 2명) 가 밤새 디버깅하는 날이 많았다.

 

하지만 팀의 저력이 빛난 주간이기도 했다.

김*호는 iOS를 5일 만에 완성했고, 김*재는 웹 프론트를 하루 만에 올렸으며,

김*규는 QA를 체계적으로 진행하며 Android 완성도를 끌어올렸다.

 

회원탈퇴 한 기능에서 4일간 side effect가 이어진 것은

"하나를 바꾸면 열 개가 영향받는" 프로젝트 후반의 전형적인 패턴이었다.

그럼에도 불구하고, 잘 극복하여 side effect를 잘 해결해내서 모두 뿌듯한 주간이었다.


나의 5주차 활동 정리

주요 활동

 

02.02 - 초기 데이터 & 팀/스터디 재정비

시간 내용
12:58 Mattermost 메시지 템플릿 변경
15:12 초기설정 데이터들 JPA로 기입 (캠퍼스, 반 등)
15:49 팀/스터디 API 전면 수정
16:22 에러 처리
17:01 15기 반정보 추가
17:48 Study, Team 수정

 

02.03 - FCM & 팀/스터디 오류 해결

시간 내용
01:27 스터디 및 팀 API 관련 수정사항 재반영
02:54 관리자 공지 생성 기능
03:17 블라인드 처리 안된 최신 글 제목만 홈에 표시
03:52 Backend 전반적인 코드 정리
14:42 새소식에 댓글 알림 수정
16:13 FCM 내용 수정
17:39 팀 관련/스터디 관련 수정
22:13 Hibernate LazyInitializationException 해결

 

02.04 - Redis 캐시 & 버그 수정

시간 내용
10:00 팀/스터디 LAZY 관련 오류 전면 수정
10:11 팀/스터디 버그 수정
12:38 팀/스터디 버그 재수정
13:38 Redis 캐시 관련 수정
14:30 버그 수정
14:57 FCM 얕은 재동기화 도입
15:58 팀/스터디 관련 수정
17:19 FCM 기존 버전 삭제 수정

 

02.05 - 동기화 & 익명성

시간 내용
02:58 FCM 오류 수정
09:18 팀/스터디 동기화 및 CRUD 변경
09:30 팀/스터디원 자진 탈퇴
10:15 팀 지원 관련 FCM 알림 + 새소식 알림
15:25 익명성 보장 백엔드 처리

 

02.06 ~ 02.07 - 회원탈퇴 & 최종 수정

시간 내용
22:10 회원탈퇴 시 hard delete로 변경
22:25 팀/스터디 탈퇴 로직 수정
22:38 회원탈퇴 시 리더 null 처리
23:07 soft delete 되었던 게시물/댓글 수정
13:31 회원탈퇴 side effect 해결
15:23 쪽지 버그 수정 (최종 커밋)

난관

  • Lazy 로딩 관련 - LazyInitializationException이 팀/스터디 조회 전반에서 발생.
    밤 8:45부터 10:13까지 4커밋으로 해결 시도
  • Redis 캐시 반복 실패 - 12:59부터 13:38까지 40분간 5번 연속 "redis 재수정" 커밋.
    Jackson 3 전환과 맞물려 직렬화 설정이 계속 실패
  • 회원탈퇴 연쇄 문제 - hard delete로 변경했더니 리더 참조, 게시물/댓글 참조,
    팀 소속 등 연쇄적으로 FK 제약 위반 발생

해결 방법

  • Lazy : @Transactional 범위 확장 + Fetch Join 으로 필요한 엔티티를 미리 로딩
  • Redis : Jackson 3 호환 직렬화 설정 (GenericJackson3JsonRedisSerializer) 적용
  • 회원탈퇴 : 리더 → null 처리, soft delete 게시물/댓글 cascade 정리, 탈퇴 로직 재설계

결과

  • 13개 이상의 핵심 API 기능 완성 (관리자 공지, 익명성 보장, 회원탈퇴, FCM 재동기화 등)
  • 팀/스터디 관련 API의 완전한 안정화
  • 02.07 15:23 쪽지 버그 수정을 마지막으로 전체 백엔드 기능 완성

회고

5주차는 나에게 가장 고된 주간이었다.

 

02.03에 새벽 1시부터 코딩을 시작해 하루 13커밋, 02.04에는 14커밋으로 Redis 캐시와 씨름했다.

특히 "redis 재수정"이 5번 연속으로 이어진 것은 기술 부채가 한꺼번에 터진 결과였다.

 

하지만 이 과정에서 JPA Lazy 로딩, Redis 직렬화, FCM 알림 시스템 등 기술적으로 극복을 해보며

다양하고 깊은 지식들을 얕게라도 습득했다.

 

회원탈퇴 하나에서 4일간 side effect를 추적한 경험은 "데이터 무결성의 중요성"을 체감하게 해준 사건이었다.

 

처음엔 단순하게 soft delete로 회원탈퇴를 하는 게 맞다고 생각했는데, 사용자 입장에서는 탈퇴 시에 본인의 기록들이 모두

사라지는 걸 원하지 않을까? 라고 생각했고, 관련 법이나 일반적으로 어떻게 처리했는지를 찾아보고,

hard delete로 회원탈퇴를 해야겠다고 수정했다.

 

하지만 side effect가 정말 많았고 (스터디, 팀 리더가 회원탈퇴를 하면 그 스터디와 팀의 처리는..? 등)

하나하나 다 고려해가면서 수정하다보니 꽤 오랜 시간동안 side effect를 수정했다. 좋은 경험이라고 생각한다.


[ 6주차 (26.02.09 ~ 26.02.13) ] - 최종 배포 및 회고 단계

팀 커밋 6건

팀 주요 활동

날짜 활동 담당
02.09 관리자 endpoint 제거, .gitignore 수정, 시나리오 문서 업로드 김*재, 김*호

팀 난관

  • 최종 발표 준비와 시나리오 문서 정리에 시간 투자 필요

해결 방법

  • 불필요한 관리자 endpoint를 제거하여 보안 강화 (swagger UI 등)
  • 시나리오 문서를 최종 정리하여 업로드

결과

  • 프로젝트 코드 정리 및 문서화 완료
  • ssabree time 프로젝트 최종 완성

회고

마지막주는 코드보다 문서와 발표 준비에 집중했다.

또한, 원스토어ios 앱스토어에 출시하는데에 공을 들여, 원스토어에는 바로 출시했고,

앱스토어에는 시간이 좀 걸려 2월 중순이 넘어서 출시에 성공했다.

 

싸브리타임 실제 구현 화면

 

 

그렇게 6주간의 여정이 하나의 서비스로 완성되었다.


📊 전체 요약

내 주별 커밋

주차 추이 커밋 건 수 내용
3주차 ████░░░░░░░░░░░░░░░░░░ 5건 (6%) ERD·인증·회원가입
4주차 ██████████████░░░░░░░ 27건 (35%) API 양산 (검색·투표·채팅·식단)
5주차 ██████████████████████ 45건 (58%) 버그·캐시·FCM·탈퇴

 

내 핵심 기여 정리

영역 구현 기능
데이터 설계 ERD 1~3차 설계 및 수정
인증 싸피 교육생 인증, 회원가입, Mattermost 매칭
게시판 검색, 투표, Hot 게시판, 커서기반 페이지네이션, 조회수, 댓글 soft-delete
커뮤니케이션 쪽지, 채팅 실시간 (WebSocket/STOMP), Nginx 프록시
그룹 팀/스터디 CRUD, 동기화, 자진 탈퇴, 지원 관리
알림 FCM 알림 (댓글/지원/수락), 새소식, 재동기화
보안/정책 익명성 보장, 회원탈퇴 hard delete, AI 블라인드 연동
성능 Redis 캐시, 댓글 페이지네이션, Lazy 로딩 최적화
데이터 초기설정 데이터, 14-15기 반정보, 관리자 공지

 

마무리하며

 

처음으로 6인이라는 규모로 프로젝트를 진행해보았다.

끈끈하고 정말 좋은 유대감을 가지고 팀이 잘 진행되었지만,

6명 모두 프로젝트 경험이 많지 않아 애를 먹은 부분도 많았다.

하지만 그마저도 모두에게 좋은 성장 기회였다고 생각하고, 좋은 추억도 되었다.

 

기술적으로는 Spring 버전을 4.0대 버전을 쓴게 큰 패착 중에 하나라고 생각한다.

Claude code와 Gemini Pro 등을 활용해서 코딩했는데, Spring 4.0대 버전이 너무 최신이라

AI도 학습이 되어있지 않았고, 그로 인해서 Jackson 3 관련 문제를 해결하려해도 AI 조차 해결을 못했다.

 

결국은 팀원분이 하루종일 고생해서 직접 Jackson 3 내용들을 웹서핑해서 AI에 학습 시킨 뒤에 고쳤는데,

이 일이 있고나서는 무엇이든 안정적으로 동작중인 최소 1~2년 정도된 버전을 default로 사용해야겠다는 생각을 했다.

 

 

'Project > Retrospect' 카테고리의 다른 글

[회고] SSAFY 1학기 최종 관통 프로젝트 회고  (0) 2026.02.12