프롤로그 - 자율 프로젝트만을 남겨두면서
2학기에서 진행하는 총 3개의 프로젝트 중 2개가 마무리 되었고 어느덧 자율 프로젝트에 들어서게 되었다. 자율 프로젝트는 말 그대로 팀에서 원하는 주제 및 도메인을 선택해서 진행하는 프로젝트이며 마지막 프로젝트라서 그런지 싸피에서 지원을 엄청해주셨다. 예를 들어, 학습자료 및 구독 서비스 등을 지원해준다. 이러한 지원을 받는 프로젝트이고 싸피에서의 마지막 프로젝트이며 또한 IT 프로젝트에서 처음 팀장을 맡게 되어서 그런지 잘할 수 있을지에 대한 불안감이 있었다.
본론 - PortAlio
🗂️ PortAlio
🌐 프로젝트 주제
모든 직무의 사람들을 위한 포트폴리오 공유 및 포트폴리오 기반 AI 모의 면접 플랫폼
📅 개발 기간
10월 14일 ~ 11월 19일
📋 기획 배경
개발자들은 깃허브를 디자이너들은 Behance 등을 통해 포트폴리오를 관리하는 플랫폼이 존재하는데 다른 직무의 사람들은 따로 관리하는 플랫폼이 부재하여 개인 컴퓨터에 저장하거나 블로그에 활동 경험 글을 게시하는 것 등이 다여서 이러한 점을 주목하여 기획하게 되었습니다.
🎯 목표
모든 직무를 희망하거나 종사하는 사람들의 포트폴리오를 체계적으로 관리 및 공유 할 수 있도록 하여 본인의 커리어를 알리거나 취업 및 이직에 도움을 줄 수 있도록 하는 것이 목표입니다.
📊 ERD
🛠️ 사용 기술
- 클라이언트 :
React
, TypeScript
, Tailwind.css
, redux-toolkit
- 서버 :
Springboot
, Spring Security
, oAuth2
, JWT
FastAPI
- 데이터베이스 :
MYSQL
, MongoDB
- 인프라 :
AmazoneEC2
, Docker
, Jenkins
, Nginx
- 협업툴 :
JIRA
- 형상관리 :
Gitlab
🏗️ 시스템 아키텍처
👨👩👧👦 팀원 정보 및 업무 담당 내역
팀구성
김헌규(팀장 - 풀스택), 김은섭(팀원 - AI), 박재영(팀원 - 풀스택, AI), 윤민재(팀원 - 풀스택, AI), 이진송(팀원 - 풀스택), 차상곤(팀원 - 풀스택, 인프라)
내가 담당한 업무 내역
백엔드
- Spring security와 JWT와 oAuth2를 이용한 회원 시스템 구축
- 회원 시스템 구축에 따른 회원 관련 API 설계 및 작성
- 프론트 담당한 부분을 수행하면서 관련 API 수정 및 보충
프론트 엔드
- 회원가입 및 로그인 페이지
- AI 모의면접 진행 페이지
- AI 모의면접 결과 분석 페이지
- 게시판 전체 글 조회, 검색, 상세조회 페이지
- 게시판 글 조회 시 무한 스크롤 구현
✨ 주요 기능
MarkDown 방식의 에디터를 통한 글 작성 기능
Markdown으로 손쉽게 글 작성이 가능하며 추가적으로 포트폴리오, 경력 기술서 등의 기본 양식을 제공하여 글을 더 쉽게 작성할 수 있도록 하였습니다.
작성할 수 있는 게시글은 포트폴리오, 레포지토리, 활동, 자유, 질문 게시글 등이 있습니다.
AI모의 면접 및 면접 결과 분석 기능
사용자가 작성한 포트폴리오를 기반으로 화상, 음성, 텍스트 방식으로 AI 모의 면접을 할 수 있습니다.
또한 tts & stt 를 활용하여 사용자의 포트폴리오 기반 사용자 맞춤 면접 질문 생성하였습니다.
화상 면접의 경우 화상 데이터 분석(AI Hub - Resnet-50) 면접 영상 기반 안면 인식(랜드마크) 활용 사용자 감정 분석(면접 집중도 분석) 동공 랜드마크, 상체 움직임 등 자료 활용하여 면접 집중도를 분석 하였습니다.
음성 면접의 경우 음성 데이터 분석(AI Hub - Resnet-50) 음성의 높낮이, 떨림 등 자료 활용하여 면접 집중도를 분석 하였습니다.
GPT API를 활용하여 stt 과정에서 나온 데이터를 읽기 편하게 다듬어서 사용자에게 노출시켰습니다.
채용 정보 제공 기능
원하는 직무를 선택하면 직무와 관련된 채용 정보를 알려주는 기능입니다.
🚨 트러블 슈팅
문제 1
- 문제 : spring을 실행한 후 특정 로직을 수행할 때com.fasterxml.jackson.databind.exc.invaliddefinitionexception: no serializer found for class org.hibernate.proxy.pojo.bytebuddy.bytebuddyinterceptor and no properties discovered to create beanserializer 에러가 발생. 아래의 코드처럼 entity에서 다루는 데이터를 그대로 반환할 경우 발생하였습니다.
- 문제 원인 : Hibernate는 엔티티를 지연 로딩(lazy loading)할 때 프록시 객체를 사용하여 데이터베이스로부터 실제 데이터를 가져오지 않은 상태로 유지하는데 이 프록시 객체는 Jackson과 같은 JSON 직렬화 라이브러리가 이를 직렬화하려고 할 때 문제가 발생하게 되며 Jackson은 이 프록시 객체의 데이터를 직렬화할 수 없기 때문에, no serializer found 에러가 발생했습니다.
- 해결 방법 : 직렬화 방법으로 DTO를 사용하였고 from, to, of와 같은 정적 메서드를 활용하여 DTO로 변환하는 방식으로 해결하였습니다.
문제 2
- 문제 : 화상 면접 수행 과정 중 답변을 화상과 음성을 따로 녹화 녹음하여 fastAPI 서버로 보내고 있었는데 S3에 저장한 화상 및 음성 파일이 첫번째 질문에 대한 답변들을 잘 저장이 되는데 두번째 세번째 갈수록 이전 영상 및 음성의 데이터가 남아있고 해당 질문에 대한 답변이 잘 녹화 및 녹음이 되지 않는 문제가 발생하였습니다.
- 문제 원인 : 이전 질문에 대한 답변을 녹화 및 녹음 해두는 videoChunksRef와 audioChunkRef를 변수를 비워주지 않았기 때문에 이전 기록에 대한 내용들이 담겨 있었기 때문에 발생했습니다.
- 해결 방법 : 녹화와 녹음에 대한 데이터를 담는 변수인 videoChunksRef와 audioChunkRef를 녹화 및 녹음이 끝날 때마다 초기화를 시켜주어 해결을 하였습니다.
🤔 프로젝트 회고
-
아쉬웠던 점
- 이번에 IT 프로젝트에서 팀장을 처음 맡아서 프로젝트를 진행했는데 바쁜 시기에 너무 정신이 없었어서 디테일한 부분을 신경써주긴 했으나 완벽하게 신경을 잘 써주지 못했다는 점.
- 마감 마지막 날까지 기능 구현을 했었는데 일정 조율 면에서도 팀원들의 수준을 잘 신경써서 진행하지 못했던 점.
- 프론트엔드 및 백엔드 테스트 코드를 짤 시간이 없어서 작성하지 못했던 점.
-
개선 방안
- 기존 팀 스크럼은 매일 진행하였으나 개인간의 1:1 미팅을 하지 않았어서 정기적인 1:1 미팅을 통해 팀원들의 어려움이나 의견을 청취하고, 필요한 지원을 제공하는 방법으로 개선하기.
- 바쁜 와중에도 정신 없어 하지말고 좀 더 넓게 진행 상황 및 요청 사항을 바라보기 등을 개선 하기.
-
깨달은 점
- 문제 해결에서의 교훈
- 이번 프로젝트에서는 기술적 문제를 해결하며, 문제의 원인을 명확히 분석하는 것이 얼마나 중요한지 깨달았습니다. 특히 Hibernate에서 발생한
no serializer found
오류를 해결하며, DTO를 적극적으로 활용하는 방법을 익혔고, 이를 통해, 데이터 처리와 API 설계에 대한 더 깊은 이해를 얻을 수 있었습니다.
- 팀장으로서의 성장
- 처음으로 팀장을 맡아 프로젝트를 진행하면서 팀원 간의 원활한 소통과 일정 조율의 중요성을 절실히 느꼈습니다. 팀원 각각의 역량과 상태를 이해하지 못한 채 일정과 작업을 배분한 것이 프로젝트 후반으로 갈수록 비효율적으로 작용했음을 깨달았습니다. 이 경험을 통해 정기적인 1:1 미팅과 세부적인 작업 분담이 필요하다는 점을 배웠으며, 앞으로는 더 나은 리더십을 발휘할 수 있도록 노력하겠습니다.
- 기술적 성장
- JWT와 OAuth2를 사용한 회원 인증 시스템을 구축하며 보안의 중요성을 실감했고, 특히 토큰 기반 인증에서 refresh token과 access token을 효과적으로 사용하는 방법을 배웠습니다. 또한 Spring Security와 필터 체인을 설계하며, 인증 과정의 구조적 이해를 깊이 있게 다질 수 있었습니다.
- 향후 다짐
- 이번 경험을 통해 문제 해결 능력과 리더십 역량의 부족한 부분을 알게 되었고, 이를 보완하기 위해 프로젝트 관리 도구(Jira, Gantt Chart 등)의 활용도를 높이고, 정기적으로 팀원들과 소통하며 프로젝트를 성공적으로 이끌어 나갈 것입니다. 또한, 기술적인 깊이를 더해 더 나은 해결책을 제시할 수 있는 개발자가 되도록 성장해 나가겠습니다.
결론
😊 후기
자율 프로젝트를 마지막으로 싸피에서의 모든 프로젝트를 마무리하게 되었는데 이번 프로젝트는 비전공자 6명이서 한 프로젝트여서 퀄리티적으로 많이 미숙하였지만 나를 포함한 팀원들 모두 실력적으로 폭풍 성장한 계기가 되어 제일 보람찬 프로젝트였지 않나 싶다.
또한 이번에 개발 프로젝트에서 첫 팀장을 맡아서 진행하였는데 처음 기획 단계부터 열정만 앞섰기에 너무 복잡하게 기획을 하여서 팀원들이 정신 없었지 싶은데 기획 이후 개발과 배포까지 잘 따라와준 팀원들에게 정말 고맙다는 말을 전하고 싶다.(모두 고생했어요!! ㅎㅎ)
돌이켜보면 마지막까지 시간에 대한 압박을 받으면서 개발을 하다 보니 스스로 나 자신에 대해서 질책하고 또 팀원들에게 압박을 넣고 불평불만을 늘어놓았던 적이 있는데 이러한 모습이 지금 봐서는 너무 부끄럽다. 그래서 앞으로 하는 팀 프로젝트에 있어서는 좀 더 단단한 사람이 되어서 어떠한 시련이 와도 아무런 불평 없이 묵묵히 해내는 사람으로 성장하도록 노력을 해야겠다는 생각이 들었다.
마무리로 1년이라는 시간 동안 싸피에서 파이썬으로 알고리즘을 풀고 4개의 프로젝트를 진행했는데 정말 힘들었는지 1년이라는 시간이 흘렀는지도 모를만큼 빠르게 흘렀다. 그만큼 인생에 있어서 제일 몰입했던 시간이라고 정의할 수 있을듯하다. 앞으로는 취업 준비를 할 예정인데 나를 포함한 모든 싸피 분들이 빠른 취업을 할 수 있기를 바란다.