본문 바로가기
Projects/It's My Waye

[It's My Waye] 16. 프로젝트 종료 및 회고

by DevJaewoo 2022. 6. 8.
반응형

Intro

https://github.com/DevJaewoo/its-my-waye

 

GitHub - DevJaewoo/its-my-waye

Contribute to DevJaewoo/its-my-waye development by creating an account on GitHub.

github.com

 

드디어 장장 5달에 걸친 프로젝트가 끝이 났다.

결과물을 보면 일주일 만에 만들어도 이상할 게 없는 규모인데, 안드로이드를 완전 처음 해보는 것이기도 하고,

무엇보다 혼자 프로젝트를 진행하다 보니 미루고 미뤄도 남들에게 전혀 피해가 가지 않기 때문에 마음 놓고 놀았던 게 컸다.

깃허브 커밋 기록
2월 말부터 5월까지 텅텅 빈 커밋 기록들...

그래도 '하던 건 마저 마무리해야지'라는 마음가짐으로 5월 중순부터 다시 시작해 거의 2주 만에 완성시켰다.

마지막 2주 동안은 1~2월과는 다른 패턴으로 개발했는데, 이 개발 패턴을 바꾸니까 효율이 훨씬 좋아졌다.

아무래도 나한테 맞는 공부법을 찾은 것 같다. (22살에 공부법을 찾았다는 게 살짝 늦은 감이 있는 것 같다.)

 

그럼 이제 진짜 회고를 시작해보도록 하겠다.


프로젝트 소개

첫 글에도 설명했지만 다시 한번 간단하게 작성해보겠다.

 

로스트아크에는 '웨이'라는 아이템이 있는데, 정해진 시간마다 극히 낮은 확률로 구매할 수 있는 기회가 생긴다.
한 달에 1~2번 밖에 기회가 오지 않기 때문에 보통 이를 놓치지 않기 위해 디스코드 서버에 들어가 웨이가 떴을 때 알림을 주도록 설정한다.
그런데 이 디스코드 알림이 너무 작아서, 알림은 떴는데 듣지를 못해서 기회를 놓치는 일이 빈번하게 일어났다.

이렇게 알람까지 설정했는데 알림을 못 들어서 기회를 놓치면 정말 억울하기 때문에

이제는 알림이 안 뜰지언정 알림을 놓치는 일은 발생하지 않도록 할 필요가 있었다.

그렇게 개발하게 된 웨이가 뜨면 벨소리나 진동을 울려 억울한 일이 생기지 않도록 해주는 앱이다.

 

https://devjaewoo.tistory.com/56?category=1034273 

 

[It's My Waye] 1. 프로젝트 기획

프로젝트 시작 배경 요즘 '로스트아크' 라는 게임을 재밌게 플레이하고 있다. 간략하게 설명하자면 내 캐릭터를 성장시키고, 파티를 구해 보스를 잡는 게임이다. 파티에 들어가야 하는 만큼 내

devjaewoo.tistory.com


기술 스택

Language

Framework

Version Control


잘못한 점

Room 대신 SQLite 사용

로컬 DB 개발을 시작할 때 "Room 같은 라이브러리보단 SQL 쿼리 하나하나 직접 짜가면서 만드는 게 진짜지"라는 마음가짐으로 Room 대신 일일이 CREATE, SELECT, INSERT, UPDATE, DELETE 쿼리를 작성했다.

그 결과 코드의 몸집이 아래와 같이 몇 배로 커지는 것은 물론, 버그도 자주 발생하고 유지보수도 힘들어졌다.

 

아래의 코드는 Alarm Entity 테이블을 만들고 제어하기 위해 추가된 코드이다.

원래는 변수랑 생성자만 선언하면 돼서 코드가 그렇기 길지 않았는데, DB 관련 코드가 붙으면서 몸집이 확 늘어났다.

class Alarm {

    ...

    object TableInfo : BaseColumns {
        const val TABLE_NAME = "Alarm"
        const val COLUMN_NAME_FILE_PATH = "filePath"
        const val COLUMN_NAME_VOLUME = "Volume"
        const val COLUMN_NAME_VIBRATE = "Vibrate"
        const val COLUMN_NAME_FULLSCREEN = "Fullscreen"
        const val COLUMN_NAME_OFFTIME_START = "OffTimeStart"
        const val COLUMN_NAME_OFFTIME_END = "OffTimeEnd"
    }

    companion object {
        const val SQL_CREATE_TABLE = "CREATE TABLE IF NOT EXISTS ${TableInfo.TABLE_NAME} (" +
                "${BaseColumns._ID} INTEGER PRIMARY KEY AUTOINCREMENT," +
                "${TableInfo.COLUMN_NAME_FILE_PATH} VARCHAR(50) NOT NULL," +
                "${TableInfo.COLUMN_NAME_VOLUME} INTEGER NOT NULL," +
                "${TableInfo.COLUMN_NAME_VIBRATE} INTEGER NOT NULL," +
                "${TableInfo.COLUMN_NAME_FULLSCREEN} INTEGER NOT NULL," +
                "${TableInfo.COLUMN_NAME_OFFTIME_START} INTEGER NOT NULL," +
                "${TableInfo.COLUMN_NAME_OFFTIME_END} INTEGER NOT NULL" +
                ")"

        const val SQL_DROP_TABLE = "DROP TABLE IF EXISTS ${TableInfo.TABLE_NAME}"
    }

    fun toContentValues(): ContentValues = ContentValues().apply {
        put(TableInfo.COLUMN_NAME_FILE_PATH, filePath)
        put(TableInfo.COLUMN_NAME_VOLUME, volume)
        put(TableInfo.COLUMN_NAME_VIBRATE, vibrate)
        put(TableInfo.COLUMN_NAME_FULLSCREEN, fullscreen)
        put(TableInfo.COLUMN_NAME_OFFTIME_START, offTimeStart)
        put(TableInfo.COLUMN_NAME_OFFTIME_END, offTimeEnd)
    }
}

 

DBHelper는 100줄이 넘어가서 링크로 대체하겠다. Github 링크

 

GitHub - DevJaewoo/its-my-waye

Contribute to DevJaewoo/its-my-waye development by creating an account on GitHub.

github.com

 

쌩 SQLite를 사용한 것이 경험적인 측면에선 나쁘지 않다고 볼 수 있지만 완성도 측면에서는 별로였다고 생각한다.

다음에 안드로이드 프로젝트를 하게 되면 DB는 Room으로 구현해봐야겠다.

 

주석의 부재

주석을 다는 게 습관화되어있지 않다 보니 기능과 관련된 코드를 한 번에 다 작성하고 "지금 당장은 이해가 잘 되니 나중에도 이해할 수 있겠지"라는 생각으로 넘어갔던 게 몇 주가 지나고 돌아오니 이해가 안 됐다.

결과적으로 주석 다는데 걸렸을 시간보다 코드를 다시 이해하는데 더 많은 시간을 쏟아버렸다.

 

Ex) 기기에 있는 벨소리 목록을 불러와 ArrayList에 저장하는 코드

무슨 코드인지 알고 보면 그냥 넘길 수 있지만, 아무것도 기억이 안나는 상태에서 보면 RingtoneManager.cursor가 뭔지, moveToNext가 뭘 하는 함수인지 등등 다시 해석하고 찾아봐야 하기 때문에 시간 낭비가 심해진다.

주석이 없는 코드

주석을 한줄한줄 다 다는 것까진 아니더라도 핵심 로직이나 이해하기 힘든 코드, 라이브러리 함수들은 간단하게 설명을 붙이는 게 좋을 것 같다.

 

공백 기간

깃허브 커밋 기록

위에 언급했듯이 2월 말 ~ 5월 중순까지 프로젝트에 손을 거의 대지 않았다.

개발을 멈춘 원인으로는 게임이 가장 컸다.

 

프로젝트 개발 초기인 1 ~ 2월 동안은 퇴근 후 10시까지 게임을 하다가 10시가 되면 개발하는 패턴으로 진행했는데, 여기엔 2가지 문제가 있었다.

 

1. 게임을 10시 정각에 끄는 게 생각보다 쉽지 않다.

난 싱글 플레이 게임을 주로 하는 편인데, 싱글플레이 게임 중엔 스토리 요소가 들어간 게임이 많다.

게임을 진행하다 보면 스토리와 관련된 이벤트나 퀘스트가 계속 생기는데, 조금만 더 하면 퀘스트가 완료될 것 같아서 이미 10시가 됐는데도 불구하고 "조금만 더, 이 퀘스트 깰 때까지만 하고 진짜 시작하자." 하게 되는 상황이 계속 발생했다.

 

2. 게임을 하고 나면 피곤하다.

당연한 얘기지만 몇 시간 동안 집중해서 게임한 데다 시간이 벌써 밤 10시가 넘었다면 피곤할 수밖에 없다.

하물며 10시에 꺼도 모자랄 판에 조금씩 더 하다가 시간이 더 늦어지면 쏟아지는 졸음을 참을 수 없다.

결국 개발 툴은 켜놨지만 책상에서 졸게 되고, 그날 개발은 하나도 진행되지 않은 채로 그냥 침대에 가서 자게 된다.

 

이렇게 초반에는 10시에 버티면서 개발을 진행했지만, 시간이 지날수록 개발을 시작하기도 전에 잠들어버리며 점점 흐지부지됐다.


잘한 점

공백 기간을 뚫고 다시 진행

이렇게 프로젝트가 거의 잊히다 다른 프로젝트를 시작해야 될 때가 왔다.

다른 프로젝트를 시작하기 전에 기존 프로젝트는 마무리하고 싶다는 생각이 들어서 위의 문제점을 보완한 패턴으로 개발을 다시 진행했다.

 

이전과 비슷하지만, 이번엔 퇴근 후 10시까지 개발을 하다가 10시가 되면 게임을 시작했다.

10시 기준으로 앞뒤만 바꾼 게 다지만 차이가 컸다.

늦은 밤이 아니기 때문에 멀쩡한 정신력으로 개발할 수 있고, 오히려 10시가 됐는데도 개발하던 기능을 마무리하고 싶다는 생각이 들게 된다.

 

게임은 집중력이 그리 높지 않은 상황에서도 할 수 있으니 개발, 게임 중 어느 하나 포기하지 않아도 되었다.

비록 2달의 시간을 날렸지만, 의도치 않게 나에게 맞는 공부법을 찾은 것 같다.

테스트 코드 작성

DB 관련 테스트케이스
DB 관련 테스트 케이스

SQLite를 통해 DB를 제어하면서 나 자신을 신뢰할 수 없게 됐다.

내가 작성한 코드가 왠지 정상적으로 동작하지 않을 거란 생각이 계속 들어서 테스트 코드를 작성해봤다.

비록 DB와 관련된 테스트 밖에 없지만, 이 테스트들이 DB에서 발생할 뻔했던 수많은 버그들을 사전에 걸러주었다.

UI나 진동, 알람 등 메인 기능에 관련된 테스트 케이스는 만들지 못했지만, 테스트 코드를 작성하고, 그를 통해 버그를 사전 차단했다는 데에 의의를 두고 싶다.

 

피드백 수용

지인 피드백

2022년도 기준 인기가 많은 게임이다 보니 주변에 이런 앱이 필요한 사람이 있었고, 덕분에 사용자를 쉽게 구할 수 있었다.

다른 사람들이 내가 만든 앱을 직접 사용해보면서 내가 알아차리지 못한 문제점과 좋은 아이디어들을 제시해줬고, 제시한 아이디어 중 괜찮은 것들을 적용시켰다. 이렇게 다른 사람들에게서 나온 아이디어들이 앱의 완성도를 높이는데 큰 도움이 됐다.

 

플레이스토어 앱 출시

플레이스토어 출시 결과

이제 플레이스토어에 "마이웨이"라고 검색하면 맨 위에 내가 만든 앱이 뜬다.

플레이스토어에 올리지 않고 apk 파일로만 배포할 수도 있었지만, 내가 만든 앱을 다른 사람들이 봤으면 하기도 했고, 좋은 경험이 될 거라 생각해서 올려봤다. (플레이 콘솔 개발자 계정 만드는데 3만 원인가 들었다.)

 

결과적으로 좋은 선택이었다는 생각이 든다.

안드로이드 사용자라면 누구나 내가 만든 앱을 다운받을 수 있다는 장점도 있고, 내가 만든 앱이 초등학교 때부터 봐온 플레이스토어에 올라간다는 것도 신기하다.

비록 사용자는 적지만 그래도 내가 만든 앱을 필요해하고 사용해주는 모습들을 보니 그동안 앱을 허투루 개발한 게 아니라는 생각이 들어 뿌듯하다.


추가할 점

Discord OAuth

지금 앱의 가장 큰 문제점은 알림이 떠야 동작하는 것이다.

바꿔서 말하면 알림이 뜨지 않으면 동작하지 않는다.

 

디스코드의 버그인지 안드로이드의 오류인지 모르겠지만, 디스코드 알림이 오지 않는 경우가 빈번하다.

때문에 알림에 의존하는 것이 아닌 디스코드 API를 이용해 채팅방 데이터를 읽어 들여 알람을 켜는 기능이 있으면 놓치는 일이 훨씬 줄어들 것 같다.

 

전화 화면 커스터마이징

전화 화면

지금 전체화면 알림 화면에는 웨이 사진이 상대방 프로필로 뜨도록 되어있는데, 이를 원하는 사진으로 바꿀 수 있는 기능이 있으면 좋겠다는 요청이 있었다.

 

갤러리에서 사진을 선택하도록 하고, URI를 SharedPreference에 저장하면 되니 금방 만들 수 있을 것 같다.


마치며

비록 중간에 공백이 있기는 했지만, 여러모로 도움이 된 프로젝트였다.

 

현재 회사에서 진행 중인 프로젝트에서 안드로이드 앱과 서버를 만들고 있는데, 이 프로젝트를 하며 안드로이드 경험을 쌓았던 게 개발 시간 단축에 큰 도움이 됐다.

 

또한 공백 기간을 통해 배운 공부법 덕분에 두 번째 프로젝트는 4일 만에 완성할 수 있었다.

 

앞으로 또 좋은 아이디어가 떠오르면 그 아이디어로 새로운 프로젝트를 진행해보고 싶다.

 

마지막은 웨이 사진으로 마무리하도록 하겠다.

웨이 사진

반응형