뿌셔뿌셔(368)
-
비즈니스 로직은 ViewModel로 분리하자
Jetpack Compose에서는 UI는 UI에 집중하고,비즈니스 로직은 ViewModel로 분리해야 유지보수성과 재사용성이 높아진다.사례: 쿠폰 개수 계산오늘 쿠폰 개수를 계산하는 코드가 UI 안에 있었는데,아래와 같은 로직은 사실상 UI보다는 정책에 가까운 계산이다.fun calcCouponCount(selectedPersonalCup: String, shotCount: Int): Int { val basePrice = ... // 선택 옵션에 따른 쿠폰 수 계산 로직}그래서 이 로직은 ViewModel로 옮겼고, UI에서는 이렇게 간단하게 사용했다.val couponCount = remember(selectedPersonalCup, shotCount) { viewModel.calcC..
2025.06.10 -
Android RecognitionListener로 음성 인식하기
Android에서 RecognitionListener는 SpeechRecognizer를 통해 음성 인식을 수행할 때,음성 인식 과정의 다양한 단계에서 발생하는 이벤트들을 수신하고 처리하기 위한 인터페이스이다.이를 통해 음성 인식의 흐름을 파악하고, 인식 결과를 활용하거나 오류 상황에 대처할 수 있다. 1. onReadyForSpeech(Bundle params)호출 시점: 음성 인식기가 사용자의 말을 들을 준비가 완료되었을 때.역할: "말씀하세요" 같은 UI 안내 표시, 마이크 아이콘 활성화 등.2. onBeginningOfSpeech()호출 시점: 사용자가 실제로 말을 시작한 것이 감지되었을 때.역할: "듣고 있어요..." 같은 UI 피드백, 녹음 애니메이션 시작 등.3. onEndOfSpeech()호..
2025.05.26 -
[삽질기] JDK 17.0.9에서 17.0.11로 올렸더니 Kapt가 말썽? 해결 방법 공유!
나는 JDK 17을 사용 중이었고, 새로운 프로젝트 파일을 받게 되었다.모든 세팅을 JDK 17로 맞춰놓고 빌드 시도 !!java.lang.IllegalAccessError: superclass access check failed: class org.jetbrains.kotlin.kapt3.base.javac.KaptJavaCompiler (in unnamed module @...) cannot access class com.sun.tools.javac.main.JavaCompiler (in module jdk.compiler) because module jdk.compiler does not export com.sun.tools.javac.main to unnamed module @...응? 잠깐만…왜..
2025.05.23 -
DTO (Data Transfer Object)
1. DTO (Data Transfer Object)란?계층 간 데이터 전달을 위한 객체이다.즉, 서버→클라이언트 간 데이터를 주고 받을 때 사용하는 전용 데이터 구조를 의미한다.JSON 데이터를 Kotlin 객체로 변환할 때 사용Retrofit 응답 타입으로 사용2. DTO와 앱 내부 데이터 구조는 다르다.DTO는 앱 내부 로직에서 직접 사용하면 안된다.API 응답 형태가 바뀌면 앱 전체가 깨질 수 있음앱 로직/UI와 무관한 데이터가 들어있을 수 있음의존성이 엉킴 → Clean Architecture 깨짐3. 각 용어 요약표 용어 목적 위치/계층 특징 DTOAPI 통신용 (전달/수신) 객체data순수 데이터 보관, 로직 없음EntityDB 저장용 객체 (Room, JPA 등)data테이블 구조..
2025.05.22 -
Google Apps Script로 Slack 주간 리마인더 자동화하기
매주 정해진 시간에 Google Apps Script(GAS)로 Slack에 자동 메시지를 보내는 봇을 만들었다.Webhook URL만 있으면 끝!1. 사용 시나리오매주 월요일 오전 9시 → 주간 목표 전송매주 일요일 오후 6시 → 주간 회고 전송2. Notion Webhook 세팅 방법 _Please note, this is a legacy custom integration - an outdated way for teams to integrate with Slack. These integrations lack newer features and they will be deprecated and possibly removed in the" data-og-host="slack.com" data-og-sour..
2025.05.21 -
코틀린에서 스코프(Scope)란?
프로그래밍에서 "스코프(scope)"는 변수나 함수, 클래스 등의 이름(식별자)이 유효한 범위를 뜻한다.코틀린(Kotlin)에서는 이 개념이 특히 중요한데, 코드의 안정성, 가독성, 유지보수성에 큰 영향을 주기 때문이다.스코프(Scope)란?어떤 이름(식별자)이 어디서부터 어디까지 유효한지(접근 가능한지)를 결정짓는 논리적 범위.스코프가 중요한 이유이름 충돌 방지: 서로 다른 블록에 같은 이름 사용 가능캡슐화: 외부에 불필요한 정보 숨기기가독성/유지보수 향상: 필요한 곳에서만 변수 사용 가능 코틀린의 주요 스코프 종류1. 로컬 스코프 (Local Scope)함수나 블록 내부에서 선언된 변수해당 블록 내에서만 유효fun greet() { val name = "Bbang_9999u" // 로컬 스코프 ..
2025.05.20