Development/DevLife

7주차 ) 초급 조별 프로젝트 "오늘 뭐먹지" 발표

📝 작성 : 2021.01.01  ⏱ 수정 : 
반응형

 

한주동안 열심히 준비한 조별프로젝트가 마감되었습니다.

 

저는 스스로를 완벽주의 성격을 가진 사람이라고 생각합니다.

그 완벽주의 성격과 자존심 덕분에 스스로에게 많은 동기부여가 되기도 하지만,

때로는 그 댓가를 혹독하게 치르기도 합니다.

 

이번 첫 조별 프로젝트를 통해 몇일동안 잠도 설치며 큰 대가를 치루었습니다.

하지만 마지막 1분까지 팀원들과 치열하게 준비한 덕분에 후회없는 발표를 할 수 있었습니다.

 

 

 

제가 이번 프로젝트 진행을 통해 얻은 부분은 팀원들과의 협업 경험이 가장 컸던 것 같습니다.

 

팀원들 모두가 적극적인 참여를 해 주었고,

 

팀원들 한명 한명 모두가 소속감을 가지고 목표 달성을 위해 함께 최선을 다해줬다는 점이 프로젝트 진행 내내 저를 가슴 벅차게 만들어 주었습니다.

 

 

저희는 프로젝트를 진행하면서 Github 상에서 서로를 닉네임(영어이름) 으로 호칭했습니다.

 

긴 세월은 아니지만 저는 5년가량의 해외생활을 하면서 한국에서의 나이와 호칭 문화에 부담이 있었습니다. 그러다보니 자연스럽게 팀원들을 jeje 와 issac 으로 불렀는데, 팀원들은 특별히 거부반응 없이 저를 shane 으로 호칭 해주었고, 특별히 약속한 건 아니지만 팀 문화처럼 자리 잡았습니다.

 

 

jeje는 이전 글에서 언급했던 것 처럼 언제부터, 수업 진도를 따라가는게 버거운 듯 했습니다.

처음 학원에 들어왔을때의 의욕 넘치던 모습이 참 보기 좋았는데, 혹시나 중간에 그만둘까봐 걱정스러웠습니다.

저도 공부하기 바뻐 학우들과 대화를 자주 나누지 못해 자세한 속 사정은 알 수 없었기에 그저 제 생각일 뿐 입니다.

 

걱정했던 것과는 전혀 달리 jeje는 제가 주는 임무들을 항상 책임감 있게 최대한 빠른 시간안에 요구사항를 한 하나도 빠뜨리지 않고, 기대 이상의 결과물을 돌려주었고.

그 가능성을 본 저도 제가 할 수 있는 최대한의 노력을 하기로 마음먹었습니다. 프로젝트 수행이 가능할 실력을 갖추실 수 있도록 최대한의 도움을 드리겠다고 결심했습니다.

 

 

Github내 project상 issue를 통해 제가 내주는 숙제들을 해결하기 위해 jeje는 주말에도 학원에 나와 학원 문이 닫히는 시간까지 개인 공부 및 제가 내주는 문제풀기들을 제출 해 주었고,

 

5일 만에 제가 프로젝트 상에서 구현한 모든 코드를 이해하고 작성 할 수 있을 만큼 따라오셨습니다.

 

jeje가 직접 공부 해 추가해낸 쿼리

발표를 이틀 남기고는 처음으로 본인손으로 저희 프로젝트에 직접 코드를 작성 하기 시작했으며,

발표 하루 전에는 저희 프로그램 내에서 나름 가장 많은 테이블을 join하는 

핵심적인 기능의 SQL 쿼리와 코드 모두 스스로 추가하였습니다. 

 

이 순간이 제가 프로젝트 진행하면서 가장 감격스러운 순간이었으며 앞으로도 절대 잊지 못할 듯 합니다.

 

본인은 항상 도움이 되지 못해 미안하다는 말을 달고 있지만, 저에게는 정말 최고의 팀원이었고 최종 프로젝트까지 지금의 팀원들이 함께해준다면 뭐든 못할 게 없겠다는 자신감이 생겼습니다.

 

그렇게 발표 1분 전까지 팀원들 모두 치열하게 준비했던 프로젝트가 끝이 났습니다.

 

 

발표 1시간을 남기고 발표에서 들어갔으면 싶은 기능을 부랴부랴 추가하고, 총 화면당 라인수를 12줄에서 14줄로 전체적으로 늘리고, 발표 30분전에는 예상치 못했던 예외를 잡느라 분주했습니다. 프레젠테이션 직전까지 세부적인 내용과 순서등을 팀원들과 조율했고 계속 시뮬레이션을 해보며 정말 발표 1분전까지 긴장을 놓치 못했습니다

 

발표 직전 가장 분주했던 커밋과 병합의 흔적들. 최종의 최종의 마지막.. 찐마지막...

 

총 8 팀의 발표가 있었는데, 운이 좋게도 발표순서는 딱 원했던 7번째 였습니다.

다른 팀의 발표를 보며, 프레젠테이션이 루즈해지는 순간, 혹은 주목을 끄는 순간들을 캐치해 노트에 적어뒀다가 끊임없이 팀원들과 발표에 대한 피드백을 나눴습니다.

 

그렇게 프레젠테이션이 시작되었습니다.

 

0123456789101112

 

 

 

* 서버는 AWS 를 사용했습니다.

 

학원에서 외부 서버 이용에 대해 배우지는 않았지만, 저희 프로그램의 구현 상 서버 구축은 반드시 필요했고

issac은 저의 요청에 "이게 될까요?" "이게 될까요...?" 를 반복하다 결국 " 되네요" 하며 저희의 프로젝트에 서버를 선물해 주었습니다.

 

 

* sample project를 간단하게 선생님이 만드는 법을 보여주시며 저희가 따라서 타이핑을 했었는데 , 그 프로그램에서는 View 들을 public static int 값으로 선언해두고 반환값으로 사용했었습니다. 저도 무작정 그걸 따라 프로그램을 만들다 보니, 어느순간 호출스택 관리가 정말 효율적으로 된다는걸 느낄 수 있었고 그래서 더더욱 최대한 활용하기로 했습니다. 해당 메서드를 호출하는 포인트가 여러군데인 몇가지 예외에서만 확실하게 호출했던 곳으로 돌아갈 수 있게 void로 선언했고 그걸 제외하곤 항상 int로 선언해 View를 리턴하도록 만들었습니다.

 

 

* Github의 Project와 Issue를 협업에 적극적으로 활용했습니다.

 

우려했던 code conflict 는 다행히도 단 한번밖에 일어나지 않았고, 코드 몇줄 수정으로 간단하게 해결 할 수 있었습니다.

 

2,5 입력을 통해 아래.위 이동 그리고 1,3 입력을 통해 좌,우 이동하는 것은

프로젝트 진행하면서 기술력이 늘어나면 그냥 방향키 입력만으로 이동하게끔 구현하려고 했으나

키 리스너를 잘 이해하기가 힘들었고 시간제약상 공부하면서 기능 구현까지 하기에 어려움이 있어서,

* 오래 전 매크로들을 만들며 손에 조금은 익었던 Autohotkey 를 이용해 방향키 입력시 해당 번호와 엔터를 입력하는 스크립트를 만들어 사용했습니다.

* 카카오톡 이용시 집중력이 떨어질 것을 감안해 팀원들간 메시지나 파일을 주고받을 때는 skype 만을 사용했습니다.

 

 

* 같이 화면을 보며 논의를 해야할때는 한 모니터를 보며 다닥다닥 붙어 있기보다 TeamViewer 를 이용해 셋이서 각자의 자리에서 본인의 모니터를 보며 공동작업을 진행하였습니다.

 

 

 

아직은 콘솔화면 속 작은 시작이지만 7주가 아닌 7개월 차에는 어디 부끄럽지 않은 프로그램을 낼 수 있을겁니다.

 

 

오프닝 로딩은 발표 하루전날 새벽에 만들었습니다.

 

뭔가 시작할때 청중들의 관심을 사로 잡고 싶었는데, 

밤중에 고민을 하고 있으니 아내가 귀여운 그림에 대한 아이디어를 주었고, 이틀전부터 '타이핑 되는 느낌'으로 시작하고 싶다던 막연하던 저의 생각은 실제로 구현을 하고 나니 만족스러운 동작을 해주었습니다.

 

저의 재활용 불가능한 하드 코딩에 대한 혐오 때문에 for문에 넣을 조건들을 생각해내는 부분이 가장 어렵긴 했지만, 연습장에 연필로 끄적대며 머리를 굴려댄 덕에 코드도 완성해낼 수 있었습니다.

 

static public void loading(){
		String[] str = {"ㅇ_","오_","온_","오느_","오늘_","오늘 _","오늘 ㅜ_","오늘 ㅝ_","오늘 ㅜ_","오늘 _","오늘 ㅁ_","오늘 무_","오늘 뭐_","오늘 뭐 ㅁ_","오늘 뭐 머_","오늘 뭐 먹_"
				,"오늘 뭐 먹ㅈ_","오늘 뭐 먹지_","오늘 뭐 먹지_","오늘 뭐 먹지._","오늘 뭐 먹지.._","오늘 뭐 먹지..._","오늘 뭐 먹지...?  "};
		String[] name1 = {"👨 ㅂ_","👨 바_","👨 박_","👨 밗_","👨 박세_","👨 박셓_","👨 박세혀_","👨 박세현"};
		String[] name2 = {"👩 ㅇ_","👩 유_","👩 윤_","👩 윥_","👩 윤지_","👩 윤짛_","👩 윤지혜"};
		String[] name3 = {"👦 ㅈ_","👦 저_","👦 정_","👦 정ㅇ_","👦 정이_","👦 정잇_","👦 정이사_",
				"👦 정이삭_","👦 정이삭_","👦 정이삭","👦 정이삭","👦 정이삭_","👦 정이삭_","👦 정이삭","👦 정이삭","👦 정이삭_","👦 정이삭_","👦 정이삭"};
		int n1=0 ,n2=0, n3=0;
		String pressEnter = "";
		String eyes =  " • _ •│      ";
		for(int i=0; i<str.length+name1.length+name2.length+name3.length; i++){
			String str_1 = "",name_1="",name_2 = "", name_3 = "";
		
			int j=i;
			if(j>str.length-1) j=str.length-1;
			str_1 = str[j];
			if(i>= str.length){ 
				if(n1>name1.length-1) n1=name1.length-1;
				name_1 = name1[n1++];			}
			if(i>= str.length+name1.length){
				if(n2>name2.length-1) n2=name2.length-1;
				name_2 = name2[n2++];			}
			if(i>= str.length+name1.length+name2.length){
				if(n3>name3.length-1) n3=name3.length-1;
				name_3 = name3[n3++];		}
			if(i==str.length+name1.length+name2.length+name3.length-1){
				Util.wait(200);
				eyes = " > _ <│      ";
				pressEnter = " 계속하려면 엔터키를 입력...";
			}

			Util.wait(150);
			System.out.println("\n\n\n□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■");
			System.out.println();
			System.out.println();
			System.out.println("      ╭∂∂∂∂∂∂╮    ╭──────────────╮                     ");
			System.out.println("      ε"+eyes+str_1);
			System.out.println("      ╰──┰┰──╯    ╰──────────────╯ ");
			System.out.println("      ╭──╲╱──╮");
			System.out.println("   ╞══╧══════╧═════════╡▒   "+name_1);
			System.out.println("   │  대덕인재개발원 302호 │▒   "+name_2);
			System.out.println("   └───────────────────┘▒   "+name_3);
			System.out.println("   ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒   ");
			System.out.println();
			System.out.print("□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■\n>"+pressEnter);  
		}
		ScanUtil.nextLine();
		
	}

 

역시 기능 추가 등에 비해 투자한 시간 대비 청중들의 관심을 끌어내기엔 제대로 된 가성비를 보였습니다.

영어였다면 쉽게 for문으로 구현했겠지만, 한글입력의 특성상 어쩔수 없이 String 배열을 만들었습니다.

 

회원가입시 전화번호, 이름, 주소등의 정보를 전부 입력 받는다면 프레젠테이션이 시작부터 루즈해질 것을 걱정해서 간단하게 아이디, 비밀번호, 닉네임만 입력 받고 시작할 수 있게끔 만들었습니다.

 

비회원 (guest) 모드도 추가해 두었는데, 그 누구보다도 저희 팀원들이 가장 애용한 기능이었습니다.

 

처음 프로그램을 시작하면 학원 근처의 식당들을  평점순, 리뷰수순, 거리순으로 바로바로 정리해줍니다. 메인 화면의 구성은 jeje의 아이디어였는데, 막상 구현해놓고 나니 크게 어렵지 않고 만족도도 컸습니다.

 

처음에는 각각의 기준으로 방항키가 이동할때마다 쿼리를 통해 새로 List를 받아왔었는데, 서버를 이용하기 시작하면서 그 딜레이가 눈에 거슬릴 정도가 되어서 처음 로그인할때부터 각 기준별로 List를 저장해 두고 메뉴를 옮길때는 서버에서 데이터를 새로 받아 올 것 없이 바로바로 전환이 되도록 하였습니다. issac은 너무 빨리 전환되는 것도 좀 어색하다고 해서 스스로 데이터를 불러오는듯한 로딩 화면을 본인이 원하는 모습으로 스스로 추가하였습니다.

해당 로딩이 하드코딩되어있다보니 다소 제약은 있었지만 발표할때 닉네임 글자수를 3글자로 미리 정해두는 선에서 하드코딩으로도 티 안나게 맞춰 넣는게 가능했습니다.

 

4분간의 유투브 녹화 동영상은 발표때 실제로 구동한 순서입니다. jeje가 프로그램 구동에 대해 생각한 순서를 저에게 알려 주었고 저는 발표 전까지 몇번이고 연습하며 그 순서를 미리 외어두었습니다. jeje가 발표하는 동안 저는 발표 컴퓨터를 제 컴퓨터에 team viewer로 연결한뒤 제 자리에서 발표에 맞춰 프로그램을 구동하였습니다.

 

 

각 기준별 정렬된 식당에서 해당 메뉴에 들어가면 모든 식당을 해당 정렬 순서로 조회해 볼 수 있으며, 식당을 선택하면 식당의 상세 페이지에 들어가서 메뉴, 리뷰를 확인 할 수 있고 식당을 찜해 본인의 찜 리스트에 추가 한 뒤 '마이페이지' 에서 확인 할 수도 있습니다. 리뷰 별주는 인터페이스는 jeje의 아이디어 였는데 정말 만족스러웠습니다.

 

 

메뉴명에서 먹고싶은 메뉴를 검색해서 식당 목록을 보는건 추가 후 정말 만족스러운 기능이었습니다.

jeje가 프로그램의 완성 단계에 마지막으로 본인 손으로 추가한 기능인데, 정말 저희에게는 많은 의미를 가진 소중한 기능입니다.

 

저희가 처음에 모티브로 삼은 tripadvisor 에서도 고객들의 리뷰속 '메뉴명'을 검색해주긴 했지만 실제 해당 식당들에서 판매 하고 있는 메뉴 이름들의 String 포함 여부를 대조해서 식당 목록을 보여주는 기능은 제공하지 않습니다.

 

특정한 메뉴가 먹고 싶은 날이 있는데 간단하게 그 메뉴의 이름만 입력하면 그 메뉴를 포함한 모든 식당들의 목록이 나온다니 제가 생각해도 좋은 기능입니다.

 

 

마이페이지에서는 찜리스트, 나의 도시락 주문 내역, 내의 리뷰 내역 등을 조회 할 수 있습니다.

 

'도시락 주문' 기능을 이용할땐 비로소 실명과 핸드폰 번호를 최초 1회 입력해야만 사용 할 수 있습니다.

 

 

 

 

도시락 주문을 시도하면, 발표때 새로 가입한 계정이기에 적립금이 없어서 주문을 할 수 없는 상황이 되는데, 이 부분에 대해 나름의 하이라이트로 생각하고 어떻게 퍼포먼스를 보이면 좋을지 고민을 꽤 했습니다.

 

물론 적립금 충전하기 - 충전할 금액 입력 - '충전 완료!' 순서로 무난하게 표현 할 수 있지만, 실제 사용과는 괴리감이 있습니다.

 

저희 반에서 실제로 매일 매일 한명이 대표로 반에 있는 사람중에 '오늘 도시락 먹을 분들' 의 명단을 모으고 대표로 주문을 하고 계좌로 송금을 받는 형식으로 도시락 주문이 이루어지고 있는데, 몇가지 문제가 있습니다.

1) 가끔 주문이 한개씩 더 들어가거나 덜 들어가는 불상사가 일어납니다.

2) 송금을 누락하는 분들이 자주 있습니다. 저희 팀 issac 이 빈번하게 지적당하는 실수입니다.

 

그래서 실제 도시락 주문에 사용이 가능할 정도의 프로그램을 만들어 보자란 목표가 있었고, AWS 를 사용해 서버를 구축할 필요가 있던 이유도 그 때문 이었습니다.

 

적립금을 충전하는것도 실제로 우리가 프로그램을 사용한다면 반에서 사용할 방식에 가장 가깝게 구현해 보려고 했고, 하루에 3500원씩 꾸준히 송금 하는 것보다 한번에 받을때 1만~2만원씩 송금을 받아 놓고 적립금으로 두고 두고 사용한다면 편리할 거라 생각했습니다. 저희가 카드결재를 받을 수 있는 것도 아니고 하니 관리자가 송금 받아 확인 후 적립금을 충전해 주는게 가장 현실적인 방법이란 생각이 들었고 구현도 실제로 그렇게 했습니다. 

관리자 모드로 접속한 뒤 충전하고자 하는 아이디와 충전금액을 입력하면 데이터베이스 상에 적립금을 충전해 주는 식으로 구현했습니다.

 

 

다시 발표로 돌아와, '주문하기' 를 누른 뒤 '적립금 충전 후 이용해주세요'가 나왔을때

본인 자리에서 동 프로그램을 관리자모드로 접속해 대기하고 있던 issac에게 '관리자님~ 돈 송금할게요 ㅇㅇ원 충전해주세요' 라고 jeje가 말했고,

issac은 준비하고 있다가 몇초 이내에 충전을 시켜준 뒤 충전 완료되었습니다~ 라고 답하였습니다.

jeje 는 즉시 충전된 적립금을 청중에게 확인시켜 주고 바로 도시락 주문을 하는 모습도 보여줬습니다.

 

고객센터는 전부 issac 이 구현했는데, 게시판 만들기와 페이지 처리에 대한 이해가 아직은 부족했던 issac 이 몇일을 고객센터에만 집중하며 성공해내고, 본인 스스로 크게 성장할 수 있었습니다. 특히 '식당문의' 기능에서 식당 추가에 대해 관리자에게 건의를 하면 관리자가 '승인' 버튼 만 누르면 바로 식당 데이터베이스가 서버에 정식으로 추가가 되는 기능도 쉽지 않을 거라 생각했지만 저의 요구사항에 맞춰 정확하게 잘 구현 해 주었습니다.

 

 

 

 

 

관리자 모드는 굳이 발표때 보여줄지 말지 고민을 많이 하긴 했는데, 도시락 주문자들의 명단을 확인 할 수 있으며 적립금 충전도 관리자가 어떤 식으로 충전시켜주는지 보여주기 위해 짧게나마 보여주었습니다.

 

 

이렇게 jeje는 100% 기대 이상의 발표를 해주었습니다.

욕심으로는 발표 장면도 녹화를 해 남겨두고 싶었지만 본인이 부끄러워 하는 것 같아서 기록 남기지는 못했습니다.

 

 

하지만 이날의 성취감은 저의 기억속에 오래오래 남아

 

앞으로 개발자로서의 성장에 큰 밑거름이 될 것입니다.

 

 

github.com/psh40963/DDIT_Project1

반응형