카테고리 없음

소프트웨어 정글을 끝내며 (2)

infra-whale 2024. 12. 26. 17:58

14 주차 ~ 끝 : 나만의 무기 만들기

정글에서 가장 힘들기도 했고, 가장 재밌었던 과정이었다. 이전부터 늘 하고 싶었던 게 나만의 프로젝트를 만드는 것이었고, 이걸 열정있는 사람들이랑 같이 달성할 수 있다니. 전에 비슷한 걸 해보려 했지만, 같이 하려고 하는 사람들의 참여도가 낮아 프로젝트가 무산된 경험도 있었기에 더 각별했던 것 같다.

첫 번째 주

기획에 빠져 지냈다. 단순히 아이디어가 좋아야 할 뿐만이 아니라, 소프트웨어 정글 운영진 분들이 보시기에 만족할만한 주제와 기술적 난이도를 모두 만족시켜야 했다. 정말 많은 아이디어가 오고갔지만, 거의 대부분이 운영진분들께 퇴짜를 맞고 ... 사라졌다. 그중에는 12 ~ 13주차때부터 열심히 생각했던 것들도 있어서 좀 허무하기도 했다.

우리가 생각했던 것들은 다음과 같은 게 있었다.

  • 점주에게 솔직한 리뷰를 줄 수 있는 서비스
  • 외모 개선 루틴 추천 AI 서비스
  • 운동 자세 교정 AI 서비스
  • 증강현실 방탈출 게임
  • 플로깅 (거리에서 쓰레기를 줍는 활동) 서비스
  • 강의 녹음 및 문제 출제
  • 직소퍼즐 맞추기 게임
  • 주식 종목추천 프로그램
  • 보험 추천 프로그램
  • 덕질 커뮤니티
  • 팬덤 간 화력 경쟁 커뮤니티
  • 유튜브 영상 추천 서비스
  • 아파트 커뮤니티
  • 다인이서 가능한 포트리스 게임
  • AI를 활용한 TRPG 메이커
  • 장바구니 공동구매 서비스
  • 코드 리뷰 서비스
  • AI를 활용한 부트캠프 공고 분석 서비스
  • 내가 현재 하고있는 구독 관리 서비스
  • Chat Gpt 개선 서비스
  • 유튜브 강의를 활용한 스터디를 보조하는 서비스
  • 다이어트 앱 - 식단을 촬영하면 AI가 칼로리와 영양성분을 분석
  • 야간 택시 카풀 서비스
  • 부업, 투잡 찾기 서비스
  • 취미 예약 앱

이들 중 강의 녹음 및 문제 출제 서비스인 "Lec-bbit"과, 장바구니 공동구매 서비스인 "사자하마" 를 운영진들께 보여드렸고, 이중 Lec-bbit을 더 발전시켜보자는(사용 대상을 좁혀보고 기능을 더 구체화해보자는) 피드백을 받았다.

 

Lec-bbit은 수업을 듣는 학생 중 한 명이 강의를 녹음하고 이를 AI가 자동으로 회의록과 요약본, 예상 문제를 만들어주는 서비스였다. 이를 더 발전시키기 위해 우리는 이 기획의 여러 버젼을 만들어보았다.

기획 중간중간 끊임없이 쓰고 지웠던 화이트보드

 

Lec-bbit ver.2

위의 서비스의 대상을 개인 사용자에 바꾸고 공부한 내용을 정리할 때 AI의 보조를 받는 서비스

 

Ma-bbit

기업 매뉴얼 간편 제작 서비스

 

Study-bbit

비대면 스터디 관리 서비스

 

우리는 마지막을 선택했고, 개발에 착수하였다.

두 번째 주

Study-bbit에서 우선적으로 구현되어야 하는 핵심 기능은 다음과 같았다.

  • 스터디룸을 생성하고, 그 안에서 화상 스터디를 한다. 각 스터디원의 음성과 영상을 볼 수 있다. 
  • 음성을 AI가 텍스트 형태로 변환하고, 이를 정리해서 파일 형태로 남겨둔다.

해당 주 안에 만들기로 한 서비스의 프로토타입을 완성하고 발표해야 했다. 각자 역할이 나누어졌고, 내가 할 일은 다음과 같았다.

  • 작동하는 화상 스터디 구현
  • 인프라 스트럭쳐 구축

둘 다 내겐 생소한 개념이었다. 구글링을 해 본 결과, 화상 회의는 webRTC라는 기술을 이용하면 가능하다고 하여 이를 직접 구현한 리포지토리와 webRTC의 기본 개념을 참고하여 간단한 화상 회의를 구현하였다. 하지만 작동만 될 뿐, 5~6명 정도가 모이면 성능이 저하되고, 7명 부터는 기존에 들어가 있던 사람들도 접속이 끊어지는 등 문제가 많았다.

 

좀 더 찾아본 결과, webRTC 연결 방식은 총 3가지가 있었고 내가 사용했던 방식은 가장 간단하게 구현 가능한 Mesh 방식이었다. 이는 간단하긴 하나, 클라이언트 하나가 여러 대의 클라이언트에게 영상을 송출하므로 대역폭이 줄어드는 문제가 필연적으로 발생할 수 밖에 없었다. 결국 성능 문제를 해결하려면 다른 방식인 MCU나 SFU를 고려하여야 하였다. 이 무렵 즈음 코치님께 질문을 드렸을 때, Openvidu라는 이미 구현된 SFU 서버의 존재를 확인할 수 있었다.

MESH와 SFU 차이

 

Openvidu는 livekit과 mediasoup라는 서비스를 혼합하여 구현되었고, 한번 서버를 구축하면 livekit의 컴포넌트들을 적절히 조합하여 비교적 쉽게 화상통화 구현이 가능하였다. 하나의 단점이 있다면 막 v2에서 v3로 업데이트 되면서 문서화가 부족하게 되어 있단 점이었다. livekit과 mediasoup의 문서까지 정독하고, 이전에 다른 사람들이 구현하였던 후기들도 찾아보면서 부족한 부분들을 채워나갔고, 결국 3일정도 걸려서 간단한 SFU 화상통화 방을 만들 수 있었다. 테스트 결과 기존 6명정도 수용 가능한 서비스를 16명까지 문제없이 수용 가능하게 만들 수 있었다.

 

다음은 인프라 구축을 고민해야 하였다.

 

우리가 배포해야 할 것은 4가지였다. 오픈비두를 이용한 SFU 서버, 리액트를 이용한 프론트엔드 서버, 스프링 부트를 이용한 백엔드 서버, 마지막으로 오픈비두와 OpenAI의 API를 이용하기 위한 express.js 서버가 있었다.

이들 중 프론트엔드 서버와 express.js 서버의 경우 둘다 npm을 사용하여 의존성이 겹칠 가능성이 있었다. 이를 신경쓰지 않고 편하게 관리하기 위해 도커 컨테이너를 사용하였고, 도커 허브로 이미지를 편하게 push & pull 할 수 있는걸 보고 백엔드 서버까지 도커로 배포하였다.

 

또한 주요 변경사항이 생길 때마다 팀원들의 요청을 받아 배포하는 과정이 너무 번거로워, 중간 업무 흐름이 끊길 때가 있었다. 두 가지 중 하나를 선택할 수 있었다. 팀원들 전부에게 도커로 배포하는 과정을 가르쳐주거나, CI/CD를 구축하거나.

난 후자를 선택했고, Github action을 통해 코드가 merge 된 경우 이를 EC2에 자동 배포하도록 설정하였다.

 

마지막으로 오픈비두가 생각보다 리소스를 크게 사용하여 t3.medium 한 대를 사용하기에 무리가 따랐다. 오픈비두의 최소 사양은 4개의 코어와 8GB의 램을 사용하는 컴퓨터였으나, 자금 사정상 이에 맞는 large 혹은 xlarge EC2를 사용하기는 조금 부담스러웠다. 결국  t3.small EC2를 한 대 더 구비하여, 여기서 프론트엔드 서버, 백엔드 서버, DB서버를 사용하는 방향으로 변경하였다.

최종 완성된 인프라 스트럭쳐

 

추가적으로 AI 회의록 기능까지 완성되어 프로토타입은 성공적으로 완성되었다. 하지만 운영진분들께 마지막 발표에서 선보이기엔 "뾰족하지 않단" 말씀을 들었다. 이 이후로는 대상 사용자들에게 맞는 기능을 추가하는데 집중하였다.

 

세 번째 ~ 네 번째 주

추가적으로 기능개발을 하기 위해서는 우리 서비스를 누가 쓰는지 더 생각해볼 필요가 있었다.

  • 개인적으로 스터디 그룹에 모여서 각자 공부를 하고 성장을 하고 싶은 경우
  • 열심히 활동하는 스터디 그룹에 들어가 활동하는 경우
  • 스터디 그룹에 모여 모의면접이나 토론 등을 하면서 다른 사용자와 상호작용을 하는 경우
  • 스터디장으로서, 불량 사용자를 거르고 싶은 경우

따라서 우리는 다음과 같은 기능들을 개발하였다.

  • 다른 사용자의 프로필을 조회하여 해당 사용자가 열심히 활동하는지 확인
    • 출석률의 지표인 "몰입온도"와 최근 평균 공부시간을 조회 가능하다.
  • 화상채팅 안에서 공부시간을 기록
    • 기록한 경우, 깃허브 잔디처럼 확인 가능하다.
  • AI 회의록 모드 설정
    • 일반모드, 면접 모드, 토론 모드가 있으며 각 모드별로 다르게 정리해준다.
    • 예를 들어 면접 모드인 경우 질문에 대한 대답이 적절한지 평가해주고, 꼬리 질문까지 생성해준다.
  • 출석부
    • 지각하거나 결석한 경우 방장이 출석부에 기록한다.
    • 이 경우 몰입온도가 깎인다.
  • 강퇴 및 블랙리스트 등재
  • 일정 생성 및 수정 시 그룹으로 묶기
    • 묶인 그룹은 한 번에 수정 가능하다.
    • 예를 들어 그룹이 매주 월, 수, 금을 스터디 시간으로 설정하였다면, 이를 화, 목, 토로 변경한다.
  • 다른 사용자에게 쪽지를 보내는 기능
  • 알림 기능
    • 쪽지가 오거나 회의록이 생성되면 알림을 생성한다.

결과적으로 이런 결과물이 탄생하였다.

5주차

혹시나 어디서 문제가 터지지 않을까 QA를 진행하고, 크래프톤 본사에서 있을 발표와 시연 준비를 하다보니 어느덧 발표일이었다. 긴장이 되어서 잠도 거의 자지 못했고, 점심에 먹은 김밥도 입으로 들어가는지 코로 들어가는지 구분되지 않은 것 같다. 다행이도 우리 조 포함해서 모든 조가 실수 없이 무사히 마칠 수 있었고 이어지는 포스터 세션에서도 우리 프로젝트에 다들 많은 관심을 가져주셔서 뿌듯하였다.

 

정리하면서

이렇게 모든 소프트웨어 정글 활동이 끝났다. 많은 것들을 배웠지만 아쉬웠던 것들도 꽤나 있었던 것 같다.

체력관리에 소홀했던 점

후반부에 많이 바빠지면서 식단과 운동에 거의 신경을 쓰지 못했다. 이는 컨디션 악화로 이어졌고, 이게 길어질수록 오히려 업무 효율이 떨어졌다 생각한다.

기록에 소홀했던 점

할 일이 많았다는 핑계가 있었지만, 정글에 있으면서 정말 많은 문제 상황에 부딛혔을 때 그때그때 기록하지 못하였다. 실제로 정글에 있을 때 작성했던 블로그 글을 보면서 "내가 이런것도 파봤다고?" 하면서 감탄하기도 하였다. 즉, 공부하였지만 잃어버린 것도 몇 개 있었던 것 같아 아쉽다. 더이상은 핑계 대지 말고 안 것들을 착실하게 기록해나가자.

최종 프로젝트때 넘겼던 것들

시간이 부족하여, 도커를 도입하거나 인프라 스트럭쳐를 짤 때 이론적으로 많은 걸 알아보지 못하였다. 또한 에러가 발생하였을 때, 어떤 에러가 발생했는지 정도만 기록해두고 왜 해당 에러가 발생하였는지 자세히 정리하지 못했었다. 마지막으로, 백엔드 코드를 작성할 때, 단위 테스트와 리팩토링을 수행하지 못했다. 앞으로 취업준비를 하면서 이것들을 블로그에 조금씩 정리해 나갈 예정이다.

배웠던 개념들

4~6주차에 배웠던 컴퓨터 시스템 개념들과 PINTOS 주차에 배웠던 운영체제 개념들이 점점 가물가물해진다. 이는 기술면접 스터디를 해나가면서 다시 채워나갈 예정이다.

 

모든 과정이 끝났지만 사실 끝이 아니다. 다시 시작이다. 날이 갈 수록 심해지는 불경기에 레드오션인 개발자 시장이 암울하기만 하지만 고민만 해봐야 아무것도 해결되지 않는다. 착실히 내 부족한 점을 찾고 이를 메워가다 보면 언젠가 나도 그토록 염원하던 백엔드 개발자로서 일하고 있으리라 믿는다.

 

즐거웠어요 문지캠퍼스. 다시 만날때까지 안녕