메인 프로젝트 (12) 프로젝트 회고

InSeok·2022년 12월 12일
0

프로젝트

목록 보기
11/13

기획


  • 코로나 이후 건강에 대한 관심도는 높아지고 있고, 자연스레 헬스장을 찾는 사람들이 많아지고 있는 추세다.
  • SNS와 운동기록 어플리케이션의 장점을 통합하고 대결기능과 랭킹시스템을 도입하여 헬스인들에게 동기부여를 해줄수 있는 전용매체를 만들고자 프로젝트를 기획하였다.

개발 기간 및 인원


  • 프로젝트 기간: 2022.11.08~2022.12.07
  • 팀원: FE - 고정훈 고하나 최윤우 한승진 / BE - 김신재 방인석 조현식
  • 배포 링크: Fit Challenge 배포 링크
  • GitHub 링크: Fit Challenge 깃허브
  • 기능 구현: API 명세서
  • ⚒ 내가 구현한 기능
    • Main 게시판 CRUD
      • 게시물 작성
        • 형태로 이미지 S3에 업로드후, DB에 파일경로 저장
      • 게시물 조회
        • 무한 스크롤 페이징
        • Cloud Front를 통해 캐싱된 이미지 빠르게 가져온다
        • Fetch Join + Batch Size를 통해 N+1 문제 없이 연관된 엔티티의 정보도 같이 조회
      • 게시물 수정, 삭제
    • 좋아요 기능
      • 전체 게시물 조회시 로그인한 유저의 해당 게시물 좋아요 상태값 조회
    • 게시물 검색
      • #~~ 형태의 태그 기반 검색 기능 구현
    • 게시물 댓글 CRUD
      • 댓글 조회 - 무한 스크롤(버튼 형식)
    • 챌린지 기능
      • 챌린지 신청, 수락, 거부, 중단 기능 구현
    • 랭킹 페이지
      • 파라미터로 전달받은 검색 조건들을 동적쿼리로 조회
      • QueryProjection을 활용하여 필요한 컬럼 정보만 선택하여 조회
    • 실시간 알림
      • SSE를 통한 실시간 알림 기능
      • Batch를 통해 읽은 알림 & 오래된 알림 일괄 삭제처리
  • 🙋🏻‍♂️ Common
    • DB 스키마 설계
    • API 작성
    • ERD Diagram : ERD CLOUD
    • 발표자료 제작
  • 📚기능 구현에 사용한 기술 스택
    • Spring Framework
    • Spring Data JPA
    • Querydsl
    • SSE
    • Spring batch
    • JUnit
  • AWS EC2 배포
    • RDS 연동

KPT


Keep

  • 프로젝트를 효율적으로 관리하기위해 Git flow를 적용하였다.
    • branch 관리를 더 깔끔하게 할 수 있었다.
    • 버전에 따라 관리가 쉬웠다.
    • 배포 및 수정이 용이했다.
  • Commit message convention 설정
    • 커밋 로그 가독성이 향상되어 코드 리뷰할때 수월하였다.
  • Backend Development Convention 설정
    • 매퍼 → 빌더패턴 지향
      • 불필요한 코드를 없애고 의미있는 객체만 생성할 수 있었다.
    • 엔티티 클래스에서 @Setter 사용지양
      • Setter 대신 빌더패턴을 사용함으로써, 객체 생성 시점에 값들을 넣어 객체의 일관성을 보장할 수있었다.
    • @NoArgsConstructor(access = AccessLevel.PROTECTED)
      • 무분별한 객체 생성에 대해 한번 더 체크할 수 있었다.
    • 컨트롤러, 서비스 클래스에서 CRUD 메서드는 동사형으로 사용
      • 코드 가독성 향상
  • N+1과 같은 DB 관련 문제를 해결하고, 성능을 최적화화기 위한 노력
    • Fetch Join과 BatchSize를 활용하여, N +1문제를 해결하는 과정에서 만난MulitpleBagFetchException 에러와 페이지네이션을 하는과정에서 만난 OutOfMemoryException 해결
  • 코드 리뷰
    • 프로젝트 기간동안 팀원들과 총 2번의 코드리뷰를 진행하였는데, 본인이 작성한 코드를 다른팀원들에게 설명하는 시간을 가졌다.
    • 내가 구현한 기능이지만 코드에 대해 설명하려고 하니 막히는 부분이 있어 관련정보를 좀더 찾아 보는 과정에서 이해도가 높아졌으며, 팀원이 작성한 코드에 대한 설명도 들을 수 있어, 프로젝트 전체 흐름을 파악하는데 큰 도움이 되었다.

Problem

  • 테스트 코드 부족

    • Backend Team에서 각자 맡은 기능들을 빠르게 구현하고, 프로젝트 마감전까지 10일 정도 남아 그 기간동안 단위테스트부터 통합테스트까지 최대한 많은 테스트 코드 작성과 리팩터링을 통해 프로젝트 완성도를 높일 계획이었으나, Client와 기능연결하는 부분에서 생각보다 많은 시간이 소요되어 테스트코드를 충분하게 작성하지 못했다. Postman을 통해 Api 요청과 응답결과를 미리 확인했어서, 오래 걸리지 않을거라 예상했지만, 예측하지 못한곳에서 버그가 발생하였고 이를 해결하는데 꽤 시간이 오래걸렸다.
  • CI/CD 미구축으로 인한 리소스 낭비

    • Backend Team에서 미리 계획한 기능들의 구현을 마친 상태에서 Client와 기능연결을 할때 예상치 못했던 버그가 발생하여, 코드를 계속 수정하고 빌드하여 배포하는 과정이 프로젝트 기간도안 수차례 있었다. 이 과정을 CI/CD를 통해 자동화 했다면 코드 통합과 배포과정에든 리소스를 아껴, 테스트코드 작성및 리팩터링에 더 신경쓸 수 있었을 거로 예상된다.
  • Spring Security & Elastic Search 에 관한 이해도 부족

    • Backend Team에서는 각자 맡은 기능을 구현한뒤, Discord에 모여 다 같이 코드리뷰를 진행하였다. 개인이 맡은 기능을 어떻게 구현하였는지 코드를 보여주며 말로 설명하였다. 이때, 다른 팀원들이 기능을 구현할때 활용한 Spring Security와 Elastic Search 관한 내용에 대해 설명을 들었을때 온전히 이해하지는 못하였다. Spring Security는 부트캠프 교육과정에서 익혔으나,프로젝트에 직접 적용해본적은 없기에 알지못한 내용도 많이있었고, Elastic Search는 처음 접한 내용이라 어려웠다.

Try

  • 프로젝트 이후에 위에 작성한 내용들을 기반으로 내게 부족한 것들을 채우기위해 개인 프로젝트를 진행해볼 예정이다.
  • 이전에는 프로젝트 경험도 부족하고 마감기한이 있어 압박감 때문에, 애자일 형태로 필요한 기능부터 빠르게 구현하였다. 부트캠프 수료후 취업준비를 하면서 개인프로젝트에서 내가 구현해보고 싶었던 기능들과 부족한 부분들을 충분히 시간을 가져 공부하고 적용할 예정이다.
  1. TDD를 기반으로 프로젝트를 작성하며, 충분한 단위테스트부터 통합테스트까지 작성해보자.
  • client와의 기능연결로 인해 충분히 작성하지 못했던 테스트코드를 이번엔 TDD로 테스트 코드를 우선적으로 작성하면서 애플리케이션 기능들을 완성해 나감으로써, 테스트 코드 작성에 대한 경험을 충분히 가져볼 것이다.
  1. CI/CD 구축
  • github actions or Jenkins를 통해 CI/CD를 직접 구축해 볼 예정이다. 컨테이너 인프라 환경 구축을 위해 Kubernetes와 Docker도 함께 공부하여 적용해볼것이다.
  1. Spring Security & Elastic Search 기능 구현
  • 이번 프로젝트에서 다른 팀원들이 구현한 보안과 elastic Search 기능들을 공부하면서 다음프로젝트 직접 구현해볼 예정이다.

마무리


평소 헬스에 관심이 많았고, 내가 제안한 아이디어가 채택되어 완성도 높은 서비스를 구현하고 싶었다. 운이 좋게도 페어 프로그래밍 때 마음이 맞았던 분들과팀이되어, 프로젝트 기간동안 서로 힘이 되어주며 열심히 개발한 덕분에 좋은 결과를 낼 수 있었고, 새로운 기술을 프로젝트에 적용해보면서 실력적으로도 많이 향상되었고, 아직 내가 부족한 부분도 발견할 수있는 기간이었다. 부트캠프 과정 수료후 기술면접과 코테 준비를하면서 내게 부족한 부분들을 채워나갈 것이다.

profile
백엔드 개발자

0개의 댓글