첫 미니 프로젝트 후기 - 플레이데이터 인공지능SW개발자10기
교육과정이 시작된지 이제 곧 한달이 되어가는 시점에서 드디어 첫 협업 프로젝트를 진행하게 되었다. 지금까지 기획자로서 개발자와 함께하는 협업은 많이 해봤지만 초보 개발자로서 다른 사람들과 함께 개발을 하는 프로젝트는 처음이었기 때문에 배운 점들도 많았고 앞으로 어떤 능력을 더 키워서 어떤 개발자가 될 것인가에 대한 고민을 시작할 수 있는 계기가 되었다.
프로젝트 설명
개요
- 프로젝트 주제: 배달 어플리케이션 구현하기
- 참여인원: 6명
- 소요기간: 약 5일
- 사용기술: Python, MySQL
- 프로젝트 목표: DB 모델링 및 VO, DAO, Service 개념을 포함한 객체지향 프로그래밍을 실제 프로젝트에서 사용해보고 익숙해지는 것
기획
주제 선정
프로젝트 주제 예시로 학사관리 시스템, 창고 물류관리 시스템 등이 있었는데 조금 더 현실에서 많이 접할 수 있고 비즈니스적으로도 접근해볼 수 있는 프로젝트를 하고 싶었다.
마침 주제 선정을 위한 회의를 하던 때가 점심시간에 가까웠고, 점심 메뉴를 고르기 위해 쿠팡이츠를 보던 중 배달 어플리케이션의 기능들을 구현해보면 어떨까 싶은 생각이 들어 제안을 했더니 팀원분들이 모두 흔쾌히 동의를 해주어 해당 주제로 프로젝트를 진행하게 되었다.
구현 기능
주제를 정한 뒤 주제에 따라 어떤 기능들을 구현할 것인지를 다함께 논의했다. 5명으로 이루어진 다른 조들에 비해 우리 조는 총 6명이었기 때문에 조금 더 욕심을 내어 인원수 만큼의 DB 테이블과 기능들을 만들기로 했고 최종적으로 다음과 같이 기능들을 구현하게 되었다.
- 회원관리: 가입, 정보수정, 탈퇴
- 검색: 메뉴에 따른 검색, 가게명에 따른 검색, 음식 카테고리에 따른 검색
- 주문: 주문할 가게 선택 및 주문, 상세 메뉴 선택, 주문확인 및 취소
- 리뷰작성: 주문 내역에 따른 리뷰 등록, 리뷰 확인, 리뷰 점수에 따른 가게별 평점 계산 및 등록
- 가게관리: 가게등록, 수정 및 삭제
- 상품관리: 가게 별 판매할 메뉴 등록, 수정 및 삭제
- 주문관리: 가게 별 주문내역 확인, 주문접수상태 변경
테이블 구조
- 테이블은 총 6개로 회원정보를 담을 테이블(members), 가게정보를 담을 테이블(stores), 상품정보를 담을 테이블(products), 주문 정보를 담을 테이블(orders), 상세 주문 정보를 담을 테이블(order_details), 그리고 리뷰 정보를 담을 테이블(reviews)로 구성했다.
- orders와 order_details 테이블을 분리해서 만든 이유는 주문 한 건당 메뉴를 하나만 선택하는 것이 아니라 여러 메뉴를 여러 개씩 선택할 수 있도록 하기 위해서였다. 선택한 여러 메뉴들의 정보를 orders 테이블에 입력하려면 테이블의 열을 계속해서 늘려주거나 리스트 형식의 값을 넣어야하기 때문에 그보다는 order_details 테이블을 만들고 order_id를 foreign key로 참조하도록 설계했다.
클래스 구조
- 위에서 정의한 기능별로 소스파일을 분리하였고, 각 소스 파일마다 세부기능 구현을 위해 VO, DAO, Service 클래스 및 메서드를 정의하였다.
- 메뉴검색과 주문 같이 연동이 필요한 기능들은 각 모델에서 필요한 메서드를 참조하여 사용하는 식으로 구현을 했다.
개발과정
나는 이번 프로젝트에서 주문관리 기능을 메인으로 담당하여 개발을 진행했고, 생각보다 일찍 파트 구현을 마치면서 가게 등록 및 삭제, 그리고 리뷰 평점 반영 세부 기능들을 보조하여 개발했다.
개발 과정에서의 팀 커뮤니케이션은 슬랙 및 줌을 주로 이용했고, 여기에 추가로 기획내용 기록과 팀원별 진행상황 관리를 위해 구글 독스와 스프레드시트를 사용했다.
세부기능 구현과정
전체적인 코드 구조는 수업과정에서 내용과 크게 다르지는 않았다. 예를들어 주문 확인 기능 구현을 위해 DAO 객체 메서드를 사용하여 DB에서 주문정보와 상세주문정보를 가져와 VO객체에 담은 뒤 Service에서 출력을 하는 방식을 사용했다.
다만 가게정보 및 주문정보는 가게 주인만 볼 수 있도록 하기위해 현재 로그인 되어있는 아이디와 가게정보의 매니저 아이디가 일치하는지 확인을 하도록 하거나, 리뷰 등록 시 사용자가 입력한 점수가 가게 평점에 바로 적용되도록 DB에서 평점을 불러오고 새로운 점수를 합하여 다시 평균을 낸 뒤 업데이트를 시켜준 부분들은 기존에 공부한 내용들에서 조금 더 고민하여 응용이 필요한 작업이었다.
이 과정에서 처음으로 배운 내용을 그대로 따라서 코드를 작성하기 보다는 스스로 문제를 정의하고 해결방안을 찾아내는 작업이 필요했는데, 며칠간 작업을 반복하다보니 걱정했던 것 보다 능숙하게 새로운 코드를 작성할 수 있게 된 것 같아 재밌기도하고 개인적으로 뿌듯함을 느꼈다.
물론, 아직 더 좋은 코드를 쓰려면 많은 노력이 필요하겠지만…
프로젝트 결과물: https://github.com/lucathree/Code-Practice/tree/main/Mini-Projects/1st%20project%20-%20CoupangEats
후기
협업능력의 중요성
운이 좋았는지 함께했던 팀원분들 모두 “열정! 열정! 열정!”을 외치며 적극적으로 프로젝트에 참여해주셨다. 조별과제하면 스트레스부터 받기마련인데 다들 밸런스있게 1인분을 잘 채워주신 덕분에 서로에게 배울 점들도 많았고 만족할 수 있는 결과물을 낸 것 같다.
화기애애한 분위기 덕에 나름 교육과정이 끝날 때까지 같이 달릴 수 있는 동료들을 얻은 것 같은 기분도 들고, 이런 분위기가 아니었으면 도대체 어떻게 주제를 정하고 기능들을 기획했을지 막막하기도 하다. 그래서 이런 기본적인 협업과정이 정말 중요함을 느꼈고, 더 세부적으로 스프레드시트로 진행현황을 공유하거나 작업 영역을 분담하고 공유하는 과정등에 대해 이해하고 효율화 할 수 있는 능력을 갖추는 게 개인적인 개발능력을 기르는 것 만큼 중요하다는 사실도 깨달았다.
사실 서비스 기획을 하면서 커뮤니케이션 능력에 대한 고민과 스트레스가 너무 많았기 때문에 개발을 하면 커뮤니케이션에 대한 고민이 줄어들 것이라는 기대감이 조금 있었다. 그런데 이번 프로젝트를 진행해보니 개발자도 커뮤니케이션으로부터 결코 자유롭지는 않았다. 다행히 커뮤니케이션이 사실상 업무의 전부인 PM보다는 상황이 낫지만 개발자로서의 커뮤니케이션은 생각하지 않고 있던 내 스스로를 반성하게 되었다.
다른 팀들의 프로젝트 발표
협업을 하며 좋았던 또다른 점은 다른 사람들은 어떤 방식으로 알고리즘을 만들고 코드를 작성하는지 볼 수 있다는 점이었다. 우선 팀 내부적으로는 한 분이 DAO 객체에서 DB에 insert, delete, update를 하는 메서드를 각각 하나로 통일시킨 것을 보고 많이 배웠던 것 같다. 기능 별로 정보를 입력하는 메서드를 반복해서 작성하며 입력, 수정, 삭제를 하나로 만들면 좋을 것 같다는 생각을 머리로만 했었는데 실제로 구현해 놓은 것을 보면서 자극이 많이 되었다.
그리고 다른 팀들의 프로젝트 결과물을 보면서도 참신한 기능들이 많았는데 대표적으로 아래 내용들이 기억에 남았다.
- 우리는 한 명이 어플리케이션 UI 작업을 모두 담당해서 진행했는데, 3조는 팀원들이 각자 담당한 기능별로 메뉴를 구성해서 작업을 진행했고 이 과정이 상당히 매끄럽게 이루어진 점이 인상깊었다.
- 영화예약 서비스를 구현한 조에서는 좌석 별 예매 기능이 있었는데 좌석 위치와 번호를 텍스트 UI로 구현해놓은 점이 신기했다. 마치 알고리즘 문제 풀이를 보는 듯 했다.
- 똑같이 영화예약 서비스를 구현한 다른 조에서는 상영영화 리스트를 CGV 홈페이지에서 크롤링해오는 기능까지 만들어져 있었다.
- 마지막으로 재고관리 시스템을 만든 팀이 있었는데, 기능들은 수업내용에서 크게 벗어나지 않았지만 프로그램 전체를 GUI로 제작을 해놓았다. 보면서 당연히 전공자이거나 전에 프로그래밍을 배운 경험이 있을 거라고 생각했는데 놀랍게도 작업자 분도 이번 과정을 통해 파이썬을 처음 접했다고 했다.
스스로 나름 4주간 열심히 공부했다고 생각했는데, 같은 시간을 더 효율적으로 사용해서 더 뛰어난 기능들을 구현한 사람들을 보면서 정말 자극이 많이 되었다. 개발이 조금 익숙해지고 재밌는 것 같다고 해서 절대로 안주하면 안되겠다.
아쉬운 점
아쉬운 점도 결국은 협업과정을 조금 더 매끄럽게 하지 못한 것에 대한 부분들이다. 서로 작업물을 파일로 주고 받다 보니 어떤 파일이 가장 최신 파일인지 구분하기가 어려웠고, 내가 이미 업데이트 시킨 부분이 다른 팀원이 보내준 파일에는 적용이 안되어있어서 반복해서 작업을 해야하는 경우도 있었다. 프로젝트를 시작하고 난 뒤에야 git을 공부하기 시작했고 팀원들도 git 사용법을 몰랐기 때문에 어쩔 수 없었지만 다음 프로젝트에서는 git을 통한 버전관리와 협업을 시도해보고 싶다.
그리고 클래스 객체를 정의하는 부분에서도 사전에 다같이 클래스 구조와 클래스명을 정해놓고 작업이 시작되었으면 좋았을텐데, 각자 작업영역을 정하고 클래스 정의를 작업자가 알아서 하는 방식으로 해보니 나중에 결과물에서 서로 같은 클래스나 임포트한 모듈을 각자 다른 이름으로 부르거나 중복해서 VO 객체를 만드는 작업이 이루어져 있었다. 이런 부분에서도 조금 더 효율적으로 협업을 진행할 방법을 찾고 공부해본다면 좋을 것 같다.
댓글남기기