본문 바로가기
활동/우아한테크캠프5기

우아한 테크캠프 1주차

by ESHC 2022. 7. 10.

1주차인만큼 교육에 앞서 우테캠 후기 형식의 내용과 다른 주차보다 짧은 기간이지만 진행됐던 교육과 프로젝트에서 배웠던 부분들에 대한 정리에 대한 글이다.


우아한 테크캠프 5기 시작

이번 주부터 우아한 테크캠프 5기가 시작되었다. 

캠프가 시작되었던 7월 5일 잠실에 위치한 우아한 형제들 더 큰 집에서 오리엔테이션이 진행됐다. 송재하 CTO님의 연설과 함께 전반적인 캠프 진행에 대한 설명을 들을 수 있었는데 보통의 마음가짐으로 임하면 안될 것 같다는 생각이 들면서 기대감과 동시에 해낼 수 있을까라는 걱정도 들었다. 걱정을 자신감으로 바꾸고 신입 개발자로서 중요한 터닝 포인트가 될 수 있는 두 달이 되도록 노력을 해야겠다.

 

오피스 투어를 할 수 있는 시간도 가졌는데 https://story.baemin.com/2674/ 에서 전반적인 오피스 모습을 확인할 수 있다. 스마트 오피스, 자율적인 분위기 등 꿈꿔왔던 형태의 회사 내부를 돌아보면서 다시금 교육에 대한 열의를 불태울 수 있었고 교육생 입장이 아닌 소속 개발자로서 다시 방문하고 싶다는 생각이 강하게 들었다.

 

장소를 옮겨 본격적인 교육을 받게 될 교육장에서 교육 진행에 대한 설명과 함께 캠프를 진행하게 될 다른 교육생들을 만날 수 있었다. 처음인만큼 어색한 분위기가 이어졌지만 우아한 형제들 DR팀에서 준비해주신 다양한 활동을 통해 친해지는 시간을 가질 수 있었다.

 

캠프 기간동안 안드로이드 교육을 해주실 Ivy(배인진) 강사님께서 인사와 함께 전반적인 안드로이드 교육에 대한 설명과 1주차에 진행할 프로젝트를 소개를 해주셨다.  프로젝트의 여러 요구사항을 들으면서 예전에 경험했던 부분도 있었지만 처음 개발을 해야하는 부분도 있었다. 게다가 3일 정도의 시간밖에 없었기 때문에  다 할 수 있을까라는 걱정도 있었지만 결과적으로 대부분의 기능을 구현할 수 있었다. 프로젝트를 통해 배우고 느꼈던 내용들은 아래에 추가로 정리하였다. 

 

이후 본격적으로 캠프가 진행되면서 직접 Ivy님께서 교육해주신 내용에 대한 이해와 복습과 해당하는 주차의 프로젝트에 대해 균형있는 시간 배분이 필요하다는 것을 느꼈다. 상황에 맞게 효율적으로 우선 순위를 두어서 8주 동안 많은 것을 얻어 갈 수 있는 캠프가 되길 바란다. 

 

사진엔 없지만 노트북 가방도 받았다!


Review

다크 모드 적용

다크 모드를 on / off 할 때 ui의 색을 모드에 맞게 적절히 변경시켜야한다. 

테마에서 MaterialComponents.DayNight나 AppCompat.DayNight 를 이용해서 대응이 가능하다.

android:background="?android:attr/colorBackground"

위와 같은 코드를 이용하면 모드에 맞게 적절하게 배경 색깔이 바뀌는 것을 확인할 수 있고, 따로 background를 지정하지 않아도 모드에 맞게 색깔이 바뀌는 것 같다.

color나 drawable 등 기본 색깔이 아니라 커스텀이 필요한 경우도 있는데 night 폴더를 만들어서 사용할 수 있다.

vector 이미지를 사용할 때 다크모드에서 사용할 이미지를 drawable-night 폴더에 일반 모드의 이미지와 같은 이름으로 만들어주면 다른 설정없이 적용되는 것을 확인할 수 있다.

마찬가지로 color-night를 만들어서 color도 손쉽게 적용이 가능하다. 

 

다양한 화면 사이즈 대응

태블릿을 사용하거나 화면을 회전하여 가로로 사용을 할 경우에 대비하여 적절하게 뷰의 배치를 바꾸는 등의 대응이 필요하다.

이번 프로젝트에서는 간단하게 가로가 600dp이상인 경우에 사용되어지는 layout을 따로 만들어서 대응을 하였다.

w600dp 폴더안에 같은 이름의 레이아웃을 만들고 일반 레이아웃과 다르게 뷰를 추가하거나 기존의 뷰를 삭제하고

코드 상에서 해당 뷰가 null인지 아닌지에 따라 초기화작업을 하거나 안 하도록 처리하여 원하는 결과를 얻을 수 있었다.\

화면 회전을 하면 onCreate부터 다시 호출이 되기 때문에 이를 유의하고 코드를 작성해야한다.

 

상태 유지(화면 회전 등으로 인한)

다크 모드로 전환을 하거나 화면 회전을 할 경우 onDestroy 이후 onCreate가 다시 불려져서 데이터를 유지하는 작업이 필요하다.

ViewModel을 이용하거나 onSaveInstanceState를 이용하여 유지할 수 있다.

액티비티가 destroy 되더라도 뷰모델은 남아있기 때문에 뷰모델에 데이터를 저장하여 상태를 유지할 수 있고 

onSaveInstanceState()를 이용하면 번들에 저장이 되어 데이터를 저장하고 불러올 수 있어서 상태를 유지할 수 있다.

 

FragmentManager

fragment를 전환할 때 Jetpack의 Navtigation을 이용하여 간단하게 구현이 가능하지만 FragmentManager를 이용하여 전환할 수 있다. FragmentManager의 fragment transaction을 사용하면 되는데 fragment의 추가, 삭제, 변경이 가능하다. 한 transaction에 여러 작업을 묶어서 처리할 수 있다. 예를 들어 A 프래그먼트와 B 프래그먼트를 삭제하고 C 프래그먼트를 추가하는 작업을 한 트랜잭션으로 묶어 처리할 수 있다. 

fragment가 추가되면 backstack에 쌓이게 되는데 이를 어떻게 처리하는지가 중요하다. 백 버튼을 이용하여 프래그먼트가 전환할 때 backstack에 쌓인 fragment의 순서를 이해하여 적절하게 처리하여야 한다.


Constraint Layout 특징 및 장점

Constraint Layout은 복잡한 레이아웃의 계층구조를 제약조건을 통해서 단순하게 표현이 가능하도록 한다. 제약조건을 이용하기 때문에 화면의 사이즈가 바뀌더라도 원하는 위치에 배치가 가능하여 대응이 가능하다.

 

Activity - Task, BackStack

특정 작업을 위해 사용자와 상호작용하는 액티비티들의 모음이 Task라고 한다. 이 액티비티들은 스택 구조로 쌓여가는데 이 스택을 BackStack이라고 한다. 스택 구조로 액티비티가 쌓이기 때문에 이를 이해하고 액티비티가 전환되는 작업을 처리해야한다.

 

Activity launch mode

Manifest의 launch mode를 이용하여 스택에 쌓이는 방식을 정할 수 있고, 새로운 태스크를 생성할 수 도 있다. 보통의 경우에는 standard와 singleTop을 사용하는데 이는 스택의 최상단에 있는 액티비티가 호출할 액티비티와 같은지 다른지에 따라서 새로 액티비티를 생성할지 말지를 결정할 수 있어서 적절하게 사용해야한다.

 

Intent flag

Manifest의 launch mode를 사용하지 않고 코드상에서 액티비티 Task 관리를 할 수 있는데 이 때 Intent Flag를 사용한다. 

FLAG_ACTIVITY_SINGLE_TOP와 같이 launch mode와 동일한 형태로 적용 가능한 flag도 있고 FLAG_ACTIVITY_REORDER_TO_FRONT(스택에 호출하려는 액티비티와 동일한 액티비티가 있을 경우 최상위로 올려줌)처럼 다른 형태의 flag도 있기 때문에 적절하게 적용해야한다. 자세한 내용은 아래 블로그 글을 참고했다.

https://medium.com/@logishudson0218/intent-flag에-대한-이해-d8c91ddd3bfc

 

Intent Flag에 대한 이해

Android에서 Intent를 공부하다보면단순히 Activity 간의 이동이 아닌 Stack구조를 가지고 있는 Task를 만나게 된다. ‘오늘은 이 Task를 어떻게 활용하면 좋을까?’ 에 대해 학습하고자 한다. 그 내용이

medium.com

 

 

LifecycleOwner

Fragment에서는 fragment의 lifecycle 과 view lifecycle를 따로 가지고 있기 때문에 binding 작업을 할 때 viewLifecycleowner를 사용하는 것이 적절하다.

 

fragment binding 처리

fragment에서 binding 사용 시 불필요한 메모리 누수를 위해 onDestroyView()에서 binding을 null 처리를 하는 작업이 필요하다. 자세한 내용은 아래 블로그를 참고했다.

 

https://velog.io/@seokzoo/ViewBinding-에서의-null-처리

 

Fragment에서의 ViewBinding null 처리

Fragment ViewBinding에서 null 처리

velog.io

댓글