Skip to main content

Command Palette

Search for a command to run...

Suwiki 회고

길고 길었던 Suwiki 서비스 배포를 시작하며 ...

Updated
5 min read
Suwiki 회고

더 잘하고 싶은 안드로이드 개발자.

https://github.com/jinukeu

7개월간의 대장정이 드디어 끝났다. (21년 말 ~ 22년 8월 초)
회고를 하며 부족했던 점이 뭔지 파악해 보려 한다.

회고

에브리타임(대학생 전용 커뮤니티 서비스 - 시간표 및 강의평가 기능 제공)에서 수원대학교의 시간표 & 강의평가 서비스를 최신 데이터로 업데이트해주지 않아 직접 만들었다.
처음에는 시간표 앱만 만들어서 배포하였는데 생각보다 반응이 뜨거웠고 강의평가 기능도 추가하면 좋을 것 같았다.

그래서 교내 IT 동아리 FLAG에서 팀원을 모집했다.
초기 멤버는 iOS - 1, WEB - 3, Backend - 2, Android - 1으로 구성되었다.

다들 초보였기 때문에 공부를 하며 개발을 해야하는 상황이었다. (7개월이나 걸린 이유) 심지어 디자이너도 없어서 와이어프레임과 디자인 전부 내가 맡아서 했다. (초기 와이어프레임 보러가기)
(이때는 디자인이 깔쌈하다 생각했다 ... ㅎㅎㅎ)

협업 경험은 한이음 활동을 한번 해본게 전부라 트렐로, 슬랙 ... 이런 협업 프로그램들을 정말 하나도 몰랐고 구글 문서, 카카오톡으로 회의 및 진행 상황을 공유했다. (첫 회의록)

그러던 중 교내 알고리즘 대회 1등을 하게 되었고 수상자들 중에 안드로이드를 공부하시는 분이 있다는 걸 알게되었다. 주변에 안드로이드를 개발하는 사람이 없던 나는 친해지고 싶어서 많은 어필(?)을 하였고 그 분과 대화를 하던 도중 실력이 좋으신 분이라는 것을 알게되었다. 같이 협업하면 좋을 것 같아 제안을 했고 고맙게도 수락해주셨다!

새로 오신 안드로이드 파트 분이 트렐로와 잔디를 써보는게 어떠냐고 해서 바로 도입했다. 트렐로로 전체 진행상황을 파악할 수 있었고 잔디로 토픽(슬랙으로 치면 채널)으로 대화 주제를 나누는 부분도 너무 유용했다.

이렇게 프로젝트가 잘 진행되었으면 좋았겠지만 그러진 않았다.

1. 백엔드 팀원 이탈

벡엔드 팀원들(A, B)끼리의 마찰이 있었다.
A는 실력이 B에 비해 모자랐다. A도 나름 공부를 한다고 하였지만 B와의 실력 차가 좁혀지지 않았다. 추가로 A는 연락이 잘 안되는 문제가 있었고 이 때문에 B와의 갈등이 좀 있었다. 나는 이 사실을 B가 직접 해당 문제를 개인 메세지로 알려준 다음에야 알게 되었다.

우선 이 문제를 해결하기 위해 백엔드 팀원을 추가 모집(B의 의견)했고 A에게는 어떤 내용을 공부했는지 B에게 공유해달라고 부탁했다. A가 노력한다는 사실을 알면 B와의 갈등이 어느정도 해소될 거라 생각했다. 하지만 A는 공부한 내용을 B에게 공유를 잘 하지 않았고 결국 갈등은 더 심해졌다. 또한 A가 공부한 내용을 봤을 때 열심히 했다는 느낌을 받지 못했다. (B도 마찬가지 였을 것이다.) 결국 A를 내보내기로 결정했다.

어떤 점이 문제였을까?

팀장 자격 미달
각 팀원들이 잘 하고 있는지, 문제는 없는지 파악했어야 했는데 그러지 않았다. 다들 알아서 잘하겠지라는 생각이었는데 이게 너무나도 잘못된 생각이었다. A와 B가 갈등이 있다는 사실을 B가 말해줘서야 알다니 ... 너무 소극적인 태도로 프로젝트에 임했던 것 같다.
-> 적극적으로 팀원들과 소통하여 문제를 미리 파악했다면 A가 나가지 않거나 갈등을 해소할 수 있었을 텐데 ... 지금 생각해보니 너무 아쉽다. 다음에는 팀원들이 협업을 어떻게 진행하고 있는지 개발이나 소통하는 부분에서 어려운 점은 없는지 등을 미리 파악하자!

다들 열심히 한다고 말했으니, 진짜 열심히 하겠지
프로젝트 인원을 모집할 때 카카오톡으로 간단한 자기소개 및 각오만 받은 게 조금 문제였던 것 같다. 지원자가 책임감이 있는지 무언가를 열심히 해 본 경험이 있는지 실력이 어느 정도인지 연락은 잘 되는지 시간 투자를 확실하게 할 수 있는지 등을 파악했어야 했는데 너무 건성으로 뽑았다.
-> 팀원을 구할 때는 기준을 깐깐하게 잡자!

2. 팀원들의 참여도

인턴, 외주 등으로 인해 프로젝트에 많은 시간을 투자하지 못한 팀원들이 있었다. 인턴과 외주 기간 동안 참여를 못하는 건 괜찮았지만 문제는 해당 활동이 끝난 이후에도 참여를 잘 하지 않았다는 것이다. 심지어 다른 개인 프로젝트는 작업하면서 Suwiki 프로젝트는 건드리지도 않는 팀원이 있었다. 프로젝트 데드라인까지 기간이 꽤 있어서 그냥 내버려두었지만 여기서 또 갈등이 생겼다.

일단 나 조차도 "분명 Suwiki 프로젝트를 먼저 시작했을 텐데 왜 개인 프로젝트를 더 우선시 하는 거지?", "인턴(외주) 끝난 지 일주일이나 지났는데 왜 아무런 작업을 하지 않지?" 등 의문이 많이 생겼고 ... 팀원들 일부 역시 불만이 조금씩 있었다.

어떤 점이 문제였을까?

역시 소통나의 소극적인 태도가 문제였던 것 같다. "뭔가 이유가 있겠지" 라고 생각하지 않고 적극적으로 프로젝트에 집중하지 않는 이유를 물어봤으면 더 좋았을 것 같다. 사정이 있겠지만 팀장으로서 프로젝트에 더 집중해달라고 충분히 요청할 수 있었다. 이미 지난 일이지만 많이 아쉽다.
-> 소통, 소통, 소통

3. 일정 관리

데드라인은 8월로 정했지만 세부적인 일정은 정하지 않았다. 마일 스톤과 MOSCOW를 적용했으면 좋았을 것 같다. (이때는 이런게 있는 줄도 몰랐지만 ㅠ) 정해진 일정이 없으니 나를 포함한 팀원들이 늘어지는 게 조금씩 보였다. 이를 해결하기 위해 일주일에 한번씩 회의를 통해 진행상황을 팀원들 전체가 공유하였고 다행히 효과가 있었다.
-> 장기 프로젝트인 경우 일정을 세부적으로 정하자 + 주기적인 진행 상황 보고 필수


프로젝트를 하며 생겼던 문제는 이 정도가 끝이다. 소통이 정말 중요함을 느꼈다.

이어서 회고를 해보자.
프로젝트를 진행하던 도중 백엔드 팀원이 디자이너분을 팀원으로 데리고 오셨다. 내가 기존에 했던 디자인을 갈아엎으셨는데 정말 디자인이 깔끔하고 너무 좋았다. (괜히 디자이너가 있는게 아니구나 ... 싶었다.) 그 다음부터는 순조로웠다. 모든 파트가 개발을 완료 했고 몇번의 테스트 기간을 거친 후 Suwiki 배포에 성공했다. 개발을 하며 깨달은 점을 먼저 얘기하고 배포 이후의 이야기를 하겠다.

개발을 하며 깨달은 점

유지보수 하기 쉬운 코드의 중요성

Suwiki를 개발하기 전, 즉 혼자서 개발을 할때는 하드코딩을 했다. 하지만 이번에 같은 안드로이드 팀원분이 MVVM 패턴을 적용해보자고 하셨고 유데미 - 안드로이드 앱개발 부트캠프를 보며 각자 공부를 해왔다. 처음 MVVM을 적용해본거라 미숙한 점이 많았지만 적용해보길 참 잘한 것 같다. 그 이유는 다음과 같다.

  1. 코드를 분리시켜 놓으니 버그를 찾기가 한결 수월했다.
    ex) 서버에서 데이터를 받아오는 부분이 이상하네? -> viewModel 부분 확인
    ex) 화면에 보이는 데이터가 조금 이상하네? -> 데이터 바인딩이 잘못되었는지 확인

  2. viewModel을 여러 화면에 재활용 -> Suwiki에서는 무한 스크롤 기능을 추가한 CommonRecyclerViewModel을 재활용했다.

유닛테스트 하기에도 편하다는데 아직 유닛테스트 경험은 없다...

디자인패턴 이외에도 styles.xml, color.xml을 적극적으로 활용하니 수정사항이 생겼을 때 반영하기가 너무 수월했다. 개인적으로 안드로이드 팀원분에게 너무 감사하다 ... !!! 나중에 만나면 밥이라도 사드려야지 ㅎㅎ


배포 이후의 얘기를 마저 하자면 ...
배포는 성공적으로 되었고 에브리타임에 Suwiki를 홍보하였다. 지금까지 누적 회원 수는 250명 정도 된다. (앱 다운로드 수는 400정도 증가했다.)

이제 마케터를 모집해서 홍보를 더 할 생각이다. 마케터 모집 공고를 올렸는데 정말 감사하게도 5명이나 지원해주셨다. 마케팅 최소 목표는 1000명 이상...! 유저를 확보하는 것이고 충분히 가능하다고 생각한다.

수원대학교의 모든 학생들이 Suwiki를 사용하는 그날까지, 아니 그 이후에도 Suwiki는 계속 서비스될 것이다. 파이팅!!!

Suwiki 사용해보기

[WEB] https://suwiki.kr/

[Android] https://play.google.com/store/apps/details?id=com.kunize.uswtimetable

[iOS] https://apps.apple.com/kr/app/suwiki/id1615744899

More from this blog

단위테스트 2장 정리

단위 테스트의 정의에는 많은 늬앙스가 있다. 크게 고전파, 런던파로 나뉜다. 고전파: 모든 사람이 단위 테스트와 테스트 주도 개발에 원론적으로 접근하는 방식 런던파: 런던의 프로그래밍 커뮤니티에서 시작 단위 테스트의 정의 단위 테스트는 작은 코드 조각을 검증하고 빠르게 수행하고 격리된 방식으로 처리하는 자동화된 테스트다. 격리 문제에 대한 런던파의 접근 코드 조각을 격리된 방식으로 검증한다는 것은 무엇을 의미할까? 런던파에서는 테스트 ...

Sep 3, 20243 min read

단위 테스트 1장 정리

단위 테스트 1장 정리 내용입니다. 단위 테스트에 시간을 투자할 때는 항상 최대한 이득을 얻도록 노력해야하며, 테스트에 드는 노력을 가능한 줄이고 그에 따르는 이득을 최대화해야 한다. 이 책에서 다루는 내용은 비용 편익 분석 방법을 배우고 특정 상황에서 적절한 테스트 기술을 적용할 수 있다. 또한 공통적인 안티 패턴을 피하는 방법도 배운다. 단위 테스트의 목표 단위 테스트의 목표는 무엇인가? 프로젝트의 지속 가능한 성장을 가능하게 하는 것이다...

Aug 27, 20242 min read

23년 하반기 회고

23년 상반기 회고에서 이어지는 글이다. 8 - 9월 이력서 제출 그리고 ... 이력서와 포트폴리오를 만들었다. 꽤나 잘 만들었다고 생각했다. 개발자 지인들의 첨삭, 인프런 멘토링, 유료 이력서 첨삭 서비스를 받으며 칭찬을 꽤 받았기 때문이다. 내가 보기에도 괜찮은 것 같고 ... 다른 사람들이 보기에도 괜찮다고 했으니 서류 합격률은 꽤 높을거라 생각했다. 50개의 서류를 넣은 결과, 3번의 서류 합격 그리고 단 한 곳에서만 최종합격했다. (최...

Jan 1, 20243 min read
23년 하반기 회고

[Android] Compose 수명 주기, 부수효과

수명 주기 개요 컴포지션은 UI를 기술하는 컴포저블의 트리 구조이다.컴포지션은 초기 컴포지션을 통해서만 생성되고 리컴포지션을 통해서만 업데이트 된다. 컴포저블의 수명 주기 컴포지션 시작 리컴포지션 컴포지션 종료 리컴포지션은 일반적으로 State<T> 객체가 변경되면 트리거됩니다. 컴포지션 내 컴포저블의 분석 컴포지션 내 컴포저블의 인스턴스는 호출 사이트(call site)로 식별된다. (호출 사이트는 컴포저블이 호출되는 소스코드 위치...

Dec 22, 20236 min read
[Android] Compose 수명 주기, 부수효과

[Android] rememberUpdatedState 완벽 이해

rememberUpdatedState 정의 공식 문서에는 다음과 같이 적혀있다. 값이 변경되는 경우 다시 시작되지 않아야 하는 효과(Effect)에서 값 참조 포스팅을 정리하면서 정의한 rememberUpdateState는 아래와 같다. remember는 초기 컴포지션에서만 값을 저장하고 리컴포지션 때 들어온 값은 저장하지 않는다. 리컴포지션 때 들어온 값도 저장하고 싶을 때 rememberUpdateState를 사용한다. 이게 도대체 ...

Dec 14, 20234 min read
[Android] rememberUpdatedState 완벽 이해

Jinukeu

33 posts