[Retrospective] SFeed(스피드) 백엔드 서버 프로젝트 회고

이연우·2025년 8월 16일

TIL

목록 보기
73/100

📌 SFeed (스피드)

Speed x Speak x Newsfeed
빠르게 전하는 소식, 함께 나누는 소통의 공간

📝 프로젝트 개요

  • Spring Boot 기반 SNS 백엔드 서버
  • 회원 가입부터 게시물, 댓글, 좋아요, 친구·팔로우, 차단, 이메일 인증 등 SNS 핵심 기능 구현
  • 개발 기간: 2025.08.04 ~ 2025.08.15 (2주)
  • 팀 프로젝트 (5인 - 전원 백엔드)

👩‍💻 내가 맡은 역할

  • 게시물 CRUD: 작성 / 단건 조회 / 전체 조회
  • 댓글 CRUD: 작성 / 조회 / 수정 / 삭제
  • 좋아요 기능: 게시물 좋아요·취소, 댓글 좋아요·취소
  • 친구 기능: 요청 / 수락 / 거절 / 삭제 / 친구 리스트 조회
  • 팔로우 기능: 팔로잉 목록 / 팔로워 목록 / 상대와의 팔로우 상태 조회(단건)

🛠️ 기술 스택

  • Language/Framework: Java 17, Spring Boot, Spring Data JPA
  • Database: MySQL
  • Authentication: HttpSession 기반
  • Etc: Gradle, Lombok, Validatio

🔍 간단 트러블슈팅

⚠️ 친구 차단/삭제

💭 문제 상황

  • 차단을 했는데도 뉴스피드/전체 조회/단건 조회/프로필에서 글과 정보가 그대로 보임
  • 삭제차단의 동작이 구분되지 않음

💭 원인

  • PostRepository JPQL 쿼리에 BlockedUser 조건 누락
  • PostService.getPostById 단건 조회에서 차단 여부 체크 없음
  • UserController 프로필 조회에서 차단 여부 처리 없음

💭 해결

1. 뉴스피드/전체 게시물 조회

  • JPQL에 조건 추가
NOT EXISTS (
  SELECT 1 FROM BlockedUser b
  WHERE b.userId = :me AND b.targetUserId = p.user.id
)
  • 서비스에서 viewerId(me)를 전달하도록 수정

2. 단건 조회

if (blockedUserRepository.existsByUserIdAndTargetUserId(me, post.getUser().getId())) {
    throw new ResponseStatusException(HttpStatus.FORBIDDEN, "차단한 사용자의 게시물입니다.");
}

3. 회원 정보 조회

  • 프로필 조회 시 차단 여부 확인
  • 차단 상태면 "차단한 사용자입니다." 응답 반환

💭 결과

  • 차단 → 뉴스피드/전체/단건/프로필에서 모두 차단 반영
  • 삭제 → 뉴스피드/전체/단건/프로필 정상 노출

⚠️ Follow 조회 기능

💭 문제 상황

  • 로그인하지 않은 사용자가 호출 시 NullPointerException 발생
  • 존재하지 않는 사용자 ID로 조회 시 잘못된 결과 반환
  • 타인의 팔로잉/팔로워 목록그대로 노출
  • 단건 상태 조회에서 본인을 대상으로 호출 시 무의미한 응답 발생

💭 원인

  • 컨트롤러에서 로그인 여부 체크 누락
  • userRepository.existsById()대상 사용자 존재 여부 확인 없음
  • viewerIduserId 일치 검증 부재
  • 단건 조회 시 본인 대상 요청 차단 처리 없음

💭 해결

1. 로그인 여부

if (viewer == null) {
    return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body("로그인이 필요합니다.");
}

2. 사용자 존재 여부

if (!userRepository.existsById(userId)) {
    return ResponseEntity.status(HttpStatus.NOT_FOUND).body("사용자를 찾을 수 없습니다.");
}

3. 본인만 목록 조회 가능

if (!viewer.getId().equals(userId)) {
    return ResponseEntity.status(HttpStatus.FORBIDDEN).body("본인만 조회할 수 있습니다.");
}

4. 단건 상태 조회 예외 처리

if (!viewer.getId().equals(userId)) {
    return ResponseEntity.status(HttpStatus.FORBIDDEN).body("본인만 조회할 수 있습니다.");
}

💭 결과

  • 로그인하지 않은 사용자401 UNAUTHORIZED 응답
  • 존재하지 않는 사용자 ID 요청 시 404 NOT_FOUND 응답
  • 본인만 팔로잉/팔로워 목록을 확인할 수 있도록 제한 (403 FORBIDDEN)
  • ✅ 단건 상태 조회에서 본인 대상 요청400 BAD_REQUEST 처리

😎 느낀 점

  • 발제를 듣기 시작했던 초반은 프로젝트 구현을 마칠 수 있을지, 혹은 이렇다 할 결과가 나올 수 있을지에 대한 막막함이 컸다. 그러나 내가 맡은 부분부터 차근차근 코드를 작성해 나가니까 생각했던 것보다 수월하게 담당 부분을 구현할 수 있었고, 코드 테스트를 진행하면서도 재미를 느끼게 되었다.

  • 결과적으로는 처음 진행하는 팀 프로젝트라서 걱정과 고민이 되는 부분이 많았지만, 팀원들과 의견을 나누면서 문제를 해결하고 점차 진도가 나가며 진행률이 올라가는 것을 보니까 뿌듯함이 느껴졌다. 지금까지는 개인 프로젝트만 진행해서 처음부터 끝까지 혼자 노력했지만, 팀원들과 협업하며 하나의 프로젝트를 완성했을 때에는 또 다른 성취감과 후련함이 느껴진다는 것을 깨달았다. 9월에 진행할 최종 프로젝트는 현재보다 더 발전한 결과를 얻기 위해 더 열심히 임해야겠다는 다짐을 하였다.


✔️ 자세한 코드 및 시연 영상은 깃허브에서 확인 가능
SFeed → Speed x Speak x Newsfeed

0개의 댓글