Thread란,
컴퓨터에서의 하나의 흐름을 의미한다.
흐름이 하나만 있는 경우를 Single-Thread라고 한다.
즉, Thread는 흐름을 분리하기 위해 사용하는 도구이다.
안드로이드는 메인 스레드가 아닌 스레드에서는 UI에 접근할 수 없는 치명적인 규칙이 있다.
즉, 다른 스레드내에서 TextView에 접근할 수 없다.
그러면, 어떻게 쓰레드에서 처리한 작업을 UI에 반영을 할까?
thread 내부 메소드인 runOnUiThread를 통해 UI에 접근할 수 있다.
이는, 안드로이드 개발 규칙이며 기본적으로 안드로이드는 쓰레드내에서 XML 객체 (UI)를 처리하지 못하도록 막아두었다.
무거운 작업들은 외부 공간에서 처리하도록 안드로이드 자체에서 설정해줬다.
Multi-Thread - 멀티 쓰레드
여러 흐름을 동시에 사용하는 것을 Multi-Thread라고 부른다.
예)
요리하기 (프라이팬을 쓰면서 어떤 재료를 넣을 지 생각하기),
강의 듣기 (강의자의 설명을 듣고 필기하기),
멀티플레이 게임 (각자의 캐릭터를 조작하면서 사건이 발생한다.),
채팅 (각자의 채팅 메시지를 전송)
Multi-Thread의 특징
실제로 여러 일을 동시에 하는 것이 아닌, 하는 작업을 계속 바꾸면서 진행한다.
그러나, 실제로 작업이 바뀌면서 지연되는 것을 보기는 어렵다. (기술의 발전, 소프트웨어, 하드웨어의 발전)
기술의 발전
동시성 (실제로는 여러 X, 보이기만 여러 개)
병렬성 (실제로 여러 작업)
CPU에 코어를 여러 개 두어 실제로 동시에 하는 것이 일반적이다.
각각의 흐름은 자율적으로 실행된다. => 자율성
각각의 흐름은 독립적으로 작업한다. => 독립성
정리해서, 앱 뷰 영역에서 보여지는 동작들을 독립적으로 분할해서 보여줄 수 있다.
(배달의 민족 메인 홈화면에서 하단 광고뷰 자동 스크롤 + 상단 뷰 메뉴선택가능)
독립적으로 프로세스가 작동하도록
쓰레드를 통해 설정해줄 수 있다.
동기
우리가 그냥 작성하는 코드들은 모두 동기
작업이 들어온 순서대로 결과가 도출된다.
즉, 요청을 하면 그 즉시 작업을 수행해서 결과를 내야한다.
장점 : 원하는 일을 순차적으로 진행할 수 있다.
단점: 하던 일의 결과가 나올 때까지 다른 일을 못한다.
비동기
시간이 오래 걸리는 작업 (예: 통신)에서 주로 사용한다.
작업이 들어온 순서와 상관없이 결과가 도출된다.
(도출 결과는 CallBack 함수로 보낸다.)
요청을 해도 그 작업이 바로 실행된다는 보장이 없다.
장점: 여러 작업을 동시에 진행해야 할 때 용의하다.
단점: 동기에 비해 작업들을 관리하기가 복잡하다.
# 비동기 작업 예시
API 요청을 통해 DB응답을 받을 때 시간딜레이가 생긴다.
그래서 이에 대한 작업을 비동기 작업으로 처리한다.
# 네트워크와 통신을 할 때,
비동기 작업으로 처리
(비동기 작업으로 처리를 해야지만, 사용자에게 로딩 뷰와 같은 이벤트 처리를 보낼 수 있다.
프론트는 사용자와 직접적으로 접촉하는 부분이니, 이벤트처리에 관해서 신경을 써서 코드작업을 해줘야한다.)
Thread 문제 & 해결
각각의 Thread가 같은 자원을 사용하려고 할 때 발생하는 문제 -> 공유 자원의 문제, 동기화 문제
- 하나의 Thread가 사용할 때, 해당 자원을 사용한다고 알려서 문제를 해결한다.
- 예민한 작업에 대해선, Thread에게 통제를 부여해 동시작업 시 문제를 해결한다.
안드로이드의 동기, 비동기를 처리하는 방식은 사용자의 이벤트에 따라서 처리해주고,
이벤트 처리에 대한 코드는 View의 Index로써 통제하여 관리한다.
예를들면, 자동 스크롤 기능을 만드려면
Activity에서 Index를 증가시킴
Index 값이 마지막 리스트 원소가 되면, 다시 index 초깃값으로 바꿈
이러한 방식으로, 자동 스크롤 기능이 추가된다~
역시, 개발은 뭐든지 해보면서 익숙해지는 것
실습 - Thread 실습
Thread는 작업을 분류해준다.
그래서 멀티 Thread를 통해 동시 작업을 가능하게 해준다.
그리고, 쓰레드 작업은 Activity에만 종속되지않고, 전체 OS 앱에서 동작하도록 구성할 수 있다.
Handler 클래스를 통해 멀티 쓰레드 동작에 대한 실행결과를 원하는 View에 뿌려주도록 설정한다.
(이는, 비동기 처리의 CallBack 함수로 처리하는 것과 비슷하다고 하심.)
Handler 클래스에 대해서 궁금하다면, 아래의 블로그를 더 참고하자
마치며
이제, 안드로이드 7주차를 접어들며, 사용자 처리에 대한 디테일한 요소까지 다뤄가고있다.
그만큼 내용이 어려워지지만, 개념을 배우다보면, 이전에 학습한 내용과 연결되고있고, 더 확장되어서 앱을 더 동적이고 유연하게 만들어가고 있다는 사실을 깨닫고 있다.
동적인 앱을 만들 땐, 사용자의 이벤트에 대한 처리를 더욱 더 고려하면서 작업을 진행된다는 사실을 뼈저리게 느끼고 있다.
백엔드는 예외처리를 죽도록 해야되는거면, 프론트는 이벤트 처리를 죽도록 해야된다는 걸 점차 느끼고 있다 ㅋㅋㅋㅋ
이 부분에 있어서 자신이 더 흥미가 가지는 분야로 진출하는게 올바른 선택인 듯하다.
아직까진, 프론트 이벤트 처리를 제대로 해보지 않아서 (실제 프로젝트 경험이 없기에) 프론트, 백엔드 둘 중 무엇이 내게 더 재미있는지는 상대적으로 결정하지 못하겠다.
이번 겨울방학 UMC 앱 런칭 프로젝트에서 프론트 안드로이드 개발자로써 참여해 프론트 개발자로써 경험을 쌓아나가보는 뜻깊은 경험을 해볼 것이다 ㅎㅎ
해보지 않고선, 어려움을 수치화할 수 없고, 수치화 된 어려움도 결코 언젠가 해결될 것이다.
그러니깐, 뭐든지 처음에 어설프게 도전하며 새로운 걸 매일매일 학습해나가는 사람이 되자.
안드로이드 어렵다. 그치만, 익숙치 않아서, 개념을 잘 몰라서 그런 것이니,
차근차근 처음부터 학습해나가는 자세를 지니자.
코드 영역이 어떻게 동작되어지는지를 차근차근 이해하다보면, 자연스레 확장된 기능까지 구현가능한 안드로이드 개발자가 되어있을 것이다.
UMC 앱 런칭 프로젝트를 성공적으로 완수하는 "그날까지" 열심히 그리고 열심히
그리고, 여유있는 개발자가 될 때까지 열심히 또 열심히
매사에 책임감있는 사람이 되자
'📚 스터디 > 프론트엔드' 카테고리의 다른 글
[안드로이드] 8주차: Room DB (0) | 2022.11.30 |
---|---|
[안드로이드] 7주차: Thread 실습 [타이머 제작] (0) | 2022.11.15 |
[안드로이드] 6주차 실습: BottomNavigation & ViewPager2 - TabLayout (0) | 2022.11.06 |
[안드로이드] 5주차 실습: RecyclerView 사용 (5) | 2022.11.05 |
[안드로이드] 6주차: 고급 Layout과 View (0) | 2022.11.05 |