본문 바로가기
혼공노트

안드로이드 ViewModel을 공부해보자 (with ChatGPT) (2)

by 김비거 2024. 2. 24.

GPT의 답변마다 모르는 단어들을 또 다시 물어봄 (2024-02-23)

 

계속 ViewModel로부터 시작하여 모르는 단어들을 ChatGPT한테 물어보며 공부합니다.

 

 

* 빨간색 형광펜: 찾아서 알게된 단어(개념) (2024-02-23 기준)

* 노란색 형광펜: 아직 찾지 않은 단어(개념) (2024-02-23 기준)

* 초록색 형광펜: 주제에서 벗어나 나중에 찾을 단어(개념)

 

 


0. ViewModel이 무엇입니까?

1. MVVM (Model-View-ViewModel) 아키텍처 패턴이란?

 

 

 

 

2. 아키텍처 패턴이란?

더보기

아키텍처 패턴은 소프트웨어 시스템을 설계하고 구축하는 데 사용되는 구조적인 체계나 설계 원칙의 집합을 말합니다. 이러한 패턴들은 시스템의 구조를 조직화하고, 코드의 유지 보수성, 확장성, 재사용성, 테스트 용이성 등을 향상시키기 위해 개발되었습니다.

 
아키텍처 패턴의 주요 목표는 다음과 같습니다:
 

1. 모듈성(Modularity): 시스템을 독립적인 구성 요소로 나누어 유지 관리하기 쉽게 만듭니다.

2. 유연성(Flexibility): 시스템을 변경에 대해 유연하게 만들어 새로운 요구 사항을 수용할 수 있도록 합니다.

3. 확장성(Scalability): 시스템이 증가하는 요구 사항에 대해 확장할 수 있도록 합니다.

4. 유지 보수성(Maintainability): 코드의 가독성과 유지 보수가 쉽도록 만듭니다.

5. 테스트 용이성(Testability): 시스템의 각 구성 요소를 단위 테스트하고 통합 테스트할 수 있도록 합니다.

 

일반적으로 사용되는 몇 가지 중요한 아키텍처 패턴은 다음과 같습니다:

1. MVC (Model-View-Controller): UI, 비즈니스 로직, 데이터 모델을 분리하여 애플리케이션을 구성하는 패턴입니다.

2. MVP (Model-View-Presenter): MVC 패턴의 확장으로, 뷰와 모델 사이에 프리젠터를 추가하여 뷰와 모델의 의존성을 줄입니다.

3. MVVM (Model-View-ViewModel): 뷰와 모델 사이에 뷰 모델을 추가하여 뷰와 비즈니스 로직을 분리하는 패턴입니다.

4. Clean Architecture: 비즈니스 규칙, 사용자 인터페이스, 외부 데이터 소스 등을 격리된 계층으로 나누어 애플리케이션을 설계하는 패턴입니다.

5. Hexagonal Architecture (Ports and Adapters): 애플리케이션의 내부 동작을 사용자 인터페이스 및 외부 시스템에서 분리하는 패턴입니다.

 

이러한 아키텍처 패턴들은 각각의 장단점과 사용 사례에 따라 선택되며, 개발자는 프로젝트의 요구 사항과 특성을 고려하여 적절한 패턴을 선택하고 구현해야 합니다.

 

 

=> 모르는 단어(개념)

(7) MVVM, (8) 비즈니스 규칙

 

 

 

7. "MVVM (Model-View-ViewModel): 뷰와 모델 사이에 뷰 모델을 추가" 이것의 의미는?

더보기

MVVM (Model-View-ViewModel)은 소프트웨어 개발에서 사용되는 디자인 패턴 중 하나로, 뷰(View)와 모델(Model) 사이에 뷰 모델(ViewModel)을 추가하여 뷰와 비즈니스 로직을 분리하는 패턴입니다. 각 구성 요소는 다음과 같이 정의됩니다:

 
1. 모델 (Model):
 
  • 모델은 애플리케이션의 데이터와 비즈니스 로직을 나타냅니다.
  • 데이터베이스에서 가져온 데이터, 외부 서비스로부터 수신한 데이터, 사용자가 입력한 데이터 등을 포함합니다.
  • 모델은 보통 비즈니스 도메인의 객체나 데이터 구조를 표현하고, 데이터의 유효성을 검증하거나 데이터 조작을 담당합니다.

 

2. 뷰 (View):
 
  • 뷰는 사용자 인터페이스(UI)를 나타냅니다.
  • 사용자에게 데이터를 표시하고 사용자의 입력을 받습니다.
  • 안드로이드 앱에서는 레이아웃(XML 파일) 및 액티비티, 프래그먼트 등이 뷰에 해당합니다.

 

3. 뷰 모델 (ViewModel):
 
  • 뷰 모델은 뷰와 모델 사이의 중간 계층으로, 뷰와 모델 간의 통신을 촉진하고 비즈니스 로직을 처리합니다.
  • 뷰 모델은 뷰가 필요로 하는 데이터를 제공하고, 뷰의 상태를 관리합니다.
  • 뷰 모델은 뷰와 독립적으로 테스트할 수 있으며, 보통 안드로이드에서는 LiveDataRxJava와 같은 라이브러리를 사용하여 데이터의 변경을 관찰하고 뷰에 반영합니다.
  • 뷰 모델은 뷰에서 발생한 사용자 입력을 처리하고, 이를 모델에 전달하여 데이터를 업데이트하거나 비즈니스 로직을 수행합니다.
 

MVVM 패턴은 뷰와 모델 간의 강력한 분리를 가능하게 하며, 안드로이드 애플리케이션의 유지보수성과 확장성을 향상시키는 데 도움이 됩니다. 또한, 코드의 재사용성과 테스트 용이성을 높여줍니다.

 

 

=> 모르는 단어(개념)

(7.3) LiveData, (7.4) RxJava

 

7.3 LiveData는 무엇인가?

더보기

LiveData:

 

LiveData는 안드로이드 아키텍처 컴포넌트 라이브러리에서 제공하는 클래스로, 생명주기를 인식하는 관찰 가능한 데이터 홀더입니다. LiveData는 데이터의 변화를 관찰할 수 있으며, 활성 상태의 생명주기를 가진 컴포넌트에 대해서만 업데이트를 통지합니다. 이를 통해 메모리 누수를 방지하고 UI의 일관성을 유지합니다.

 
LiveData의 주요 특징은 다음과 같습니다:
 

1. 생명주기 인식: LiveData는 활성 상태의 생명주기를 가진 컴포넌트에서만 데이터의 변경을 관찰합니다. 활성 상태의 생명주기를 가지지 않은 경우 데이터 변경을 무시합니다.

2. UI 업데이트: LiveData는 UI의 데이터를 관찰하고, 데이터가 변경될 때 UI를 자동으로 업데이트합니다. 이를 통해 UI와 데이터의 일관성을 유지하고, 개발자는 수동으로 UI를 업데이트하는 노력을 줄일 수 있습니다.

3. 메모리 관리: LiveData는 메모리 누수를 방지하기 위해 안드로이드 시스템의 생명주기를 이용하여 자동으로 리소스를 해제합니다.

 

 

핵심:

LiveData = 생명주기 인식하며 데이터 변화 관찰, 업데이트 (라이브러리)

>> LiveData의 모든 것!

 

7.3.1 데이터 홀더란?

더보기

"데이터 홀더(Data Holder)"는 데이터를 저장하고 보유하는 객체를 가리킵니다. 데이터 홀더는 주로 프로그램의 다른 부분에서 사용하기 위해 데이터를 보유하고 유지하는 데 사용됩니다. 이는 데이터를 캡슐화하고 관리하는 방법 중 하나입니다.

 

데이터 홀더의 주요 목적은 데이터를 쉽게 저장하고 검색할 수 있도록 하는 것입니다. 데이터 홀더는 여러 형식의 데이터를 저장할 수 있으며, 데이터베이스, 컬렉션, 변수 등 다양한 형태로 구현될 수 있습니다.

 

안드로이드 애플리케이션에서는 LiveData, ViewModel, SharedPreferences 등이 데이터 홀더로 사용될 수 있습니다. 이러한 데이터 홀더들은 데이터를 관리하고 필요에 따라 다른 컴포넌트에 제공하여 데이터를 공유하거나 활용할 수 있도록 도와줍니다.

 

데이터 홀더의 사용은 데이터 관리의 효율성과 가독성을 높이는 데 도움이 됩니다. 또한 데이터 홀더를 사용함으로써 데이터에 대한 접근과 변경을 추적하고 제어할 수 있으므로 애플리케이션의 유지보수성과 안정성을 향상시킬 수 있습니다.

 

 

핵심: 데이터 홀더  = 데이터 저장 객체 예) DB, 변수 등

 

7.3.2 메모리 누수란?

더보기

메모리 누수(Memory Leak)는 프로그램이 메모리를 사용한 후에도 더 이상 필요하지 않는데도 메모리가 해제되지 않고 유지되는 상황을 말합니다. 다시 말해, 프로그램이 메모리를 할당하고 사용한 후에도 해당 메모리를 해제하지 않고 계속 보유하는 경우에 발생합니다.

 
안드로이드 애플리케이션에서 메모리 누수는 다음과 같은 상황에서 발생할 수 있습니다:
 

1. 객체 참조 유지: 객체 간에 의도치 않은 참조가 유지되는 경우, 해당 객체들은 가비지 컬렉션의 대상이 되지 않고 메모리에 계속 남아 있을 수 있습니다.

2. 비대기 작업 처리: 비동기 작업을 처리할 때 콜백이나 핸들러를 사용하는데, 이를 올바르게 관리하지 않으면 액티비티나 프래그먼트의 생명주기와 관계없이 메모리에 계속 남아 있을 수 있습니다.

3. 컨텍스트 유지: 액티비티나 컨텍스트와 같은 시스템 리소스를 가진 객체를 정적인 객체에 계속 참조하는 경우에도 메모리 누수가 발생할 수 있습니다.

 

메모리 누수가 발생하면 시스템 자원이 비효율적으로 사용되며, 결국 애플리케이션의 성능 저하와 충돌 등의 문제를 유발할 수 있습니다. 이러한 이유로 메모리 관리는 안드로이드 애플리케이션 개발에서 매우 중요한 측면 중 하나입니다. 따라서 개발자는 메모리 누수를 최소화하기 위해 코드를 신중하게 작성하고 메모리 관리에 주의를 기울여야 합니다.

 

 

핵심: 메모리 누수 = 필요하지 않은데 해제 안됨 (메모리)

>> 안드로이드 개발 - 메모리 누수

 

+ 가비지 컬렉션이란?

더보기

가비지 컬렉션(Garbage Collection)은 프로그램 실행 중에 메모리에서 더 이상 사용되지 않는 객체들을 자동으로 탐지하고 해제하는 프로세스를 말합니다. 이 프로세스는 주로 메모리 관리를 위해 사용됩니다.

 
자바와 안드로이드와 같은 많은 프로그래밍 언어 및 플랫폼에서 가비지 컬렉션은 다음과 같은 원리로 작동합니다:
 

1. 객체의 생성: 프로그램이 실행되면 객체들이 메모리에 생성됩니다. 이 객체들은 다양한 연산을 수행하거나 데이터를 보유하는 데 사용됩니다.

2. 객체의 참조: 객체는 다른 객체나 변수에 의해 참조될 수 있습니다. 이러한 참조를 통해 객체에 접근하고 사용할 수 있습니다.

3. 객체의 사용 및 유지: 객체가 더 이상 필요하지 않을 때까지 사용되고 유지됩니다. 객체가 더 이상 참조되지 않으면 해당 객체는 가비지 컬렉션의 대상이 됩니다.

4. 가비지 컬렉션 실행: 가비지 컬렉터는 정기적으로 실행되거나 시스템이 자원이 부족한 경우에 실행되어 더 이상 사용되지 않는 객체를 탐지하고 메모리에서 해제합니다.

5. 메모리 해제: 가비지 컬렉션은 더 이상 참조되지 않는 객체들을 해제하여 메모리를 회수합니다. 이러한 객체들은 자동으로 해제되며, 개발자가 직접적으로 메모리를 해제할 필요가 없습니다.

 

가비지 컬렉션은 프로그래머가 메모리 관리를 직접 처리할 필요를 줄여주고, 메모리 누수와 같은 문제를 방지하는 데 도움이 됩니다. 하지만 가비지 컬렉션은 실행 시간에 오버헤드를 초래할 수 있으며, 잘못된 객체 참조나 메모리 사용 패턴에 따라 성능 문제를 유발할 수도 있습니다. 따라서 가비지 컬렉션을 효율적으로 관리하기 위해서는 객체의 사용 및 참조에 대한 이해가 필요합니다.

 

 

핵심: 가비지 컬렉션 = 사용X 객체 탐지 후 해제 (메모리)

>> 가비지 컬렉션의 개념 및 동작 원리

 

++ 오버헤드란?

더보기

"오버헤드(Overhead)"란 어떤 작업을 수행하기 위해 추가적으로 필요한 리소스나 시간을 의미합니다. 특히 컴퓨터 과학에서는 오버헤드가 프로그램 실행 시에 발생하는 추가적인 부담이나 비용을 가리킵니다.

 
가비지 컬렉션에서 오버헤드는 다음과 같은 상황에서 발생할 수 있습니다:
 

1. 자원 사용: 가비지 컬렉션은 메모리 관리를 위해 CPU 자원을 사용합니다. 이러한 자원 소모는 애플리케이션의 성능에 영향을 줄 수 있습니다.

2. 일시 중지: 일부 가비지 컬렉션 구현은 실행 중인 프로그램을 일시 중지하여 가비지 수집을 수행합니다. 이는 프로그램의 응답성을 감소시킬 수 있습니다.

3. 메모리 스캔: 가비지 컬렉션은 전체 메모리를 스캔하여 더 이상 사용되지 않는 객체를 식별해야 합니다. 이는 메모리의 크기에 따라 오랜 시간이 걸릴 수 있습니다.

4. 자원 재할당: 메모리 해제 후에 메모리를 재할당하는 과정은 추가적인 시간과 자원을 요구할 수 있습니다.
 

따라서 오버헤드가 발생할 경우 프로그램의 성능이 저하되거나 응답성이 떨어질 수 있습니다. 이러한 이유로 가비지 컬렉션 알고리즘은 메모리 사용 패턴을 최적화하고 성능을 향상시키는 데 중요한 역할을 합니다.

 

 

핵심: 오버헤드 = 추가 부담비용 (리소스, 시간)

>> 오버헤드 현상 (overhead)

 

+ 비동기 작업이란?

더보기

비동기 작업(Asynchronous Operation)은 프로그램이 특정 작업을 동기적으로 처리하지 않고, 별도의 스레드이벤트 핸들러를 통해 백그라운드에서 처리하는 것을 말합니다. 즉, 비동기 작업은 작업의 완료를 기다리지 않고 다른 작업을 수행할 수 있도록 합니다.

 
비동기 작업의 주요 특징은 다음과 같습니다:
 

1. 비차단성(Non-blocking): 비동기 작업은 메인 스레드를 차단하지 않고 백그라운드에서 실행됩니다. 따라서 사용자 인터페이스(UI)가 응답성을 유지하고 사용자 경험이 향상됩니다.

2. 병렬성(Concurrency): 비동기 작업은 여러 작업을 동시에 처리할 수 있습니다. 이는 시스템 자원을 효율적으로 활용하여 작업의 처리 속도를 향상시킬 수 있습니다.

3. 콜백(Callback) 기반: 비동기 작업은 주로 콜백 함수이벤트 핸들러를 사용하여 작업이 완료되었을 때 결과를 처리합니다. 이를 통해 비동기 작업의 상태를 추적하고 결과를 적절하게 처리할 수 있습니다.

4. 비동기 API: 많은 프로그래밍 플랫폼과 라이브러리에서는 비동기 작업을 처리하기 위한 API를 제공합니다. 이러한 API를 사용하여 네트워크 요청, 파일 I/O, 데이터베이스 액세스 등과 같은 작업을 비동기적으로 처리할 수 있습니다.

 

비동기 작업은 주로 네트워크 통신, 파일 다운로드, 데이터베이스 액세스와 같은 I/O 작업에서 사용됩니다. 이러한 작업은 일반적으로 시간이 오래 걸리거나 외부 리소스에 의존하기 때문에 메인 스레드에서 동기적으로 처리할 경우 애플리케이션의 응답성이 떨어질 수 있습니다. 따라서 비동기 작업을 사용하여 이러한 작업을 백그라운드에서 처리하는 것이 권장됩니다.

 

 

핵심: 비동기 작업 = 다른 작업과 같이 함

>> 동기, 비동기 처리

 

++ 동기적으로 처리한다는 의미가 무엇인가?

더보기

동기적으로 처리하는 것(Synchronous Operation)은 프로그램이 작업을 순차적으로 처리하고, 각 작업의 완료를 기다려야 다음 작업을 수행하는 것을 말합니다. 즉, 동기적으로 처리되는 작업은 이전 작업이 완료될 때까지 다음 작업을 시작하지 않습니다.

 
동기적 작업의 주요 특징은 다음과 같습니다:
 

1. 차단(Block): 동기적 작업은 각 작업의 완료를 기다리는 동안 프로그램이 차단될 수 있습니다. 이는 다른 작업이 수행되지 않고 대기 상태에 있을 수 있음을 의미합니다.

2. 직렬 처리(Serial Processing): 동기적 작업은 순차적으로 처리되기 때문에 작업이 한 번에 하나씩 실행됩니다. 따라서 병렬성이 부족할 수 있습니다.

3. 간단한 제어 흐름: 동기적 작업은 보통 순차적이고 선형적인 제어 흐름을 가집니다. 이는 코드의 이해와 디버깅을 단순화할 수 있습니다.

 

동기적 작업은 일반적으로 간단한 작업이나 작은 범위의 작업에 적합합니다. 그러나 대부분의 경우, 네트워크 요청, 파일 I/O, 데이터베이스 액세스와 같은 시간이 오래 걸리거나 블록킹되는 작업을 동기적으로 처리하면 전체 애플리케이션의 성능에 부정적인 영향을 미칠 수 있습니다.

 

비동기적 작업을 사용하여 이러한 종류의 작업을 백그라운드에서 처리하고, 메인 스레드를 차단하지 않고 응답성을 향상시킬 수 있습니다.

 

 

핵심: 동기적 작업 = 순차처리

 

+++ 파일 I/O 란?

더보기

"파일 I/O"는 "파일 입출력(File Input/Output)"의 줄임말로, 컴퓨터 시스템에서 파일과 관련된 데이터를 읽고 쓰는 작업을 가리킵니다. 파일 I/O는 주로 파일 시스템과 상호 작용하여 데이터를 저장하고 검색하거나 다른 프로그램과 데이터를 교환하는 데 사용됩니다.

 
파일 I/O 작업은 다음과 같은 기본적인 작업을 포함할 수 있습니다:
 

1. 파일 읽기(Read): 파일 시스템에서 데이터를 읽어와 프로그램으로 가져오는 작업을 의미합니다. 예를 들어, 텍스트 파일이나 바이너리 파일에서 데이터를 읽어와 메모리로 로드할 수 있습니다.

2. 파일 쓰기(Write): 프로그램에서 생성된 데이터를 파일에 쓰는 작업을 의미합니다. 이는 새 파일을 생성하거나 기존 파일에 데이터를 추가할 수 있습니다.

3. 파일 I/O 작업은 다양한 프로그래밍 언어와 플랫폼에서 지원됩니다. 프로그래밍 언어에서는 파일을 열고 닫는 함수, 데이터를 읽고 쓰는 함수, 파일 포인터를 조작하는 함수 등의 다양한 API를 제공하여 파일 I/O 작업을 수행할 수 있습니다.

 

파일 I/O는 데이터를 영구적으로 저장하고 필요할 때 검색하거나 처리하기 위해 매우 중요한 기능입니다. 파일 I/O를 사용하여 텍스트 파일, 설정 파일, 로그 파일, 이미지 파일 등 다양한 종류의 데이터를 다룰 수 있습니다.

 

 

핵심: 파일 I(인풋)/O(아웃풋)

>> [운영체제] File I/O

 

++++ API 란?

더보기

API는 "Application Programming Interface"의 약자로, 프로그램 간의 상호 작용을 위한 인터페이스를 의미합니다. 간단히 말해, API는 소프트웨어 구성 요소 간의 통신 규약이나 메커니즘을 제공하는 방법입니다.

 
API는 다음과 같은 목적으로 사용됩니다:
 

1. 기능 제공: API는 다른 프로그램이나 시스템에서 제공되는 기능에 접근할 수 있도록 합니다. 이를 통해 다양한 소프트웨어나 서비스에서 제공되는 기능을 활용할 수 있습니다.

2. 추상화: API는 하위 시스템의 복잡성을 추상화하여 개발자가 더 쉽게 상호 작용할 수 있도록 합니다. 이는 복잡한 작업을 단순한 인터페이스로 노출함으로써 개발 과정을 간소화하고 코드의 가독성을 높일 수 있습니다.

3. 표준화: API는 개발자들이 일관된 방식으로 서로 상호 작용할 수 있도록 표준화된 규칙과 형식을 제공합니다. 이는 서로 다른 시스템이나 언어 간의 통신을 원활하게 만듭니다.

4. 상호 운용성: API는 다른 시스템이나 플랫폼 간의 상호 운용성을 제공합니다. 이는 다른 기술 스택을 사용하는 시스템 간의 통합을 용이하게 만들어 줍니다.

 

API는 다양한 형태로 제공될 수 있습니다. 웹 API는 웹 서비스를 통해 데이터나 기능을 제공하며, 라이브러리 API는 소프트웨어 라이브러리에서 제공되는 함수나 클래스를 사용할 수 있도록 합니다. 운영체제 API는 운영체제의 기능에 접근할 수 있는 인터페이스를 제공하며, 프로그래밍 언어의 API는 해당 언어에서 제공하는 함수나 클래스 등을 의미합니다.

 

API는 소프트웨어 개발에서 중요한 개념으로, 다른 시스템과의 통합, 외부 서비스의 활용, 개발 생산성의 향상 등에 큰 역할을 합니다.

 

 

핵심: API = (프로그램 간) 기능 제공 (통신 규약, 메커니즘)

>> 봐도봐도 모르겠는 API 개념 설명

 

+++ 블로킹 되는 작업이란?

더보기

블로킹되는 작업은 프로그램의 실행이 해당 작업이 완료될 때까지 멈추는 것을 의미합니다. 다시 말해, 블로킹 작업은 다음 작업이 실행되거나 진행될 수 없는 상태로 만듭니다.

 

일반적으로 입출력 작업(IO operations)은 블로킹 작업으로 간주됩니다. 예를 들어, 파일을 읽거나 쓰는 작업, 네트워크로 데이터를 전송하거나 수신하는 작업은 시간이 소요되며 완료될 때까지 프로그램이 멈추는 것이 일반적입니다.

 
블로킹 작업의 주요 특징은 다음과 같습니다:
 

1. 대기 상태: 블로킹 작업은 완료될 때까지 기다리는 동안 프로그램이 대기 상태에 있습니다.

2. 프로그램 멈춤: 블로킹 작업이 실행 중인 동안 프로그램의 실행이 일시 중지됩니다. 이는 다른 작업이나 코드의 실행을 막을 수 있습니다.

3. 응답성 저하: 블로킹 작업이 긴 시간 동안 실행될 경우, 프로그램의 응답성이 저하될 수 있습니다. 사용자 인터페이스(UI)의 응답이 느려지거나 프로그램이 더 이상 응답하지 않는 상태가 될 수 있습니다.

 

블로킹 작업은 프로그램의 특정 부분에서 처리할 수 있지만, 이를 피하기 위해 비동기적인 접근 방식이 사용될 수 있습니다. 비동기적인 방식을 사용하면 작업이 백그라운드에서 수행되며, 프로그램은 블로킹되지 않고 계속 실행될 수 있습니다. 이를 통해 프로그램의 응답성이 향상되고 효율성이 증가할 수 있습니다.

 

 

핵심: 블로킹(멈춤) 되는 작업  = 완료될 때까지 멈춤

>> 블로킹 Vs. 논블로킹, 동기 Vs. 비동기

 

++++ 백그라운드란?

더보기

"백그라운드(Background)"는 컴퓨터 과학에서 실행 중인 프로그램이나 프로세스의 주요 활동이나 작업이 아닌 것을 가리킵니다. 보다 구체적으로 말하자면, 백그라운드에서 실행되는 작업은 사용자의 주요 관심이나 직접적인 상호 작용 없이 실행되거나 진행됩니다.

 
일반적으로 컴퓨터에서 백그라운드는 다음과 같은 상황에서 사용됩니다:
 

1. 백그라운드 프로세스: 사용자가 직접적으로 보이지 않는 프로세스나 애플리케이션의 일부가 백그라운드에서 실행될 수 있습니다. 예를 들어, 운영 체제나 시스템 서비스가 백그라운드에서 동작하는 것을 볼 수 있습니다.

2. 백그라운드 작업: 사용자가 주목하거나 직접적으로 상호 작용하지 않는 작업은 백그라운드에서 실행될 수 있습니다. 예를 들어, 파일 다운로드, 데이터 처리, 업데이트 검사 등의 작업이 백그라운드에서 수행될 수 있습니다.

3. 백그라운드 프로그래밍: 프로그래밍에서 백그라운드는 주로 동시성과 관련이 있습니다. 백그라운드에서 실행되는 스레드나 작업은 주 스레드나 메인 프로세스와 별도로 실행되며, 주로 비동기적인 작업을 처리합니다.

 

백그라운드에서 실행되는 작업은 보통 사용자에게 직접적으로 보이지 않지만, 전반적인 시스템의 성능과 사용자 경험에 영향을 미칠 수 있습니다. 특히 백그라운드 작업이 메인 프로세스나 사용자 인터페이스(UI)에 영향을 미치지 않도록 주의해야 합니다.

 
 

핵심: 백그라운드 = 사용자 뒷단에서 실행되는 작업

>> 안드로이드 백그라운드에 대해서

 

+++++ 스레드란?

더보기

스레드(Thread)는 프로그램 내에서 실행되는 가장 작은 실행 단위입니다. 각각의 스레드는 프로세스 내에서 독립적으로 실행되며, 여러 스레드가 동시에 실행될 수 있습니다.

 
스레드는 다음과 같은 특징을 갖습니다:
 

1. 경량화된 프로세스: 스레드는 프로세스 내에서 메모리를 공유하면서 실행됩니다. 프로세스는 최소한 하나의 스레드를 가지고 있으며, 추가적인 스레드를 생성하여 여러 작업을 동시에 처리할 수 있습니다.

2. 동시성(Concurrency): 여러 스레드가 동시에 실행될 수 있습니다. 이는 멀티태스킹이나 동시성 작업을 가능하게 합니다. 각각의 스레드는 독립적으로 실행되므로, 하나의 스레드가 작업을 수행하는 동안 다른 스레드는 다른 작업을 처리할 수 있습니다.

3. 공유 자원 접근: 스레드는 동일한 프로세스 내에서 메모리를 공유하므로, 이로부터 발생하는 동시성 문제를 해결하기 위해 적절한 동기화 메커니즘이 필요합니다. 공유 자원에 대한 동시 접근이나 변경은 스레드 간의 충돌을 일으킬 수 있으므로 주의가 필요합니다.

4. 다중 코어 활용: 다중 코어 프로세서 시스템에서는 여러 스레드가 동시에 실행될 때 여러 코어가 사용되어 병렬로 작업을 처리할 수 있습니다.

 

스레드는 프로그램 내에서 병렬성을 활용하고 작업을 분산하여 처리하는 데 중요한 역할을 합니다. 그러나 스레드를 관리하고 동기화하는 것은 복잡한 작업일 수 있으며, 잘못된 사용은 경합 조건(Race Condition)이나 데드락(Deadlock)과 같은 문제를 초래할 수 있습니다. 따라서 스레드를 안전하게 사용하기 위해서는 적절한 동기화와 관리가 필요합니다.

 

 

핵심: 스레드 = 가장 작은 실행단위 (프로그램에서)

>> 스레드란?

 

+++++ 주 스레드와 메인 프로세스의 뜻이 무엇인가?

더보기

"주 스레드(Main Thread)"와 "메인 프로세스(Main Process)"는 다른 개념입니다.

 
  • 주 스레드(Main Thread): 프로그램이 시작되면 주 스레드가 생성됩니다. 이는 프로그램의 시작점이 되는 스레드로, 모든 코드 실행과 사용자 인터페이스(UI) 조작은 주로 주 스레드에서 이루어집니다. 안드로이드 앱에서 UI 작업은 주로 주 스레드에서 처리됩니다. 주 스레드는 앱의 생명주기와 함께 시작되고 종료됩니다.
  • 메인 프로세스(Main Process): 앱이 시작될 때 시스템은 앱의 메인 프로세스를 시작합니다. 메인 프로세스는 앱의 기본 실행 단위이며, 앱의 모든 구성 요소(액티비티, 서비스, 브로드캐스트 리시버, 콘텐트 프로바이더)는 이 프로세스 내에서 실행됩니다. 따라서 메인 프로세스는 앱의 모든 구성 요소의 부모가 됩니다.
 

주 스레드와 메인 프로세스는 앱의 실행에 있어서 중요한 역할을 합니다. 주 스레드는 앱의 로직을 실행하고 UI를 업데이트하는 역할을 담당하며, 메인 프로세스는 앱의 전반적인 실행을 관리하고 앱의 모든 구성 요소를 호스팅합니다.

 

 

핵심:

주 스레드 = 로직, UI 처리 스레드

메인 프로세스 = 모든 구성요소 총괄

 

++++++ 호스팅이란?

더보기

"호스팅한다"는 특정한 것을 제공하거나 운영하는 것을 의미합니다. 일반적으로 컴퓨터 과학에서는 호스팅이 다음과 같은 의미를 갖습니다:

 

1. 서비스 제공: 호스팅은 서비스를 제공하고 그 서비스를 이용할 수 있는 환경을 제공하는 것을 의미합니다. 예를 들어, 웹 호스팅 서비스는 웹 사이트의 파일과 데이터를 저장하고 인터넷을 통해 이를 공개합니다.

2. 운영 환경 제공: 호스팅은 특정한 애플리케이션이나 서비스가 실행될 수 있는 환경을 제공합니다. 이 환경은 필요한 모든 리소스와 설정을 포함하고 있어야 합니다.

3. 컴퓨터 자원 할당: 호스팅은 특정한 서버 또는 컴퓨터 자원을 할당하는 것을 의미합니다. 이는 서버 공간, 대역폭, 프로세서 속도, 메모리 등을 포함합니다.

 

예를 들어, 웹 호스팅 서비스는 웹 사이트를 인터넷 상에 호스팅하여 사용자가 해당 사이트에 접근할 수 있도록 합니다. 이 경우, 호스팅 서비스 제공업체는 웹 서버를 운영하고 웹 사이트 파일을 저장하는 서버 공간을 제공합니다. 사용자는 이 서비스를 이용하여 자신의 웹 사이트를 인터넷에 공개할 수 있습니다.

 

앱의 메인 프로세스를 "호스팅한다"는 것은 앱의 모든 구성 요소(액티비티, 서비스, 브로드캐스트 리시버, 콘텐트 프로바이더)가 메인 프로세스 내에서 실행되고 관리된다는 것을 의미합니다. 메인 프로세스는 이러한 구성 요소들을 실행할 수 있는 환경을 제공하고, 앱의 전체적인 실행을 책임집니다.

 

 

핵심: 호스팅 = 환경 제공, 운영

(웹 -> 서버공간 제공. 앱 -> 구성요소 관리운영.)

>> 앱 호스팅을 아십니까?

 

++ 이벤트 핸들러란?

더보기

이벤트 핸들러(Event Handler)는 이벤트가 발생했을 때 해당 이벤트를 감지하고 처리하는 코드를 말합니다. 일반적으로 사용자가 애플리케이션의 인터페이스를 조작하거나 시스템에서 발생하는 이벤트를 처리하는 데 사용됩니다.

 
주요 특징은 다음과 같습니다:
 

1. 이벤트 감지: 이벤트 핸들러는 특정 이벤트가 발생했을 때 이를 감지합니다. 예를 들어, 사용자가 버튼을 클릭하거나 키를 누를 때 발생하는 이벤트를 감지할 수 있습니다.

2. 이벤트 처리: 이벤트 핸들러는 이벤트가 발생했을 때 해당 이벤트를 처리하는 코드를 포함합니다. 이벤트 처리는 다양한 작업을 수행할 수 있습니다. 예를 들어, 버튼 클릭 이벤트 핸들러는 버튼이 클릭되었을 때 특정 작업을 수행할 수 있습니다.

3. 이벤트 핸들링 등록: 이벤트 핸들러는 보통 이벤트가 발생할 때 실행되어야 하는 코드를 등록하는 방식으로 사용됩니다. 이를 통해 애플리케이션은 사용자의 상호 작용이나 시스템의 상태 변화 등을 감지하고 적절히 처리할 수 있습니다.

4. 이벤트 처리 순서: 일반적으로 이벤트 핸들러는 이벤트가 발생한 순서대로 처리됩니다. 이는 이벤트가 처리되는 순서를 제어하고 다양한 동작을 수행할 수 있도록 합니다.

 

예를 들어, 웹 애플리케이션에서는 JavaScript를 사용하여 이벤트 핸들러를 정의하고 웹 페이지의 요소에 이벤트를 연결합니다. 이를 통해 사용자의 클릭, 입력, 드래그 등의 동작에 대한 반응을 구현할 수 있습니다.

 

안드로이드 앱에서는 사용자 인터페이스 요소에 이벤트 핸들러를 등록하여 사용자의 상호 작용에 대응하고, 시스템 이벤트에 대한 처리를 수행합니다. 이를 통해 앱은 사용자와 상호 작용하고 사용자 경험을 향상시킬 수 있습니다.

 
 

핵심: 이벤트 핸들러 = 이벤트 발생 감지 -> 처리 코드

>> 이벤트 핸들러(Event Handler)

 

++ 콜백 함수란?

더보기

비동기 작업에서 콜백 함수(callback function)는 주로 비동기 작업의 완료나 이벤트 발생을 처리하기 위해 사용됩니다. 즉, 콜백 함수는 다른 함수의 인자로 전달되어 나중에 호출되는 함수입니다.

 

비동기 작업에서는 주로 비동기적으로 처리되는 작업이 완료되었을 때 실행되어야 하는 코드를 콜백 함수로 전달합니다. 예를 들어, 파일을 읽는 작업을 비동기적으로 처리할 때, 파일을 읽은 후에 실행될 콜백 함수를 전달할 수 있습니다. 이 콜백 함수는 파일을 읽는 작업이 완료되면 호출되어 특정한 작업을 수행합니다.

 

 

핵심: 콜백 함수 = 이밴트 발생시 호출되는 함수

>> Android CallBack

 

++ I/O 작업이란?

더보기

I/O 작업은 Input/Output 작업을 의미합니다. 이는 프로그램이 외부 자원과 상호 작용하기 위해 데이터를 읽거나 쓰는 작업을 포함합니다. 주로 파일 시스템, 네트워크, 데이터베이스 등과의 상호 작용에 사용됩니다.

 

예를 들어, 파일을 읽고 쓰는 작업, 네트워크를 통한 데이터 전송, 데이터베이스에서 데이터를 읽고 쓰는 작업 등이 모두 I/O 작업에 해당합니다.

 

I/O 작업은 일반적으로 시간이 오래 걸리는 작업이며, 이러한 작업을 처리하는 동안 프로그램은 대기 상태에 있을 수 있습니다. 이러한 이유로 일부 프로그래밍 환경에서는 비동기적인 방식으로 I/O 작업을 처리하여 시스템 자원을 효율적으로 활용하고 응답성을 향상시킵니다.

 

 

핵심: I(인풋)/O(아웃풋) 작업. 예) 파일 읽고쓰기, 데이터 읽고 쓰기(네트워크, DB)

>> I/O는 어떻게 처리될까?

 

+ 콜백과 핸들러란?

더보기

콜백(callback)과 핸들러(handler)는 프로그래밍에서 자주 사용되는 개념입니다.

 

1. 콜백(callback):

콜백은 어떤 이벤트가 발생했을 때 호출되는 함수 또는 메서드를 말합니다. 일반적으로 비동기적인 작업에서 사용됩니다. 예를 들어, 파일 다운로드가 완료되면 다운로드 완료를 처리하기 위해 특정한 콜백 함수를 호출할 수 있습니다. 콜백은 주로 이벤트 처리나 상태 변화를 감지하고 처리하는 데 사용됩니다.

2. 핸들러(handler):

핸들러는 주로 스레드간 통신을 위해 사용됩니다. 안드로이드에서는 핸들러를 사용하여 백그라운드 스레드에서 메인(UI) 스레드로 메시지를 전달하거나 작업을 예약할 수 있습니다. 핸들러는 안드로이드에서 비동기적인 작업을 수행하고 그 결과를 메인 스레드에서 처리하는 데 자주 활용됩니다. 핸들러는 또한 일정 시간이 지난 후에 작업을 수행하거나 주기적으로 작업을 실행하는 데 사용될 수도 있습니다.

 

요약하면, 콜백은 이벤트 처리나 상태 변화를 감지하고 처리하는 데 사용되는 함수 또는 메서드를 의미하며, 핸들러는 스레드 간 통신이나 비동기적인 작업을 처리하기 위한 메커니즘을 제공합니다.

 

 

핵심:

콜백 = 이벤트 발생시 호출 (함수, 메서드)

핸들러 = 스레드간 통신 (백그라운드 스레드 <-> 메인 스레드)

>> Callback

>> Handler

 

+ 컨텍스트란?

더보기

컨텍스트(Context)는 프로그램이 실행되는 환경을 나타내는 추상적인 개념입니다. 안드로이드에서 컨텍스트는 애플리케이션의 현재 상태와 환경에 대한 정보를 제공하며, 애플리케이션의 리소스에 접근할 수 있는 인터페이스를 제공합니다.

 
안드로이드에서는 다양한 컨텍스트가 있으며, 주요한 것으로는 다음과 같습니다:
 

1. 애플리케이션 컨텍스트(Application Context): 애플리케이션의 전역 컨텍스트를 나타냅니다. 애플리케이션의 생명주기와 함께 유지되며, 애플리케이션 전역에서 사용할 수 있는 리소스에 접근할 수 있습니다.

2. 액티비티 컨텍스트(Activity Context): 액티비티의 컨텍스트를 나타냅니다. 액티비티가 실행되는 동안에만 유효하며, 액티비티에 관련된 리소스에 접근할 수 있습니다.

3. 서비스 컨텍스트(Service Context): 백그라운드에서 실행되는 서비스의 컨텍스트를 나타냅니다. 서비스가 실행되는 동안에만 유효하며, 서비스에 관련된 리소스에 접근할 수 있습니다.

 

컨텍스트는 안드로이드 애플리케이션에서 매우 중요한 개념으로, 리소스 접근, 시스템 서비스 호출, 액티비티 및 서비스 시작 등 다양한 작업에 사용됩니다. 컨텍스트를 올바르게 이해하고 활용하는 것은 안드로이드 애플리케이션 개발에서 핵심적인 부분 중 하나입니다.

 

 

핵심: 컨텍스트 = 리소스(정보) 접근 제공 (안드로이드)

>> 컨텍스트(context)란 무엇인가?

 

+ "액티비티나 컨텍스트와 같은 시스템 리소스를 가진 객체를 정적인 객체에 계속 참조시 메모리 누수가 발생할 수 있다"라는 문장의 의미는?

더보기

이 문장은 객체 간에 참조가 유지되는 경우 메모리 누수가 발생할 수 있다는 것을 강조하고 있습니다. 안드로이드에서는 액티비티나 컨텍스트와 같은 시스템 리소스를 가진 객체를 정적인 객체에 계속 참조하는 경우에도 메모리 누수가 발생할 수 있습니다.

 

예를 들어, 액티비티에서 사용하는 컨텍스트 객체를 정적인 변수에 저장하고 계속 참조하는 경우를 생각해보겠습니다. 이 경우에는 액티비티가 파괴되더라도 해당 컨텍스트 객체는 계속 메모리에 유지될 것입니다. 이는 필요 이상으로 메모리를 차지하게 되어 시스템 리소스의 낭비로 이어질 수 있습니다.

 

또한, 정적인 컬렉션에 액티비티나 컨텍스트와 같은 시스템 리소스를 가진 객체를 계속해서 추가하는 경우에도 마찬가지로 메모리 누수가 발생할 수 있습니다. 이러한 상황에서는 해당 객체가 더 이상 필요하지 않더라도 컬렉션에 계속해서 유지되어 메모리 누수가 발생할 수 있습니다.

 

따라서, 개발자는 시스템 리소스를 가진 객체를 정적인 객체에 계속 참조하는 경우를 피하고, 객체의 생명주기를 주의깊게 관리하여 메모리 누수를 방지해야 합니다. 이를 위해 액티비티의 생명주기나 컨텍스트의 범위를 고려하여 객체를 참조하는 방식을 결정해야 합니다.

 

 

핵심: 정적객체(정적 변수, 컬렉션)가 계속 메모리에 남아 누수가 됨.

>> static 메모리의 생명주기

 

++ 정적인 변수와 정적인 컬렉션이란?

더보기

정적인 변수(Static Variable):

 

정적인 변수는 클래스에 속하며, 클래스의 인스턴스와 관계없이 클래스에 한 번만 할당되고 모든 인스턴스에서 공유됩니다. 이러한 변수는 클래스가 로드될 때 초기화되며 프로그램이 실행되는 동안 메모리에 유지됩니다. 정적 변수는 일반적으로 클래스의 모든 인스턴스가 공유해야 하는 값을 저장하는 데 사용됩니다.

 
정적인 컬렉션(Static Collection):
 

정적인 컬렉션은 정적인 변수로 선언된 컬렉션입니다. 즉, 클래스의 모든 인스턴스가 공유하는 컬렉션입니다. 이러한 컬렉션은 여러 인스턴스에서 공통으로 사용되는 데이터를 저장하고 관리하는 데 사용됩니다.

 

정적 변수와 정적 컬렉션은 객체의 인스턴스화 없이 클래스 수준에서 사용되며, 클래스의 모든 인스턴스에서 공유됩니다. 이러한 기능을 활용하여 공통 데이터를 저장하고 관리할 수 있습니다. 하지만 정적 변수와 정적 컬렉션을 사용할 때는 주의하여야 하며, 필요 이상으로 메모리를 소비하거나 예기치 않은 동작을 유발할 수 있으므로 신중하게 사용해야 합니다.

 

 

핵심: 정적변수, 정적 컬렉션은 클래스에 속함. 모든 인스턴스의 공유값.

 

+++ 컬렉션이란?

더보기

컬렉션(Collection)은 프로그래밍에서 데이터를 그룹화하고 관리하는 자료 구조를 의미합니다. 컬렉션은 여러 개의 원소나 객체를 담을 수 있는 컨테이너 역할을 합니다. 주로 배열과 비슷하지만, 배열과는 달리 크기를 동적으로 조절할 수 있으며, 다양한 기능과 메서드를 제공하여 데이터를 효과적으로 관리할 수 있습니다.

 

자바에서는 다양한 종류의 컬렉션 프레임워크를 제공하고 있으며, 그 중에는 리스트(List), 세트(Set), 큐(Queue), 맵(Map) 등이 있습니다. 이러한 컬렉션은 데이터를 다양한 방식으로 저장하고 접근할 수 있도록 해줍니다.

 

정적인 컬렉션(Static Collection)은 정적인 변수(static variable)로 선언된 컬렉션을 의미합니다. 즉, 해당 컬렉션은 클래스 수준에서 생성되며 클래스의 모든 인스턴스에서 공유됩니다. 따라서 정적 컬렉션은 한 번 생성되면 프로그램이 실행되는 동안 메모리에 유지되며, 클래스의 모든 인스턴스가 공통적으로 접근할 수 있는 데이터를 저장하는 데 사용됩니다.

 

정적인 컬렉션은 다수의 객체를 효율적으로 관리하고, 다양한 객체를 공유하는 데 유용합니다. 하지만 정적인 컬렉션을 사용할 때에는 메모리 사용량과 데이터 일관성을 고려하여 신중하게 사용해야 합니다.

 

 

핵심: 컬렉션 = 데이터 그룹. 예) 리스트, 세트, 큐, 맵 (자바)

>> 컬렉션이란?

 

+++ 정적 변수와 정적 컬렉션이 필요 이상으로 메모리를 소비한다는 것의 의미는?

더보기

정적 변수와 정적 컬렉션이 메모리를 필요 이상으로 소비할 수 있는 주요 이유는 다음과 같습니다:

 

1. 수명 관리의 어려움: 정적 변수와 정적 컬렉션은 프로그램이 실행되는 동안 계속해서 메모리에 남아 있습니다. 이는 객체의 수명을 개발자가 직접 관리할 수 없으며, 정적 변수 및 컬렉션을 사용하는 클래스가 어떤 시점에서도 메모리를 해제할 수 없다는 것을 의미합니다.

2. 공유된 상태 유지: 정적 변수 및 컬렉션은 클래스의 모든 인스턴스에서 공유됩니다. 따라서 이러한 변수 및 컬렉션에 저장된 데이터는 모든 인스턴스에서 접근 가능하며, 객체의 수명이 끝나더라도 메모리에서 해제되지 않습니다. 이는 프로그램이 실행되는 동안 메모리를 계속해서 차지하게 됩니다.

3. 메모리 누수 가능성: 정적 변수 및 컬렉션을 잘못 사용하면 메모리 누수가 발생할 수 있습니다. 예를 들어, 정적 컬렉션에 객체를 추가한 후에도 해당 객체의 참조가 삭제되지 않으면, 해당 객체는 메모리에서 해제되지 않고 유지됩니다. 이러한 상황이 반복되면, 메모리 누수가 발생할 수 있습니다.

4. 의도하지 않은 데이터 보존: 정적 변수 및 컬렉션은 프로그램의 실행 동안 데이터를 계속해서 보존합니다. 이는 의도치 않게 데이터가 변경되거나 오염될 수 있는 위험을 갖고 있습니다. 특히 다중 스레드 환경에서는 정적 변수 및 컬렉션의 동시 접근으로 인해 데이터 일관성 문제가 발생할 수 있습니다.

 

따라서, 정적 변수와 정적 컬렉션을 사용할 때는 신중하게 고려해야 하며, 메모리 누수를 방지하고 데이터의 안정성을 보장하기 위해 적절한 수명 주기 관리 및 데이터 관리가 필요합니다.

 

 

핵심: 정적 변수, 컬렉션은 모든 인스턴스에서 공유되어서 계속 메모리에 남아있다.

>> Static이란? 정적 변수 정적 메소드에 관하여

 

 

 

7.4 RxJava는 무엇인가?

더보기

RxJava:

 

RxJava는 리액티브 프로그래밍을 구현하는 데 사용되는 자바 라이브러리입니다. 리액티브 프로그래밍은 데이터 스트림과 변환 작업을 중심으로 하는 비동기 및 이벤트 기반 프로그래밍 패러다임입니다.

 
RxJava의 주요 특징은 다음과 같습니다:
 

1. Observable 및 Observer 패턴: RxJava는 Observable과 Observer 패턴을 기반으로 합니다. 데이터 스트림을 생성하고 이를 관찰하는 Observer를 정의하여 비동기적으로 데이터를 처리할 수 있습니다.

2. 연산자: RxJava는 다양한 연산자를 제공하여 데이터 스트림을 변환하고 조작할 수 있습니다. 이를 통해 데이터를 필터링하거나 변환하는 등의 작업을 수행할 수 있습니다.

3. 스케줄러: RxJava는 스케줄러를 통해 다양한 스레드에서 작업을 실행할 수 있습니다. 이를 통해 UI 업데이트와 네트워크 호출과 같은 비동기 작업을 효율적으로 처리할 수 있습니다.

 

LiveData와 RxJava는 모두 안드로이드 애플리케이션에서 비동기적인 데이터 처리와 UI 업데이트를 위해 사용되는 강력한 도구입니다. 개발자는 상황에 따라 적절한 라이브러리를 선택하여 안정적이고 효율적인 애플리케이션을 개발할 수 있습니다.

 

 

핵심: RxJava = 리액티브 프로그래밍 구현시 사용 라이브러리 (자바)

>> RxJava 개념 정리 및 학습

 

7.4.1 리액티브 프로그래밍이란 무엇인가?

더보기

리액티브 프로그래밍은 데이터 스트림과 변환 작업을 중심으로 하는 프로그래밍 패러다임입니다. 이 패러다임은 데이터의 흐름과 상태 변화에 초점을 맞추며, 이벤트에 반응하여 데이터를 처리하고 조작합니다. 주요 특징은 다음과 같습니다:

 

1. 비동기성(Asynchrony): 리액티브 프로그래밍은 비동기적인 작업을 지원합니다. 이벤트에 반응하여 데이터를 처리하므로, 작업이 완료될 때까지 기다리지 않고도 다음 작업을 계속할 수 있습니다.

2. 이벤트 기반(Event-driven): 리액티브 프로그래밍은 주로 이벤트에 반응하여 동작합니다. 데이터의 상태 변화나 외부 이벤트에 따라 작업을 수행합니다.

3. 데이터 스트림(Data Streams): 리액티브 프로그래밍은 데이터를 스트림으로 처리합니다. 이러한 데이터 스트림은 연속적인 데이터의 흐름을 나타내며, 이에 대해 변환, 필터링, 조합 등의 작업을 수행할 수 있습니다.

4. 확장성(Scalability): 리액티브 프로그래밍은 대규모 시스템에서도 잘 동작하며, 다양한 환경에서 확장 가능합니다. 이는 시스템의 부하에 따라 자원을 효율적으로 관리하고, 반응성을 유지할 수 있음을 의미합니다.

5. 간결성과 가독성: 리액티브 프로그래밍은 함수형 프로그래밍의 원칙을 따르며, 코드의 간결성과 가독성을 높일 수 있습니다. 이는 복잡한 비동기 코드를 간소화하고 관리하기 쉽게 만듭니다.

 

리액티브 프로그래밍은 데이터의 흐름과 변화에 집중하여 보다 효율적이고 반응성 있는 애플리케이션을 개발할 수 있도록 도와줍니다. 이러한 패러다임을 구현하는 데에는 RxJava, Reactor, Akka 등의 라이브러리와 프레임워크가 사용됩니다.

 

 

핵심: 리액티브(반응) 프로그래밍 = 이벤트 반응하여 데이터 처리 (데이터 스트림)

>> 리액티브 프로그래밍에 대해서

 

+ 데이터 스트림이란?

더보기

데이터 스트림(Data Stream)은 일련의 데이터 요소가 순차적으로 발생하고 흐르는 데이터의 흐름을 나타냅니다. 데이터 스트림은 이벤트 스트림(Event Stream)이라고도 불립니다.

 

데이터 스트림은 시간에 따라 연속적으로 발생하는 이벤트나 데이터의 흐름을 의미합니다. 예를 들어, 센서에서 주기적으로 생성되는 데이터, 사용자의 입력 이벤트, 네트워크에서 수신되는 데이터 패킷 등이 데이터 스트림의 예시입니다.

 

데이터 스트림은 비동기적인 환경에서 주로 사용되며, 이벤트 기반 시스템에서 중요한 개념입니다. 리액티브 프로그래밍에서는 데이터 스트림을 처리하고 조작하여 비동기적인 작업을 수행합니다.

 

리액티브 프로그래밍에서는 데이터 스트림을 처리하기 위해 연산을 적용하고 데이터를 필터링하거나 변환하는 등의 작업을 수행합니다. 이를 통해 데이터 스트림의 흐름을 제어하고 원하는 방식으로 처리할 수 있습니다.

 

데이터 스트림은 다양한 형태와 소스에서 생성될 수 있으며, 이를 효과적으로 처리하고 활용하기 위해 다양한 라이브러리와 프레임워크가 개발되어 있습니다. 예를 들어, RxJava, Reactor, Akka 등의 라이브러리는 데이터 스트림을 다루는데 유용하게 활용됩니다.

 

 

핵심: 데이터 스트림 = 데이터의 흐름. 예) 네트워크 데이터 패킷, 센서 주기적 데이터

>> 데이터 스트림

 

+ 프로그램의 패러다임이란?

더보기

프로그래밍 패러다임은 프로그램을 작성하고 구성하는 데 사용되는 기본적인 개념과 접근 방식을 나타냅니다. 각 프로그래밍 패러다임은 특정한 스타일과 철학에 따라 프로그램을 작성하고 문제를 해결합니다. 주요 프로그래밍 패러다임은 다음과 같습니다:

 

1. 명령형 프로그래밍(Imperative Programming): 명령형 프로그래밍은 컴퓨터가 수행해야 하는 일련의 명령문을 기술하는 방식입니다. 프로그래머는 명령문의 순서와 상태 변화를 명시적으로 지정합니다. 대표적인 예로는 C, C++, Java 등이 있습니다.

2. 선언형 프로그래밍(Declarative Programming): 선언형 프로그래밍은 명령문의 실행 순서나 상태 변화보다는 원하는 결과를 명시하는 방식입니다. 프로그래머는 문제의 해결 방법을 명시하고, 시스템이 문제를 해결하는 방법을 결정합니다. 함수형 프로그래밍과 논리형 프로그래밍이 이에 해당합니다.

3. 함수형 프로그래밍(Functional Programming): 함수형 프로그래밍은 함수의 조합을 통해 문제를 해결하는 프로그래밍 패러다임입니다. 상태 변경을 피하고 불변성을 유지하여 부작용(side effect)을 최소화하며, 함수를 일급 객체로 다룹니다. Haskell, Scala, Clojure 등이 대표적인 함수형 프로그래밍 언어입니다.

4. 객체지향 프로그래밍(Object-Oriented Programming, OOP): 객체지향 프로그래밍은 객체를 기본 구성 요소로 삼고, 객체 간의 상호 작용을 통해 프로그램을 구성합니다. 클래스와 객체를 사용하여 상태와 동작을 캡슐화하고, 상속, 다형성, 캡슐화 등의 개념을 활용합니다. Java, C++, Python 등이 객체지향 프로그래밍 언어입니다.

5. 리액티브 프로그래밍(Reactive Programming): 리액티브 프로그래밍은 데이터 스트림과 변환 작업을 중심으로 하는 프로그래밍 패러다임입니다. 데이터의 흐름과 상태 변화에 초점을 맞추며, 이벤트에 반응하여 데이터를 처리하고 조작합니다. 주로 비동기적인 환경에서 사용됩니다.

 

각 프로그래밍 패러다임은 특정한 상황이나 문제에 대해 적합한 해결책을 제공하며, 프로그래머는 이러한 패러다임을 조합하여 프로그램을 작성하고 설계합니다.

 

 

핵심: 프로그램 패러다임 = 프로그래밍 작성 기본개념. 예) 절차적, 함수형, 객체지향, 리액티브

>> 좀 더 나은 프로그램을 위해, 프로그래밍 패러다임

 

+ 리액티브 프로그래밍이 함수형 프로그래밍의 원칙을 따른다는 의미는?

더보기

리액티브 프로그래밍이 함수형 프로그래밍의 원칙을 따른다는 것은 리액티브 시스템이 함수형 프로그래밍의 핵심 원칙과 많은 부분을 공유한다는 것을 의미합니다. 함수형 프로그래밍의 원칙은 순수 함수, 불변성, 함수 조합, 선언형 프로그래밍 등을 포함합니다.

 

리액티브 프로그래밍은 데이터 스트림과 변환 작업을 중심으로 하는 프로그래밍 패러다임으로, 이벤트에 반응하여 데이터를 처리하고 조작합니다. 함수형 프로그래밍은 데이터를 함수의 입력으로 사용하고, 함수를 사용하여 데이터를 변환하고 조작하는데, 이는 리액티브 프로그래밍에서도 매우 중요한 개념입니다.

 
리액티브 프로그래밍은 다음과 같은 함수형 프로그래밍의 원칙을 따릅니다:
 

1. 불변성(Immutability): 리액티브 프로그래밍에서는 데이터 스트림을 변경하지 않고 변환하는 것이 일반적입니다. 데이터가 변경되면 새로운 데이터 스트림을 생성하여 처리합니다.

2. 함수 조합(Function Composition): 리액티브 프로그래밍에서는 연산을 조합하여 새로운 데이터 스트림을 생성하는 것이 일반적입니다. 연산을 조합하여 원하는 동작을 수행할 수 있습니다.

3. 선언형 프로그래밍(Declarative Programming): 리액티브 프로그래밍은 어떤 동작을 수행하는 방법을 명시하는 것보다 원하는 결과를 명시하는 것에 중점을 둡니다. 데이터 스트림의 흐름과 변환을 선언적으로 정의합니다.

4. 비동기성(Asynchrony): 리액티브 프로그래밍에서는 비동기적으로 작업을 처리하고 데이터 스트림에 반응합니다. 이는 함수형 프로그래밍에서도 비동기적인 작업을 수행하는 방식과 유사합니다.

 

이러한 이유로 리액티브 프로그래밍은 함수형 프로그래밍의 일부 원칙을 따르며, 이러한 원칙을 통해 코드의 안정성, 가독성, 유지보수성을 향상시킬 수 있습니다.

 

 

핵심: 불변성(변화X), 조합(연산조합), 선언형(결과명시), 비동기성의 원칙을 따른다.

>> 함수형, 리액티브, 함수형 리액티브?

 

7.4.2 Observable와 Observer 패턴이란 무엇인가?

더보기

Observable과 Observer 패턴을 기반으로 한다는 것은 RxJava가 이러한 패턴을 사용하여 데이터 스트림을 생성하고 관찰하는데 있어서 핵심적인 아이디어를 제공한다는 것을 의미합니다.

 
여기에 대한 간단한 설명은 다음과 같습니다:
 

1. Observable(관찰 가능한): Observable은 데이터 스트림을 나타내는 클래스입니다. 이 데이터 스트림은 일련의 이벤트나 값을 생성할 수 있습니다. 예를 들어, 사용자 입력, 네트워크 호출 결과, 파일 시스템 변경 사항 등이 될 수 있습니다. Observable은 이러한 데이터 스트림을 생성하고, Observer에게 이벤트를 발행합니다.

2. Observer(관찰자): Observer는 Observable에서 발생하는 이벤트에 반응하는 클래스입니다. Observer는 Observable을 구독(subscribe)하고, Observable에서 이벤트를 수신하면 이를 처리합니다. Observer는 Observable로부터 값을 받아 처리하거나 이벤트에 반응하여 적절한 작업을 수행합니다.

 

이러한 Observable과 Observer 패턴을 결합하여 RxJava는 데이터 스트림을 생성하고, 이를 통해 비동기적으로 데이터를 처리하고 변환하는 강력한 도구를 제공합니다. 이는 비동기 프로그래밍 및 이벤트 기반 시스템에서 데이터 처리와 관련된 다양한 문제를 해결하는 데 도움이 됩니다. RxJava는 이러한 패턴을 사용하여 데이터 스트림을 쉽게 관리하고, 유연하고 강력한 비동기 프로그래밍을 구현할 수 있도록 지원합니다.

 

 

핵심: 

Observable = 데이터 스트림 생성 클래스 => 이벤트 => (subscribe) => Observer = 이벤트 반응 클래스

>> RxJava 이해하기 - Observable

 

7.4.3 연산자란 무엇인가?

더보기

연산자(Operators)는 RxJava에서 데이터 스트림을 변환하고 조작하는데 사용되는 메서드나 함수입니다. 이러한 연산자들은 Observable, Flowable, Single, Completable 등의 RxJava 타입에 적용됩니다. 주요 연산자들은 다음과 같습니다:

 

1. 변환 연산자(Transforming Operators): 데이터 스트림의 항목들을 변환하거나 재구성합니다. 예를 들어 map(), flatMap(), concatMap() 등이 있습니다.

2. 필터링 연산자(Filtering Operators): 데이터 스트림에서 특정 항목을 필터링하거나 걸러냅니다. 예를 들어 filter(), take(), skip() 등이 있습니다.

3. 결합 연산자(Combining Operators): 두 개 이상의 데이터 스트림을 결합하거나 조합합니다. 예를 들어 merge(), zip(), concat() 등이 있습니다.

4. 오류 처리 연산자(Error Handling Operators): 데이터 스트림에서 발생한 오류를 처리하거나 변환합니다. 예를 들어 onErrorResumeNext(), onErrorReturn(), retry() 등이 있습니다.

5. 조건 연산자(Conditional Operators): 데이터 스트림에서 특정 조건을 검사하고 그에 따라 처리합니다. 예를 들어 all(), any(), contains() 등이 있습니다.

6. 시간 지연 연산자(Timing Operators): 데이터 스트림의 이벤트 발생을 지연시키거나 타임아웃을 설정합니다. 예를 들어 delay(), timeout() 등이 있습니다.

7. 배압 제어 연산자(Backpressure Operators): Flowable과 같은 백프레셔블 스트림에서 발생하는 데이터의 생산과 소비 간의 밸런스를 맞춥니다. 예를 들어 onBackpressureBuffer(), onBackpressureLatest(), onBackpressureDrop() 등이 있습니다.

 

이러한 연산자들을 조합하여 복잡한 데이터 처리 흐름을 구성할 수 있으며, RxJava는 이러한 연산자들을 통해 데이터 스트림을 보다 유연하게 조작할 수 있는 강력한 기능을 제공합니다.

 

 

핵심: 연산자 = 데이터 스트림 조작 메서드, 함수

(변환, 필터, 결합, 오류처리..)

>> RxJava 리액티브 연산자

 

+ Flowable, Single, Completable은 무엇인가?

더보기

Flowable, Single, Completable은 RxJava에서 제공하는 다양한 데이터 타입입니다. 각각의 특징과 사용 사례는 다음과 같습니다:

 

1. Flowable: Flowable은 Observable의 확장된 형태로, 백프레셔블(backpressure)을 지원하는 데이터 스트림을 나타냅니다. 백프레셔블은 생산자(Producer)와 소비자(Consumer) 사이의 데이터 흐름을 제어하여 메모리 부족과 같은 문제를 방지합니다. 대용량의 데이터를 처리하거나 느린 소비자에게 데이터를 전달할 때 유용합니다.

2. Single: Single은 오직 하나의 항목이나 오류만을 발행하는 데이터 타입입니다. 주로 비동기적인 작업을 수행하고 그 결과를 단일 항목으로 반환할 때 사용됩니다. 예를 들어 네트워크 호출 결과를 처리하거나 파일에서 데이터를 읽어올 때 유용합니다.

3. Completable: Completable은 단순히 작업의 성공 또는 실패 여부만을 관심 있게 다룰 때 사용됩니다. Completable은 값을 발행하지 않고, 오직 완료 또는 에러 상태만을 전달합니다. 비동기 작업의 성공 여부를 확인하거나 일련의 작업을 순차적으로 실행할 때 유용합니다.

 

이들 데이터 타입은 각각의 사용 사례에 따라 다르게 적합합니다. Flowable은 대량의 데이터를 처리할 때 백프레셔블 기능이 필요한 경우에 사용되고, Single은 단일 값을 반환하는 작업에 적합하며, Completable은 성공 또는 실패 여부만을 확인해야 할 때 사용됩니다. 이러한 데이터 타입들은 RxJava에서 비동기 작업을 처리하고 결과를 효율적으로 다루는데 도움을 줍니다.

 

 

핵심:

Flowable = 백프레셔블 지원

Single = 단일 값 반환

Completable = 성공/실패 여부 확인

>> RxJava - 또 다른 생산자

 

++ 데이터 타입이란?

더보기

"데이터 타입"은 프로그래밍에서 변수나 상수가 포함할 수 있는 데이터의 종류나 형태를 나타냅니다. 다른 말로는 "자료형"이라고도 합니다.

 

프로그래밍 언어에서는 다양한 데이터 타입이 있으며, 각각의 데이터 타입은 특정한 종류의 데이터를 저장하고 처리하는 데 사용됩니다. 예를 들어, 정수형 데이터를 저장할 때는 정수형 데이터 타입을 사용하고, 실수형 데이터를 저장할 때는 실수형 데이터 타입을 사용합니다.

 

데이터 타입은 프로그래밍 언어의 문법과 함께 사용되며, 변수를 선언할 때 그 변수가 어떤 종류의 데이터를 저장할 수 있는지를 명시적으로 지정하는 데 사용됩니다. 또한 데이터 타입은 컴파일러나 인터프리터에게 변수가 어떤 종류의 데이터를 기대하는지를 알려줍니다.

 

RxJava에서 제공하는 데이터 타입인 Flowable, Single, Completable은 비동기적인 데이터 처리를 위해 사용되는 특별한 형태의 데이터 타입입니다. 각각의 데이터 타입은 다른 목적과 특징을 가지고 있으며, RxJava에서 비동기 작업을 처리하고 결과를 전달하는 데 사용됩니다.

 

 

핵심: 데이터 타입 = 자료형.

 

++ RxJava 라이브러리를 이용한 Observable, Flowable, Single, Completable 데이터 타입의 예시코드는?

더보기
Observable 예시 코드:
 
Observable<String> observable = Observable.create(emitter -> {
    emitter.onNext("Hello");
    emitter.onNext("World");
    emitter.onComplete();
});

observable.subscribe(
    item -> System.out.println("Received: " + item),
    error -> System.err.println("Error occurred: " + error),
    () -> System.out.println("Completed")
);

 

Flowable 예시 코드:
 
Flowable<Integer> flowable = Flowable.range(1, 10);

flowable.subscribe(
    item -> System.out.println("Received: " + item),
    error -> System.err.println("Error occurred: " + error),
    () -> System.out.println("Completed")
);

 

Single 예시 코드:
 
Single.just("Hello Single")
    .subscribe(
        item -> System.out.println("Received: " + item),
        error -> System.err.println("Error occurred: " + error)
    );

 

Completable 예시 코드:
 
Completable completable = Completable.fromRunnable(() -> {
    // Run some background task
    System.out.println("Completable task completed");
});

completable.subscribe(
    () -> System.out.println("Completed"),
    error -> System.err.println("Error occurred: " + error)
);

 

위의 코드에서 Observable은 일련의 이벤트를 생성하고, Flowable은 백프레셔블(backpressure)을 지원하는 대량의 데이터 스트림을 생성합니다. Single은 오직 하나의 값을 발행하거나 에러를 발생시키며, Completable은 작업의 성공 또는 실패만을 다룹니다.

 

각각의 데이터 타입은 구독(subscribe) 메서드를 호출하여 이벤트를 처리하고, onNext(), onError(), onComplete() 등의 메서드를 사용하여 각각의 이벤트를 처리합니다.

 

 

핵심: RxJava 각 데이터타입은 subscribe 메서드(onNext, onError, onComplete) 사용 -> 이벤트 처리

>> RxJava 프로그래밍

 

++ 백프레셔블이란?

더보기

백프레셔블(Backpressure)은 생산자(Producer)와 소비자(Consumer) 사이의 데이터 흐름을 제어하기 위한 메커니즘입니다. 데이터를 생산하는 속도와 데이터를 소비하는 속도가 서로 다를 때 발생하는 문제를 해결하기 위해 사용됩니다.

 

일반적으로 생산자가 데이터를 빠르게 생성하는 경우, 소비자가 데이터를 처리할 시간이 부족하여 메모리 부족이나 성능 저하와 같은 문제가 발생할 수 있습니다. 이러한 상황을 방지하기 위해 백프레셔블은 생산자가 소비자에게 데이터를 보낼 때 소비자가 처리할 수 있는 속도로 데이터를 제어하는 메커니즘입니다.

 

RxJava에서는 백프레셔블을 지원하는 Flowable이라는 데이터 타입을 제공합니다. Flowable은 데이터 스트림을 생성할 때 백프레셔블을 적용하여 생산자와 소비자 간의 데이터 흐름을 조절합니다. Flowable은 생산자가 데이터를 생성할 때 소비자의 요청을 기다려야 하며, 소비자가 처리할 수 있는 만큼의 데이터만 생성하여 보냅니다. 이를 통해 메모리 부족과 같은 문제를 예방하고 안정적인 데이터 처리를 가능케 합니다.

 

백프레셔블은 대량의 데이터를 처리하거나 느린 소비자에게 데이터를 전달할 때 유용하며, RxJava와 같은 리액티브 프로그래밍 라이브러리에서 비동기 데이터 처리의 안정성과 효율성을 보장하기 위해 중요한 개념 중 하나입니다.

 

 

핵심: 백프레셔블 = 데이터 생산 <-> 소비 사이에 속도조절

>> 백프레셔와 플로어블

 

+++ 여기서 말하는 생산자와 소비자의 뜻은?

더보기

생산자(Producer)와 소비자(Consumer)는 데이터 흐름에서 데이터를 생성하고 소비하는 역할을 하는 요소들을 나타냅니다. 이들은 다음과 같은 의미를 갖습니다:

 

1. 생산자(Producer): 생산자는 데이터를 생성하고 데이터 스트림을 만드는 주체입니다. 일반적으로 데이터를 생성하고 이를 데이터 스트림으로 전달합니다. 예를 들어, 센서에서 데이터를 읽어오거나 네트워크에서 데이터를 받아오는 것이 생산자의 역할에 해당합니다.

2. 소비자(Consumer): 소비자는 데이터를 받아들이고 처리하는 주체입니다. 데이터 스트림에서 제공되는 데이터를 소비하고 이를 처리하는 역할을 합니다. 소비자는 받은 데이터를 사용하여 특정 작업을 수행하거나 결과를 표시하는 등의 역할을 수행합니다.

 

생산자와 소비자는 데이터 스트림을 통해 상호 작용하며, 일반적으로 비동기적인 환경에서 사용됩니다. 생산자는 데이터를 생성하고 소비자는 이를 처리하며, 데이터 스트림은 이들 사이의 통로 역할을 합니다. 이러한 구조는 RxJava와 같은 리액티브 프로그래밍에서 비동기 데이터 처리를 위해 중요한 개념으로 사용됩니다. 생산자와 소비자의 관계를 잘 조절함으로써 데이터 흐름을 효율적으로 관리하고 메모리 부족과 같은 문제를 예방할 수 있습니다.

 

 

핵심:

생산자 = 데이터 생성

소비자 = 데이터 처리

생산자 <- 데이터 스트림(통로역할) -> 소비자

>> 생산자(Producer) 소비자(Consumer) 패턴

 

 

8. 비즈니스 규칙이란 무엇인가?

더보기

"비즈니스 규칙"이라는 용어는 Clean Architecture와 같은 소프트웨어 아키텍처 패턴에서 사용되는 중요한 요소입니다. 비즈니스 규칙은 애플리케이션의 핵심 로직이나 비즈니스 규칙 세트를 나타냅니다.

 

일반적으로 비즈니스 규칙은 특정 비즈니스 도메인이나 업무 영역에서 적용되는 규칙, 정책, 계산 방법 등을 포함합니다. 이러한 규칙은 비즈니스의 목적과 요구 사항을 반영하며, 애플리케이션의 핵심 기능을 정의하는 데 중요한 역할을 합니다.

 

Clean Architecture에서 비즈니스 규칙은 애플리케이션의 핵심 부분으로 간주되며, 사용자 인터페이스(UI)나 외부 데이터 소스와 분리되어야 합니다. 이렇게 분리함으로써 비즈니스 규칙은 애플리케이션의 다른 부분과 독립적으로 유지되며, 변경되거나 확장될 수 있습니다.

 

예를 들어, 은행 애플리케이션의 경우 대출 승인 규칙, 이자 계산 규칙, 보안 규칙 등이 비즈니스 규칙에 해당할 수 있습니다. 이러한 규칙들은 UI나 데이터베이스와 같은 외부 요소와 독립적으로 구현되어야 하며, 변경이 필요할 때 쉽게 수정하거나 확장할 수 있어야 합니다.

 

 

핵심: 비즈니스 규칙 = 비즈니스 요구 반영 규칙 (핵심로직)

>> 클린 아키텍처 - 업무규칙 Business Rules

 

 

댓글