minzzl

[후기] 종합프로젝트 설계2 , 내가 했던 프로젝트 중 가장 아픈 손가락? 본문

회고

[후기] 종합프로젝트 설계2 , 내가 했던 프로젝트 중 가장 아픈 손가락?

minzzl 2023. 5. 14. 11:33
728x90
반응형

개요

 

 

안녕하세요,

어제 종합프로젝트 설계1의 회고를 마치고 나니 종합 프로젝트 설계2의 회고를 안하고 넘어갈 수 없더라구요 ...

사실 종합 프로젝트 설계 프로젝트도 2022년 3월에 했던 거라, 1년 전의 그 때를 찬찬히 되짚어봐야한답니다 .. ㅎㅎ 

그래도 가장 기억에 남는게 있다면, 해당 프로젝트를 할 당시에는, 학부생으로서 마지막 프로젝트라는 생각으로 의지가 아주 활활 타 올랐던 것으로 기억이 납니다.

 

종합프로젝트설계2?

 

지난 포스팅에서도 잠깐 언급을 했었습니다만, 경북대학교 컴퓨터학부는 3학년 2학기에 종합프로젝트 설계1을, 4학년 1학기에 종합 프로젝트 설계2를 수강하도록 커리큘럼이 구성되어 있습니다.

뭔가 1,2 로 구성되어 있다보니 두 개의 과목이 연관성이 있지않느냐라는 의문을 품으실 수도 있을텐데요 ...

사실 전혀 연관성이 없답니다?

그냥 별개의 과목입니다 ..

 

또, 저는 컴퓨터학부의 전공 중 글로벌SW융합 전공이었는데(약간의 TMI ..?), 제 전공의 경우 종합프로젝트설계2가 필수 전공이 아니었기에 굳이 듣지 않는 친구들도 많았답니다 ..

 

그럼에도 불구하고 제가 해당 과목을 수강한 이유는, 종합프로젝트 설계1을 통해 많이 성장했다고 생각했기때문입니다.

저만 그런지는 모르겠지만 .. 해커톤이나 .. 여타 대회에 출전하여 프로젝트를 진행하다보면, 시간 상의 문제로 겉보기로만 작동 가능하도록(?) 구현을 한 적이 많았습니다. 또 시간상의 문제로 여타 예외처리는 그냥 무시한적도 빈번했구요. ㅎ

 

그래서 프로젝트가 용두사미가 된적이 많았습니다..

 

그런데 종합 프로젝트 설계과목을 들으며 그런 저의 모자란 부분에 개선이 되었다고 생각했습니다. "내가 구현하고 있는거, 해당 기업체의 사용자들이 쓸텐데 이러면 안되지" 하는 생각으로 말이죠 ..

그래서 조금 더 나은 개발자가 되고 싶은 마음에(?), 조금 더 성장하고자 해당 과목을 수강하게되었습니다.

 

팀구성

 

종합프로젝트 설계1을 함께 수강했던 친구들은 교환학생을 하러 ... 외국으로 갔기에 .. 다른 친구들과 팀 구성을 하게되었습니다.

저 포함 총 3명이 프로젝트 진행을 했습니다. 

제가 처음에 제가 했던 프로젝트 중 가장 아픈 손가락이었다라고 언급을 했었는데 .. 그 이유가 여기에서 나온답니다 ..

함께 팀을 구성했던 친구들은 따로 종합 프로젝트 설계1을 수강하지 않아 프로젝트 경험이 거의 없었고, 졸업 준비로 한창 다들 바빴기에 .. 제가 Backend와 Frontend 부분을 도맡아 담당하는 대 참사가 일어납니다 .. 🥹

물론 다른 팀원들이 역할을 소홀히 했다거나의 의미라기 보다는 .. 저를 포함한 팀원이 할 수 있는 힘에 비해, 그냥 제 의지가 불타올랐고, 그를 다 이행하고자 스스로를 활활 태웠다고 생각합니다 .. 

 

주제.. 그리고 선택 이유

 

그 당시 주어진 주제 목록은 다음과 같았습니다.

 

  • 탄소중립을 위한 ESG 추천 AI 기반의 대화형 챗봇 개발
  • AR 증강현실을 활용한 가구 인테리어 시스템

     
  • Chatting application with WebRTC
  • deep-learning을 활용한 photomosaic 개발
  • BlackMagic 관리 서버 개발
  • IoT 생체신호 감지 모듈 개발
  • AI・AR을 활용한 관광지용 모바일 앱 개발

 

그 중 "deep-learning을 활용한 photomosaic 개발" 을 선택했습니다.

 

 

사진 이미지를 활용해 재미 요소를 가미한 서비스를 제공한다는 점에서 흥미를 느꼈기 때문입니다.

 

준비 과정

 

우선 빈즈 소프트라는 회사와 함께 프로젝트를 진행하게 되었습니다.

 

https://www.jobplanet.co.kr/companies/347106/reviews/%EB%B9%88%EC%A6%88%EC%86%8C%ED%94%84%ED%8A%B8

 

일 열심히 하면 다른건 터치 안함. 연차 사용을 자유롭게 할 수 있음.

일 열심히 하면 다른건 터치 안함. 연차 사용을 자유롭게 할 수 있음. (장점) 연차를 자유롭게 사용할 수 있다. 일 외에 다른건 신경 안써도 된다. (단점) 딱히 단점이라곤 잘 모르겠으나, 너무 일

www.jobplanet.co.kr

 

저희가 가장 처음 받았던 제안서는 아래와 같은데요, 

지난 종합프로젝트 설계1에서는 기업체에서 요구하는 조건대로 프로젝트를 수행했다면, 빈즈 소프트 측에서는 아주 자유로운(?) 분위기로 프로젝트가 진행되었습니다.

 

기업체측의 요구 사항을 파악하기 위한 온라인 회의를 가졌었는데, 사실 주제를 제외하고는 특별히 요구하는 조건도 없었고, 회의 시에도 그냥 필요한 부분이 있으면 도와주겠다는 말씀을 남기셨습니다.

 

 

솔직히 저는 그러한 부분에서 긍정적인 입장은 아니었습니다. 왜냐하면, 우선 프로젝트를 완성도 있게 마무리해서 좋은 학점을 받고 싶은데, 프로젝트 완성도를 결정하는 기업체의 요구조건이 모호하다고 느꼈기 때문입니다. 또 기업체와의 활발한 커뮤니케이션을 원했기 때문입니다.

 

그 당시에는 서운하고 아쉬운 감이 많았지만, 지금 생각해보면 그 분들도 회사 업무 일로도 바쁠테고, 또 학부생에게 실제 회사에 직접적인 영향을 주는 서비스 개발을 맡긴다는 것은 서로에게 가중되는 부담이 클테니, 그랬지 않았을까하는 생각이 듭니다.

 

어찌되었건, 제가 그 당시 결정한 것은, 최대한 주제에서 이끌어 낼 수 있는 완성도 높은 서비스를 만들어보자는 것이었습니다.

 

제가 지난 종합프로젝트 설계1에서 개발을 Flutter로 진행한 적이 있었기에 이번에도 Flutter로 진행하게되었습니다.

또 기업체 측에서도 회의 당시 Flutter에 대한 언급을 해주셨기에, 팀원들도 호기심을 가지고 Flutter를 사용해보기로 결정했습니다.

 

저희가 수행 계획 부분에 발표 한 서비스의 기능들입니다.

저는 그 중 Photomosaic을 활용한 사진 생성의 Backend 부분과,  

Photomosaic 공유, 그리고 사용자 History 관리의 전반적인 부분을 담당하게되었습니다.

조금은 여담으로 말을 덧붙여보자면 ..

저만 그런지는 모르겠으나, 프로젝트를 할 때, 항상 원하는 업무를 맡게 되지는 않는 것 같습니다. 🥹

어떤 때는 Frontend를, 또 어떤 때는 Backend 를 맡게 되기도 합니다. 그냥 어떤 서비스를 만들어낸다는 것 자체에 흥미가 있어 Frontend 든 Backend 든, 기회가 되는대로 일을 맡곤 합니다. 그런데 이렇게 Frontend와 Backend의 경계 없이 프로젝트에 뛰어들다보면 서비스의 전체적인 구조를 잘 이해할 수 있다는 점에서는 장점이 될 수도 있지만, 가끔은 스스로가 이도저도 아닌 것 같은 느낌이 들곤합니다. 그래서 이 부분이 가장 개선할 부분이라고 생각합니다. 하나의 프레임워크를 완전히 이해하기 ! 

 

그런데 달리 생각해보면, 이렇게 개발의 영역 구분없이 다 해보는거 학부 때 해보지 언제 해보겠어요 ~ 

라며 .. 위로하기 ^^

 

그래서 니가 한건 뭐니?

 

공유 공간을 만들자

 

우선 종합 프로젝트 설계1 수강 후 공유 공간의 중요성을 느끼게되었습니다.

수행 계획서를 작성하고, 발표 자료를 만들고, 최종 보고서를 작성하고 ... 각종 자료들을 공동 작업 한 후에는 항상 카카오톡으로 공유를 하곤 했었는데, 필요할 때 마다 대화방을 뒤지려니 꽤 비효율적이라고 느껴 공유 드라이브 공간을 생성했습니다.

 

 

1) 프로젝트용 드라이브 공간 만들기

또한 슬랙을 통해 업무보고를 하도록 했습니다.

카카오톡에 프로젝트 용 단체 채팅 방이 있었지만, 사적인 이야기와 업무적인 이야기가 구분되지 않았기 때문에 업무적인 내용 보고는 슬랙을 통해 보고하기로 결정했습니다.

 

2) 슬랙 이용하기

 

 

(지금은 기간이 만료되어 대화 내용이 안보이네요 .. ㅜ)

 

논문 .. 작성 ..

네.. 또 논문입니다.. 하하

개발을 진행하기 앞서, App의 주요 기술인 Photomosaic 기술을 분석함으로서 사용자에게 서비스 제공 극대화를 위해 노력했습니다. 특히 Photomosaic 기술의 성능에 영향을 주는 요인을 분석하고 평가했습니다.

 

포토모자이크 기술의 성능에 영향을 주는 요인을 분석하고 평가하기 위하여 알고리즘 종류, 데이터베이스를 구성하는 이미지의 개수를 변화시키며 생성되는 이미지를 비교했습니다. 또한 데이터 베이스를 구성하는 이미지에 따른 성능 비교의 경우, 단조로운 이미지와 복잡한 이미지 두 가지 경우의 원본 이미지 대비 생성되는 모자이크 이미지를 비교 분석하여 목표 이미지의 특성에 따른 결과를 확인했고,

 데이터베이스 내의 소스 이미지의 개수가 많아질 수록 타깃 이미지의 각 셀마다 가지고 있는 고유한 값을 표현하기 위한 비교 가능한 셋이 많아지기 때문에 처리 시간이 증가하는 문제를 확인 할 수 있었습니다 ..

 

사실 뭐 그리 대단한 내용이 아니긴 하지만 , ㅎㅎ  해당 내용을 바탕으로 논문을 작성했습니다. 

 

서버를 제공받을 수 없다면 만들자 !

서비스 시스템 아키텍쳐

 

서버는 기업체에서 제공 받고자 하였으나 기업체에서 물리 서버의 gpu를 사용 및 보안 상의 문제로 제공받지 못하였습니다. 이와 같은 문제를 해결하고자 처음에는 multipass에서 제공하는 가상 환경 및 docker를 이용해 서버를 구축하였습니다. 또한 향후에는 안정성을 위해 연구실에서 쓰지 않는 데스크톱을 제공 받아 포트 포워딩 등의 작업을 추가적으로 해주었습니다.

 

 

DB 부하를 고려하기

 

저희는 photomosaic 서비스를 제공하는 앱을 만들기로 결정했었습니다. 

 

 

그래서 가장 먼저 걱정했던 것이, 이미지 관리를 위한 데이터 베이스를 어떻게 하면 좋을지에 대한 부분이었습니다.

흔히 많이 사용하는 MSSQL에 이미지 파일이 저장은 가능하나, 해당 서비스의 경우 대용량의 이미지 파일을 저장해야하기 때문에 DB 부하가 걱정되었기 때문입니다. 그래서 기업체에 해당 부분에 대한 조언을 구했고, 따로 이미지 파일 저장을 위해 사용중인 데이터 베이스가 없었기에, 무료로 사용가능한 Minio Object Storage를 사용하기로 결정했습니다. 

 

 

참고로 이미지 객체는 Minio에 저장하고 이미지의 메타 데이터는 PostgreSQL을 사용했습니다.

 

 

Pixabay로 소스 이미지 Crawling

 

앞선 서비스를 위해서는 소스 이미지들이 대량으로 필요했습니다. 특히 저작권이 없는 대량의 이미지들이 필요했는데요, 이에 Pixabay를 사용하기로 결정했고, Pixabay에서 이미지를 Crawling 해오기 위한 코드도 작성했습니다.

 

 

사실 Pixabay에서는 이미지 크롤링을 위한 API가 존재합니다. 그런데 버전의 문제인지? 그 당시에는 작동하지 않았습니다.

그래서 Pixabay에서 제공하는 API를 일부 수정하여 키워드에 맞게 이미지를 Crawling 해오도록 하는 코드를 작성하였습니다.

 

해당 코드는 아래의 깃허브에 업로드 해두었습니다.

 

https://github.com/wlwl1011/Pixabay_Crawler_2

 

GitHub - wlwl1011/Pixabay_Crawler_2: Pixabay Crawler using pixabay api

Pixabay Crawler using pixabay api. Contribute to wlwl1011/Pixabay_Crawler_2 development by creating an account on GitHub.

github.com

 

처음 해보는 언어 Go... 

 

Go를 선택한 것은 .. 연구실 선배의 역할이 컸습니다.

왜냐하면 현재 연구실에 있는 선배가 Go 장인이시거든요 .... 

 

 Photomosaic 생성 관련 된 서버는 아래 같이 작성했습니다. model 파일은  DB에 접근하는 실제적 코드를, router파일은 태스크별로 생성한 컨트롤러 연결 및 컨트롤러 초기화를, photomosaic.py는  Photomosaic 모델을 모듈화 한 것입니다.

 

 

 우선 사용자가 Photomosaic 생성을 위한 동작 과정은 아래와 같으며 서버와의 통신이 필요한 부분은 붉은 색으로 표시했습니다.

 

참고로 .. 서버와 주고 받는 정보는 다음과 같았습니다. 

App Server
- uid : User ID
- theme : source image theme
- files : Photomosaic target image
- status : 생성 성공 여부

 

우선 UserID는 회원가입 시 FireBase 사용자 별로 고유로 부여되는 값이며,  Theme은 사용자가 선택한 soure image의 주제입니다. 이 때 해당 주제에 따라 Target 이미지를 이루는 소스 이미지가 선택이 되며 주제는 총 6가지로 분류하였습니다. 해당 주제에 따라 저장된 이미지는 Pixavay에서 크롤링 해 온 값이며 Phomosaic 생성을 휘한 타깃 이미지는 file form 형태로 전송하였습니다.

 

커뮤니티

 

 

커뮤니티를 통한 사용자 간 교류 기능도 구현했습니다.

 Flutter 앱에서 Stream을 사용하기 위해 StreamBuilder 위젯을 사용했고 이 때 StreamBuilder란 이벤트를 구독 가능하도록하여 매번 이벤트 전달 시 새롭게 리빌드 하여 최신 데이터를 반영 가능하도록 했습니다.

 

이 밖에 제가 구현한 것은 아니지만 SNS 로그인 및 카카오톡 공유하기 기능또한 구현했습니다.

 

가장 힘들었던 것

 

해당 프로젝트를 진행하며 가장 힘들었던 것은 팀원들과의 소통문제였습니다.

 

팀원 중 한 명이 모종의 이유로 잘 참여를 하지 않았습니다 ..

3월 17일에 만든 깃허브에 4월 28일까지 한 번도 코드를 올리지 않았었는데요 ... 

사실 처음있는 일이라 어떻게 해야할지에 대한 감이 잡히지 않아 그 당시에 혼자 속을 태웠습니다.

또 그냥 화를 내서 서로 마음 상하기보다는 그냥 제가 그 일은 대신해서 하는게 마음 편하다고 생각했기에 프로젝트 동안에 이러한 일이 반복되곤 했습니다 ㅜㅜ 

 

그래서 해당 프로젝트 후에 팀원 간의 소통에 대해 끊임없이 고민해오곤했는데, 지난 미국 샌프란 시스코에서 만난 에디님께 해결책을 얻었답니다!

 

PM을 하시는 분이셨는데, 팀원들에게 Positive Pressure을 하려고 한다고 하셨습니다. 단순히 일 얼마만큼 했니가 아니라, "나 정말 궁금해서 그런데, 일이 어디까지 진행이 됐어?? 혹시 도움이 필요한 건 있어?"라고 반복적으로 물으며, 어찌보면 무언의 압박일 수도 있으나 결론적으로 일을 효과적으로 시킬 수 있는 좋은 방법이라며 조언해주셨습니다 !

 

사실 해당 프로젝트 이후에 마주한 프로젝트들에서는 팀원들끼리의 합이 잘 맞아 일이 순조롭게 진행되어 아직 사용해본 적은 없지만, 나중에 기회가 된다면 꼭 써먹어봐야겠습니다 !!

 

 

마무리

 

저에게 주어진 분량도 많았고, 일도 순조롭게 진행되지는 않았어서 했던 프로젝트들 중 가장 마음이 아픈, 그런 프로젝트입니다 ..

 

 

그래도 이렇게 회고를 하니 한편으로는 홀가분한 기분이네용

 

프로젝트 코드는 아래에 있답니당 ~ 

 

https://github.com/wlwl1011/Photomosaic-DMM

 

GitHub - wlwl1011/Photomosaic-DMM: Deep learning을 활용한 Photomosaic 서비스 개발

Deep learning을 활용한 Photomosaic 서비스 개발. Contribute to wlwl1011/Photomosaic-DMM development by creating an account on GitHub.

github.com

 

긴 글 읽어주셔서 감사합니당

728x90
반응형