Uing? Uing!!

안드로이드 개발을 공부한 과정에 대한 이야기 본문

일기

안드로이드 개발을 공부한 과정에 대한 이야기

Uing!! 2020. 7. 27. 03:23
반응형

들어가며

학부 졸업을 앞두고 안드로이드 개발자로서 진로를 확정했다.

지금은 꿈에 그리던 회사의 면접에 참여하고 있고 최종 발표를 기다리고 있다.

이 글을 쓰는 이유는, 커리어를 쌓기 시작하면 학부 중에 시간을 내어 안드로이드를 공부했던 것이 별 게 아닌 것처럼 느껴질 것 같아서이다.

빠르게 많은 것을 배우지는 않았더라도 나름대로 노력한 것을 회고하고자 글을 작성하기로 했다.

2018년부터 2020년까지 내가 공부하고 했던 일들에 대해 적지만, 벌써 2018년의 일들은 간략하게만 기억나기 때문에 뒤로 갈수록 상세한 내용을 작성하게 될 것 같다.

 

2018, 안드로이드를 처음 접하다

컴퓨터과학과 전공이야 여럿 들었지만, 안드로이드 개발은 완전히 새로운 분야였다.

누구나 한 번쯤은 모바일 어플리케이션을 만들어보고 싶다는 그런 로망을 가지기 마련이다. 아님 말고.

나한테는 그랬다. 작은 스마트폰 화면에서 이런저런 기능들을 만들어내는 것이 멋있어 보였고 도전해 보고 싶었다.

전공 수업에서는 이론적인 내용이 주를 이루었으므로, 안드로이드는 혼자 공부하기로 결정했다.

 

처음 안드로이드 개발을 공부하기 시작한 것은 2018년이었다.

안드로이드 입문은 2018년에 Kotlin을 할까 하다가 아직 이르다는 이야기를 듣고 Java로 시작하게 되었다.

당시 처음 공부하려고 읽었던 책이 2016판이었나, '안드로이드 프로그래밍 정복'이라는 아주 두꺼운 책이었다.

지금은 안드로이드 버전이 너무 많이 올라가서 활용할 수 없게 된 책이지만 처음 접한 책이어서인지 나에게는 처음 안드로이드 개발에 대한 방향을 잡게 해 준 훌륭한 스승으로 기억에 남았다.

2~3주만에 기초를 어느 정도 이해하고 간단한 어플리케이션은 개발할 수 있는 수준이 되었다.

 

그러던 중, Kotlin이 대세가 되어 가는 분위기라는 말을 들었다.

어떤 언어이길래 인기가 있을까 하고 관심이 생겼다. 대세에 뒤쳐지고 싶지 않은 마음도 있었다.

Kotlin을 배우기 시작했다. 책을 활용하지는 않았다. 그냥 막무가내로 Kotlin으로 프로젝트를 옮겨 보려고 시도했다.

그래서일까, 금세 Kotlin으로도 작은 어플리케이션들을 제작할 수 있게 되었음에도 왜 코틀린이 좋은지에 대해서는 제대로 이해하지 못했던 것 같다. 코드가 깔끔하다는 것만 장점으로 느껴졌다.

Kotlin의 장점들이 하나씩 와닿은 것은 조금 더 나중의 이야기다.

 

2018년에 어떤 앱들을 만들었더라.

전역을 150일 남짓 앞둔 친구의 '전역일 앱들이 다 커플 위주라서 마음에 안 든다'라는 이야기를 듣고 만든 '전역하자'.

정말 아무 기능도 없이 얼마나 괜찮아 보이는 앱을 만들 수 있을까 싶어서 만들어 본 '지나가리라'.

동아리 사람들과 운세 보는 느낌으로 점심 메뉴나 결정하려고 열심히 트랙패드로 그림 그려 만든 '나비에게 무러바'.

한창 로스크아크를 하던 때에 만들었던 숙제 체크리스트 앱 '로스트아크: 숙제했니?'.

돌아보면 모자란 실력으로도 당당하게 끄적끄적 열심히도 했다.

 

2018년에 공부하기 시작했다고는 하지만 이때 작성한 코드들은 민망할 정도로 간단하다.

전공을 들으면서 연극도 하고, 다른 동아리도 하고, 교내 학회 창설도 준비하고... 참 하고 싶은 일들이 많았던 것 같다.

온갖 일들을 한 번에 하려고 하니 상대적으로 공부할 시간이 적었고 배우는 속도도 느렸다.

그럼에도 조금씩 공부하면서 플레이스토어에 소소하게나마 어플리케이션들을 내놓을 수 있었고 그게 참 재미있었다.

 

2019, 프로젝트에 참여하고 (감히) 안드로이드 세미나를 열다

2019년 초였던 것 같다. 교내에서 카메라 앱개발 팀원을 구한다는 글이 있었다.

솔직히 정말 사소한 어플리케이션들만 내놓아서 얼마나 팀에 기여할 수 있을지에 대한 자신은 없었다.

하지만 제대로 디자인 인력과 함께 프로젝트에 한번 참여해보고 싶었다.

조심스레 연락을 드렸고, 다행히 환영해 주셔서 팀원분들과 좋은 인연을 맺을 수 있었다.

한 학기동안 꽤 많은 부분을 개발했지만 결국 이런저런 이유로 팀이 와해되었고 프로젝트는 아쉽게 마무리되었다.

 

프로젝트가 아쉽게 끝났다고 해서 내가 많이 발전하지 못했던 것은 아니라고 생각한다.

처음으로 SurfaceView를 활용해 보았고, 안드로이드 하드웨어의 몇몇 기능들을 건드릴 수 있었다.

이전에는 찾아보지 않았던 Glide와 같은 외부 라이브러리도 활용해 보았고, 갤러리를 구현하면서 Adapter의 기능에 대해서도 드디어 제대로 이해했다는 느낌을 받았다.

디자이너와 협력을 해 보았다는 점도 큰 의미가 있었다.

어떤 것들을 고려해야 하는지, 디자이너분께 어떤 것들을 부탁드려야 하는지에 대해 알 수 있었던 좋은 기회였다.

 

2019년 초에는 나에게 한 가지 이슈가 더 있었다. UX학회 창설에 참여한 것이다.

모바일 앱개발을 하면서 모바일 화면에서의 UX 디자인에 대해서도 알아보고 싶은 마음이 컸다.

마음 맞는 6명의 학부생들이 모여서, UXIM이라는 학회를 창설하게 되었다.

1년 간 기획부장으로 활동했는데, 2학기 때에는 감히 'Java를 활용한 안드로이드 앱개발 기초'라는 세미나를 열었다.

 

내가 안드로이드를 완벽하게 알지 못한다는 것은 인지하고 있었다.

하지만 누군가는 가르쳐야 했고, 가장 적임자가 나였고, 잘 해내기 위해서 시간을 들여서 다시 공부했다.

8회에 걸쳤던 이 세미나는 참석해 준 학회원들뿐 아니라 나에게도 알고 있다고 생각했던 것들을 꼼꼼히 다시 생각해 볼 수 있는 아주 감사한 기회가 되었다.

(물론 이번 면접 코드리뷰에서도 지적을 받았듯이, 모든 코드가 완벽하진 못했다. ㅠ_ㅠ)

 

2020-(1), 연구실에서 이미지처리 앱을 개발하다

졸업을 앞둔 2020년 2월, 학번이 학번인지라 주변에 대학원생들이 몇 있었다.

그리고 내 주변 사람들은 내가 여러 작은 어플리케이션들을 개발하고 있다는 것을 어느 정도 알고 있었다.

연세대학교 전기전자공학부의 모 연구실에 있던 친구에게 연락이 왔다.

'우리 연구실에서 이미지처리용 어플리케이션을 개발해야 하는데, 지원해볼 생각이 있느냐'고 했다.

전혀 모르는 분야인 광학 쪽이었고, openCV를 이용해서 이미지처리 속도를 내야 했다.

자신은 없었다. 하지만 정말 많이 배울 기회가 될 것 같았다. 그래서 일단 지원했다.

 

쟁쟁한 지원자들 사이에서 운 좋게도 내가 선정되었다.

카메라로 촬영을 하고 또 이미지처리를 하는 어플리케이션을 개발하면서 많은 어려움을 겪었다.

초보 앱개발자가 뛰어들기에는 어려운 분야였던 것에는 틀림이 없다.

그래도 매 주 미팅마다 교수님과 대학원생 선배님들을 실망시키지 싶지는 않았다.

밤을 새서 개발했고, 오류를 해결했고, 어찌어찌 뭔가를 만들어냈다.

 

이 과정에서 정말 많은 것을 배웠다.

카메라 하드웨어의 정말 하드한 부분들을 건드려 보았고, 외부 라이브러리도 이것저것 가져다 쓰며 시행착오를 겪었다.

허접하게나마 프로파일링 기능도 이용해 보았고, Git 브랜칭도 활용해 보았다. 참고로 브랜칭은 개판오분전으로 했다.

그래도 Git commit 메시지를 아무렇게나 적지 않고 정돈해야 하겠다는 것 정도는 체감했다.

가장 큰 발전으로는, 그 전까지는 UI Thread만을 이용해 보았는데 처음으로 안드로이드에서의 Thread 활용을 좀 이해하게 되었다.

아무 것도 몰랐던 처음에는 UI Thread에서 이미지처리를 하다가(...) new Thread를 직접 만들어서 Message를 주고받으며 백그라운드에서 이미지처리를 하게 수정했다. 이후 RxJava도 활용하게 되었는데, 이 부분은 2020-(2) 내용에.

 

해내지 못할 것만 같았는데 이게 놀랍게도 완성이 되었다.

개발담당으로서는 복에 겹게도 논문에 공동저자로 이름을 실었다.

앱은 학회에서 무사히 공개되었다. 감격의 순간이었다.

졸업하고 안드로이드 커리어를 밟겠다고 결정한 이상 이런 기회가 또 어디 있겠는가!

제1저자도 아니면서 논문 포스터 앞에서 열심히 사진을 찍었다. 헤헤.

 

2020-(2), Kotlin, MVVM, RxJava... 리팩토링을 시도하다

연구실 어플리케이션을 공개했다고 끝난 것은 아니었다. 많은 부분들이 아쉬웠다.

이미지처리가 느렸다. Null 에러가 자주 발생했다. 그리고 아주 아주 더러운 MVC 구조였다.

이미지처리를 담당하는 Activity는 무려 2천 줄이 넘었다. 아 이건 좀.

Null... 코틀린! 코틀린으로 해야겠다는 생각이 들었다. 그러면 코드도 줄고 Null처리도 좋을 것 같았다.

구조적으로는 이쯤 MVVM이라는 개념을 처음 접했다. 잘은 몰라도 적용하면 Activity가 조금 덜 더러워질 것 같았다.

필요 없는 함수들이 많아 보였다. 지워야겠다고 생각했다.

RxJava도 이때 처음 접했다. 병렬처리를 하기로 했다. RGB를 병렬로 처리하면 3배는 아니더라도 빨라질 것 같았다.

 

결국 전부 시도했고 한 가지만 빼고는 무사히 적용했다!

진짜 진짜 진짜로 내 수준에서는 프로젝트를 완성했다고 생각하고 지난 주에 내려놓았다.

그래서 이번 주부터는 연구실에 매 주 나가지 않는다.

뿌듯하다. 그리고 아주 많은 것들을 새로 배웠다.

 

코틀린으로 리팩토링을 하면서 코틀린이 정말 좋다는 것을 새삼 깨달았다.

특히 Nullable과 Non-Nullable을 ?와 !!으로 사전에 깔끔하게 구분을 해줌으로서 에러를 최소화할 수 있다는 점에 감탄했다.

그 밖에도 람다식이 깔끔했고, when 문법도 아주 마음에 들었다.

코드 양도 획기적으로 줄어서 거의 반 이하로 줄어들었다.

 

MVVM은 조금 난해한 개념이었다.

면접 사전과제에서 처음 써 본 것을 적용하려고 했는데, 뜯어보다 보니 우리 프로젝트가 ViewModel을 활용하기에 적절한 프로젝트는 아닌 것 같았다.

대신 코드를 정리했다. Model, View, Util, Adapter를 분리했다. 훨씬 깔끔해지긴 했다.

더 좋은 방법이 있을지도 모르겠지만 일단은 만족스러웠다.

 

RxJava는 신세계였다. 평소 접하던 문법들과는 완전히 다른 느낌이었다.

여러 GitHub 코드들을 보면서 이 문법에 익숙해지고자 했다. 익숙해졌는지는 모르겠다.

한 가지 느꼈던 점은 복잡한 병렬처리가 있을 경우에는 RxJava 코드가 너무 난해해지지 않게 잘 조절해야 할 것 같다는 점이었다.

복잡했지만, 다양한 기능들을 (직접 Thread를 만드는 것에 비해) 편리하게 지원해 주는 점이 좋았다.

또한 Threading으로 인해 발생하는 에러를 조금 방지할 수 있다는 느낌을 받았다.

 

RxJava의 completable, map, concat 등을 이용하여 정신 없던 스레드를 정리하였다.

결과적으로 이미지처리 속도는 2.n배가 향상되었다!

결과를 얻고는 그냥 2.n배 향상이 되었구나 하고 말았는데, 이후 이번 면접에서 병렬성에 대한 이야기가 나와서 어떻게 이런 결과가 나올 수 있었는지에 대해 다시 한 번 생각을 해 볼 수 있었다.

MVVM과 RxJava는 이제 막 걸음마를 내딛었기 때문에 아직 공부할 내용이 많을 것 같다.

 

그리고 지금.

연구실에서 앱을 본격적으로 만들어 보면서 결정했다.

아 이게 내 진로구나. 나는 여기에서 재미를 느끼는구나. 안드로이드를 더 배우고 싶다.

아직 갈 길이 먼 초보 안드로이드 개발자이지만 지금까지 내가 해 온 것들을 포트폴리오로 정리했다.

진로를 확정하고 나서는 미뤄 두려고 했던 취업준비를 갑작스레 시작했다.

면접을 보았고 감사하게도 최종까지 왔다. 발표를 앞두고 있다.

긴 면접 과정에서도 정말 많은 것들을 새롭게 배울 수 있어 감사한 기회였다.

이에 대한 내용은 조금 더 나중에 다른 포스트에서 작성하고자 한다.

일단은 꼭, 꼭, 꼭, 붙었으면 좋겠다.

반응형
Comments