ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [SSAFY] 싸피 8기 2학기 공통 프로젝트 후기 - 우수상(1등)
    IT/SSAFY 2023. 3. 12. 13:02
    반응형

    최근 정신 없는 공채 시즌이다.

    싸피에서 한 프로젝트와 그 안에서의 나의 역할, 배운점 등을 정리하면 좋을 것 같아 블로그에도 기록으로 남겨 본다.

    프로젝트 개요 및 결과

    - 서비스명 : Color the rock

    - 서비스 개요 : 볼더링 유저를 위한 실시간 소통 및 운동 기록 서비스

    - 프로젝트 기간 : 23.01.09 - 23.02.17(6주)

    - 프로젝트 인원 : 5명 (백엔드 3명, 프론트엔드 2명)

    - 결과 : 반 🎉1등 수상🎉

    아이디어 기획

    1월 2일부터 1주간은 부트 캠프 기간으로 사실상 이 단계부터 아이데이션에 많은 팀들이 돌입한다.
    부트 캠프 기간에 아이디어톤을 진행하는데, 9팀 중 1팀을 제외하곤 이 때 낸 아이디어를 모두 드롭했다.

    싸피는 정말 오랜 기간 같은 주제로... 프로젝트를 진행시켜왔기 때문에,
    괜찮다고 생각한 모든 아이디어는 이미 선배기수에서 아주 잘 진행한 경우가 많았다.

    우리 조는 두 가지 정도의 아이디어를 컨설턴트님께 통과 받았는데,

    좀 더 서비스의 완성도를 높일 수 있는 "볼더링"을 주제로 한 서비스를 최종 선정했다.
    그래도 우리는 공식 1주차 화요일 정도에 아이디어를 선정 완료하여 바로 기획에 들어갈 수 있었다.
    1주차는 와이어프레임과 기술명세, 요구사항 정의서, ERD 등 서비스에 필요한 기초를 만들었다.

    기획은 최대한 빨리 끝내는 게 좋은 것 같다. 

    개발 개발 개발...

    나는 백엔드 개발을 맡았고, 팀내에 정말 잘하는 갓 전공 백엔드 친구가 있어 코드를 보고 정말 많이 배울 수 있었다!

    또한 개발이 생각보다 시간이 많이 드는데, 최대한 앞 쪽에서 많이 달려놓는 게 좋은 것 같다. (설날에도 코딩함)

    1학기 마치고 방학 기간 동안 (미완성) 토이 프로젝트를 진행하며 처음 JPA를 사용해봤는데, 그게 많이 도움이 되었다.

    내가 주로 담당한 부분을 요약하면 다음과 같다.

    1. 완등 영상 페이지 API

    [ 상황 ]

    - 볼더링 유저가 성공 영상을 올릴 수 있는 완등 영상 페이지 API 구현

    - 게시판, 댓글 기본 CRUD 기능 구현

    - 모바일에 최적화된 스크롤 방식으로 페이지네이션 구현

    - 유저의 로컬 스토리지에 있는 영상 등록시 서버단에서 썸네일 추출 및 S3에 저장

    [ 구현 방법 ]

    1) No-offset 방식의 페이지네이션

    - Page를 이용한 페이지네이션시 데이터 탐색에 있어 offset 방식으로 데이터가 검색되어 스크롤을 많이 내릴수록 처리속도 느려짐
    - Slice와 QueryDSL을 이용해 객체의 가장 마지막 id값을 기준으로 데이터를 검색하여 해당 id값 이후의 데이터만 검색해 속도 개선

       (자세한 내용은 구글링하면 관련 정보가 정말 많다!)

    2) 썸네일 자동 추출 및 영상/썸네일 S3 저장
    - JCodec을 이용하여 유저에게 받은 파일에서 썸네일을 추출해 S3에 영상과 썸네일을 동시에 저장
    - 프론트에서 영상 목록을 보여줄 땐 해당 썸네일 이미지를 기준으로 보여주게 함으로써 부하 감소시킴
    - 자세한 내용은 내가 정리한 블로그글 참조

    [ 느낀점 ] 

    - QueryDSL을 처음 써봤는데 생각보다 쉬웠다! 개발자의 의도를 명확히 알 수 있어 가독성이 좋았다.
    - 썸네일 추출에 대한 정보가 너무 없어서 찾기가 힘들었다. 미디어 컨버트를 쓰면 간단히 해결 가능하지만 비용 이슈(...)
    - 또, 추출하면서 로컬에 계속 파일이 저장되어 이걸 삭제하는 데도 애를 먹었고, 영상이 캡쳐되면서 자기 마음대로 회전하는 등 여러 이슈가 있었다.. 영상을 다루는 것은 생각보다 어려운 작업이었다!

    2. Admin 관리 권한 추가 및 API

    [ 상황 ]  

    - 기존 초기 기획에서는 OAuth를 이용해 소셜 로그인 기능만 구현해놓았음
    - 완등 영상과 관련 없는 영상을 올렸을 경우에 대한 validation check를 할 수 있는 기능이 없었음

    [ 구현 방법 ]

    - 어드민 계정은 하나만 필요하기 때문에 application.yaml에 아이디와 패스워드 값을 미리 넣어놓고, 로그인시 이 값과 일치하면 Jwt에서 admin용 Token을 발급

    - 5인 이상의 유저에게 신고 받으면 해당 영상은 자동 숨김처리 되며 어드민 페이지에서 해당 영상의 숨김 취소, 삭제 처리 진행
    - 이 때, 한 유저가 중복 신고하는 것은 신고 1개로 카운트되도록 함 (악성 신고 방지용)

    [ 느낀점 ]

    - Jwt 부분은 다른 팀원이 맡아서 진행을 했고 많은 부분을 커스텀해서 진행하여 코드를 보고 이해하는데 시간이 더 오래 걸렸던 것 같다.
    - admin 권한을 추가하는 것 자체는 어렵지 않았으나, Spring security와 jwt token 방식 자체를 이해하는 것이 어려웠다.
    - https://youtu.be/b9O9NI-RJ3o 이 강의가 많이 도움이 되었다! 흐름을 명확하게 알려줘서 좋았다. 추천추천!
    - 하지만 역시.. 안 써보면 또 까먹는다. 까먹기 전에 한 번 로그인 기능을 담당해서 진행도 해봐야겠다!

    3. 테스트 코드 작성 및 최적화 작업

    [ 구현 방법 ]

    - Service로 unit test 진행, Controller로 통합 test 진행

    [ 느낀점 ]

    - 처음 테스트코드를 작성하다보니 독립적이지 않고 다른 것에 의존적인 테스트코드가 작성을 해 이상하게 짜버렸다..

      (특정 메소드를 수정했는데, 다른 메소드의 테스트 코드가 영향을 받아 갑자기 오류가 터진다거나...)

    - 그래도 계속 작성하다보니 감도 생기고, 딱 해당 유닛에 맞는 테스트 코드를 작성할 수 있는 방법도 연습할 수 있었다.

    - 다음 프로젝트부터는 좀 더 클린한 테스트코드를 작성하는 것을 목표로!!!

    발표

    2주차 마지막에 기획 발표, 그리고 마지막 주에 최종 발표를 진행한다.

    발표는 사실 이전에도 많이 해왔고, 프레젠테이션 준비 등은 이전 회사에서 지겹게 해왔던 것이기 때문에 초반에 내가 하겠다고 했다.

    백엔드는 마지막주차에 다행히 거의 마무리가 되어, 2-3일 간은 발표 준비에 몰입할 수 있었다.

    많이 고생해서 만든 프로젝트인만큼, 발표자로서 우리의 서비스를 청자에게 명확하게 전달하고자 많이 노력했다.

    아쉬웠던 점

    1. 나는 발표자인가 개발자인가..

    사실 생각보다 발표자로서 발표 준비에 들어가는 공수가 너무 컸다.

    특히, 특화프로젝트와 본선 발표 기간이 겹치는데, 이 과정에서 또 리허설이라던지 피드백 반영해서 추가해야 할 부분이 계속 늘어나 솔직히 스트레스를 받긴 했다.

    내가 개발을 배우러 온 것인지.. 예전의 마케팅 기획발표를 하는 것인지 모르겠던 순간...

    2. 코드 리뷰 없이 어떻게든 작동만 되는 서비스 만들기에 집중된 프로젝트 진행 방식

    우리 프로젝트는 그래도 잘하는 전공자 2명의 캐리로,
    테스트 코드 작성이나 리팩토링 작업을 통해 소나큐브 버그 0건을 달성할 수 있었지만,
    사실 그래도 모두 다 교육생일뿐 정말 전문가에게 우리의 코드리뷰를 받을 수 없었다는 점이 아쉬웠다.

    우리는 서비스 자체의 매력도도 중요하지만, 코드를 잘 짜서 좋은 포트폴리오를 만드는 것에도 목표가 있었기 때문에,

    서비스 외적인 기술적인 부분에서도 발표 때 많이 어필을 했었다.

    하지만 다른 반의 얘기를 들어보면 1등 수상한 팀의 코드가 엄청난 스파게티 코드여서 그런 코드에게 진 게 억울했다거나.. 하는 얘기들을 들어, 열심히 해서 수상은 했지만 과연 싸피의 1등이 의미 있는 1등인가에 대한 의문점도 생기긴 했다.

    또, 나는 전공자 친구에게 많이 배웠지만 전공자 친구는 과연 이번 프로젝트에서 많은 것을 얻었다고 생각할까에 대한 미안함도 있었다.

    3. 더 많은 기술을 직접 적용해보지 못한 것

    CI/CD, Jwt, logging 등 사실 상당히 많은 부분을 전공 백엔드친구가 척척 해주었다.

    물론 나는 첫 프로젝트다보니 제대로 된 API를 만들고 테스트코드를 작성해보는 것도 의미 있었지만,

    또 한 편으로는 너무 기본만 한 건 아닌가? 라는 생각이 들어 아쉽긴 했다.

    다른 팀원이 한 부분에 있어서도 많이 물어보고 이해하는 과정을 가졌어야 했는데,

    내 것을 하는 거에 급급해서 제대로 물어보고 이해하는 시간을 가지지 못한 것은 좀 아쉬운 부분.

    다음 프로젝트에서는 내가 못해봤던 것 중심으로 도전해보는 시간을 가져야겠다.

    반응형

    댓글

Designed by Tistory.