| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | ||||
| 4 | 5 | 6 | 7 | 8 | 9 | 10 |
| 11 | 12 | 13 | 14 | 15 | 16 | 17 |
| 18 | 19 | 20 | 21 | 22 | 23 | 24 |
| 25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 의존성주입
- Kotlin
- Gradle
- 안드로이드 스튜디오
- WebView
- studio
- coroutine
- 안드로이드
- MVVM
- 유튜브
- 코틀린
- hilt
- DAGGER
- 스튜디오
- ADB
- 깃헙
- DI
- 코루틴
- build
- compose
- Github
- RecyclerView
- cursor
- 안드로이드스튜디오
- 에러
- Android
- 안스
- 웹뷰
- Retrofit
- error
- Today
- Total
목록분류 전체보기 (173)
코딩하는 일용직 노동자
https://github.com/orbit-mvi/orbit-mvi GitHub - orbit-mvi/orbit-mvi: A simple MVI framework for Kotlin Multiplatform and AndroidA simple MVI framework for Kotlin Multiplatform and Android - orbit-mvi/orbit-mvigithub.comMVI 패턴을 쉽고 안전하게 구현할 수 있도록 도와주는 라이브러리이다.data class CalculatorState( val total: Int = 0)sealed class CalculatorSideEffect { data class Toast(val text: String) : CalculatorSide..
안드로이드 개발을 하다 보면 **DI(Dependency Injection, 의존성 주입)**라는 벽에 부딪힙니다. "Dagger2는 너무 어렵다", "보일러 플레이트 코드가 너무 많다"는 이야기를 들어보셨을 겁니다.Google이 만든 Hilt는 이 어려운 DI를 아주 쉽게 만들어준 도구입니다. 오늘은 복잡한 이론 대신, **"배달 서비스"**에 비유해서 Hilt의 핵심 사용법을 딱 4단계로 정리해 보겠습니다.💡 Hilt 핵심 개념: "자동 배달 서비스"Hilt를 사용하는 것은 요리(객체 생성)를 직접 하지 않고, 배달(주입)시키는 것과 같습니다.나(Activity): "이거 갖다줘(@Inject)"라고 주문만 하면 됨.Hilt: 주문받은 객체를 문 앞까지 알아서 배달해줌. 1단계: 배달 앱 켜기 (초..
안드로이드 개발을 하다 보면 한 번쯤 마주치는 거대한 벽, 바로 **'클린 아키텍처(Clean Architecture)'**입니다."도메인이 어떻고, 의존성이 어떻고..." 이론으로만 접근하면 너무 어렵게 느껴지는데요. 오늘은 이 클린 아키텍처를 우리가 흔히 가는 **'고급 레스토랑'**에 비유해서 아주 쉽게 정리해 보려 합니다.이 글을 다 읽고 나면, 머릿속에 아키텍처의 구조가 그림처럼 그려지실 거예요!🏛️ 클린 아키텍처란?클린 아키텍처는 앱을 **3개의 역할(계층)**로 아주 명확하게 나누는 방법입니다. 서로의 일을 침범하지 않게 해서 수정과 관리를 편하게 만드는 것이 최종 목표죠. 자, 이제 우리 앱을 레스토랑이라고 상상해 봅시다.1. 레스토랑으로 보는 3가지 계층 ① 프레젠테이션 계층 (Pres..
안드로이드 개발에서 Hilt를 사용하여 의존성 주입(Dependency Injection)을 할 때, 모듈(Module) 내에서 의존성을 제공하는 방법으로 `@Provides`와 `@Binds` 두 가지 애노테이션을 사용합니다. 둘 다 의존 객체를 제공하는 역할을 하지만, 사용 목적과 방식, 그리고 성능에서 차이가 있어 상황에 맞게 사용하는 것이 중요합니다.결론부터 말하자면, 인터페이스(interface)와 구현체(implementation)를 묶어주는 단순한 작업에는 `@Binds`를, 복잡한 객체 생성 로직이 필요할 때는 `@Provides`를 사용하는 것이 좋습니다.@Provides: 객체 생성의 모든 것을 책임진다`@Provides`는 Hilt가 직접 생성할 수 없는 타입의 객체를 어떻게 만들어서..
안드로이드 Jetpack Compose에서 사용하는 주요 Effect Handler들에 대해 각각의 역할과 사용 사례를 중심으로 설명해 드릴게요.이 Effect Handler들은 Composable 함수의 생명주기와는 별개로 실행되어야 하는 작업, 즉 \*\*Side Effect(부수 효과)\*\*를 안전하게 관리하기 위해 사용됩니다. 예를 들어 데이터베이스에 접근하거나, 네트워크 요청을 보내거나, 리스너를 등록하는 등의 작업이 여기에 해당합니다.1. LaunchedEffect`LaunchedEffect`는 Composable이 처음으로 화면에 그려질 때(Composition 될 때) **코루틴을 실행**하고 싶을 때 사용합니다. 가장 일반적으로 사용되는 Effect Handler 중 하나입니다. * *..
✨ Android 프로젝트에 Ktlint + Spotless로 자동 코드 포맷팅 날개 달기 🚀 안녕하세요! 동료 개발자들과 협업하다 보면 서로 다른 코드 스타일 때문에 골치 아팠던 경험, 다들 한 번쯤 있으시죠? 😅 오늘은 이런 코드 스타일 스트레스를 한 방에 날려버릴 ktlint와 Spotless 조합을 Android 프로젝트에 적용하는 방법을 알아보겠습니다.이 가이드를 따라오시면, 팀원 모두가 깔끔하고 일관된 코드를 작성하게 되어 코드 리뷰는 즐거워지고, 프로젝트 품질은 쑥쑥 올라갈 거예요!🎯 우리의 목표- 일관된 코드 스타일: 누가 작성하든 항상 같은 모양의 코드를 유지해요.- 완전 자동화: Ctrl+Alt+L은 이제 그만! 빌드할 때마다 알아서 코드가 예뻐져요.- 협업 효율 UP: "이 부분..
Homebrew를 사용하고 계신가요? 터미널 명령어 몇 줄만으로 유튜브 영상을 손쉽게 다운로드하는 방법을 소개합니다. yt-dlp와 ffmpeg만 있으면 준비 끝!1. 필수 프로그램 설치하기yt-dlp 설치먼저 유튜브 영상 다운로드의 핵심인 yt-dlp를 설치합니다. $ brew install yt-dlp 설치가 잘 되었는지 아래 명령어로 버전을 확인해 보세요.$ yt-dlp --version2025.01.15 ffmpeg 설치고화질 영상을 처리하거나, 영상과 음성을 합치기 위해 필요한 ffmpeg을 설치합니다.$ brew install ffmpeg 마찬가지로 버전 확인 명령어로 설치를 확인합니다.$ ffmpeg -versionffmpeg version 7.1.1 Copyright (c) 2000-2..
M1 맥북에서 안드로이드 USB 테더링 설정 가이드안드로이드 스마트폰을 M1 맥북과 USB로 연결해 테더링을 사용하려면, 일반적인 드라이버 설치만으로는 동작하지 않습니다. macOS의 보안 정책과 ARM 아키텍처의 차이로 인해, 별도의 드라이버 설치와 보안 설정 변경이 필요합니다. 아래에 최신 환경(M1 맥북, macOS Monterey 이상 기준)에서 USB 테더링을 성공적으로 설정하는 방법을 단계별로 정리했습니다.1. HoRNDIS 드라이버 준비HoRNDIS.kext(또는 pkg) 파일을 미리 다운로드합니다.HoRNDIS는 macOS에서 안드로이드 USB 테더링을 가능하게 해주는 드라이버입니다.2. MacOS 복구 시스템 진입맥북을 완전히 종료합니다.전원 버튼을 10초 이상 길게 눌러 복구 시스템(R..
안녕하세요! 오늘은 안드로이드 앱 개발 디자인 패턴 중 하나인 MVI (Model-View-Intent) 패턴의 핵심 구성 요소, Reducer에 대해 자세히 알아보겠습니다. MVI 패턴은 예측 가능하고 테스트하기 쉬운 UI 개발을 목표로 하며, Reducer는 이 아키텍처에서 상태(State)를 변경하는 순수 함수라는 중요한 역할을 담당합니다. MVI 패턴이란? MVI 패턴은 단방향 데이터 흐름을 강조하여 UI 개발의 복잡성을 줄이고 유지보수성을 높이는 아키텍처입니다. 주요 구성 요소는 다음과 같습니다. Model (상태 - State): 화면에 표시되는 데이터와 UI의 상태를 나타냅니다. 불변성을 유지하는 것이 중요합니다. View (UI): 사용자에게 데이..
모바일 핫스팟 및 테더링 메뉴 바로가기 intent val cn = ComponentName("com.android.settings", "com.android.settings.TetherSettings") val intent: Intent = Intent(Intent.ACTION_MAIN, null).apply { addCategory(Intent.CATEGORY_LAUNCHER) setComponent(cn) flags = Intent.FLAG_ACTIVITY_NEW_TASK } startActivity(intent)