전체 글 33

[Android/Kotlin] Android 폰트 크기(fontScale) 기기 대응, 어떻게 할까

안드로이드 개발을 하다 보면 한 번쯤은 이런 상황을 겪게 됩니다.내 기기에서는 멀쩡하게 보이던 UI가 다른 기기에서는 텍스트가 잘리거나, 버튼을 넘치거나, 레이아웃이 깨져서 돌아오는 경우입니다.특히 QA 과정에서 "글자가 다 안 보여요", "버튼이 깨져요" 같은 이슈가 올라오면 원인을 찾기 위해 한참을 헤매게 되는데요. 실제로 살펴보면 상당수의 원인이 시스템 폰트 크기 설정(fontScale) 에 있는 경우가 많습니다.fontScale이란?안드로이드는 접근성을 위해 사용자가 시스템 설정에서 폰트 크기를 조절할 수 있도록 지원합니다.사용자는 설정 앱에서 글자 크기를 작게 또는 크게 변경할 수 있으며, 이 값은 내부적으로 Configuration.fontScale로 관리됩니다.기본값은 1.0f이며, 사용자가..

Android/Kotlin 2026.06.18

[Android/Kotlin] Jetpack Compose 환경에서 런타임 권한 요청 구조 개선하기 - 1

키어로(Kiero) 프로젝트 스프린트를 진행하면서 다음과 같은 요구사항을 마주했다. 마이페이지의 토글 버튼을 통해 앱 알림 수신 여부를 설정하는 기능이었다. 알림이 꺼져있는 상태에서 클릭하여 켜려고 시도하면 권한 유도 모달 창이 나타나며, '설정으로 이동' 버튼을 클릭 시 디바이스 OS 앱 알림 설정 화면으로 이동하는 요구사항이다. 1. 문제 상황처음에는 알림 권한이 켜져 있는지 확인하기 위해 Context 확장 함수를 하나 만들었다.fun Context.isNotificationEnabled(): Boolean { val manager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager return manager...

Android/Kotlin 2026.05.28

[Android/Kotlin] Locale.KOREAN을 줬는데 왜 AM/PM이 나올까?

문제 발견개발 중인 앱에서 시간을 오전/오후 형식으로 표시해야 하는 요구사항이 있었습니다. 구현은 간단해 보였어요.DateTimeFormatter에 Locale.KOREAN을 명시하면 된다고 알고 있었고, 실제로 다른 프로젝트에서도 잘 동작하던 코드였거든요. object Formatters { private val KOREAN_NOTICE_TIME_FORMATTER = DateTimeFormatter.ofPattern("a hh:mm", Locale.KOREAN) fun getCurrentNoticeTime(): String = LocalTime.now().format(KOREAN_NOTICE_TIME_FORMATTER)} 어라? 그런데 에뮬레이터에서 실행..

Android/Kotlin 2026.05.21

[Android/Kotlin] Material Design 알아보기!

01. 왜 디자인 시스템이 필요한가?디자인 시스템이 없을 때 vs. 있을 때구분 디자인 시스템 없음 디자인 시스템 있음컴포넌트 제작매번 새로 만듦기존 것 가져다 씀디자이너↔개발자 소통용어가 달라 오해 빈번같은 컴포넌트 이름으로 소통앱 일관성화면마다 다른 느낌전체가 통일된 느낌다크 모드 대응직접 색상 하나하나 변경테마 교체 한 번으로 완료 02. Material Design이란 무엇인가?공식 표기는 머티리얼 디자인, Material Design은 구글이 2014년 발표한 UX/UI 디자인 가이드라인입니다. 여러 플랫폼을 겨냥하긴 했지만, 그 쓰임이 모바일에 제일 알맞게 구성되었습니다. 현실 세계의 재료(Material)에서 영감을 받아, 빛·그림자·깊이 개념을 디지털 인터페이스에 적용했습니다. 버전..

Android/Kotlin 2026.05.07

[Android/Kotlin] 딥 링크(deep links) 처리하기

딥 링크란?딥 링크란 외부 URL이나 알림 등에서 앱 내 특정 화면으로 직접 진입할 수 있게 해주는 메커니즘단순히 앱을 여는 것이 아니라 원하는 목적지까지 한 번에 도달하게 해준다. 사례트리거목적OAuth 콜백외부 앱/브라우저인증 완료 후 앱 복귀이메일 인증이메일/문자 링크토큰 수신 및 자동 로그인푸시 알림FCM 알림 클릭특정 화면 직접 진입SNS 공유카카오톡/인스타 등콘텐츠/상품 화면 공유QR 코드카메라 스캔오프라인→온라인 연결 1. XML 방식1-1. 매니페스트 선언딥 링킹을 활성화하려면 딥 링크를 처리해야 하는 Activity에 대해 AndroidManifest.xml에서 intent filter를 선언해야 한다.android:scheme: URL 스키마(가령, https)를 지정합니다.andr..

Android/Kotlin 2026.04.30

[Android/Kotlin] Dagger-Hilt로 의존성 주입하기

안드로이드 애플리케이션 개발에서 '유지보수성', '확장성', '테스트 용이성'은 끊임없이 추구해야 할 가치입니다. 이러한 가치를 실현하는 데 핵심적인 역할을 하는 설계 패턴 중 하나가 바로 **의존성 주입(Dependency Injection, DI)**입니다. 그리고 안드로이드 환경에서 의존성 주입을 가장 효율적이고 표준적으로 구현할 수 있도록 돕는 라이브러리가 바로 Dagger-Hilt입니다.오늘은 안드로이드 개발자들이 왜 Dagger-Hilt에 주목해야 하는지, 그 특징과 장점, 그리고 실제 활용 사례들을 자세히 살펴보겠습니다.1. Dagger-Hilt란 무엇인가요?Dagger-Hilt는 안드로이드 애플리케이션에서 **의존성 주입(Dependency Injection)**을 더 쉽고 표준적으로 사용..

Android/Kotlin 2025.09.12

[Android/Kotlin] 비동기 작업, Enqueue부터 코루틴까지

비동기 작업, 왜 필요할까요?비동기(Asynchronous) 작업이란, 프로그램의 주된 실행 흐름을 방해하지 않으면서 특정 작업을 수행하는 방식을 의미합니다. 이는 특정 작업이 완료될 때까지 기다리지 않고, 그 시간 동안 다른 작업을 먼저 처리할 수 있게 하여 시스템의 전반적인 효율성을 극대화합니다.주로 네트워크 통신, 대용량 데이터베이스 조회, 파일 I/O 등 시간이 오래 걸릴 수 있는 작업에 활용됩니다. 이러한 작업들을 동기(Synchronous) 방식으로 처리하게 되면, 작업이 끝날 때까지 애플리케이션 전체가 멈추거나 '멈춘 것처럼' 보이는 현상, 즉 UI 블로킹이 발생하여 사용자 경험을 심각하게 저해할 수 있습니다.전통적인 접근: Enqueue 방식Enqueue 방식은 주로 콜백(Callback)..

Android/Kotlin 2025.09.12

[Spring] Spring MVC

Spring MVC란?Spring MVC는 Model-View-Controller 패턴을 따르는(제공하는) 웹 애플리케이션 프레임워크 구성 요소역할 설명Model애플리케이션의 데이터를 캡슐화 (주로 POJO)View모델 데이터를 렌더링하여 사용자에게 보여줌 (JSP 등)Controller사용자 요청을 처리하고 Model을 생성하여 View로 전달Tomcat -> 멀티 스레드 환경에서 돌아감.( 멀티 스레드 환경에서 항상 고민해야 할 것 : 공유 자원 –> 여러 스레드들이 공유 자원을 동시에 접근할 때, 상호 배제(lock, synchronized 등)가 필요함. )클래스내의 멤버 변수는 공유 자원임. DispatcherServlet(Front Controller로 작동)Spring MVC 프레임워크의 ..

Java 2025.06.24

[Spring] 의존성 주입이란? - DI(Dependency Injection)

의존성(Dependency)이란?클래스 A가 클래스 B를 내부에서 생성하거나 사용하는 경우, A는 B에 의존한다고 말함public class PetOwner { private AnimalType animal; public PetOwner() { this.animal = new Dog(); // 직접 생성 -> 강한 결합 (tight coupling) }}위 방식의 문제: 구현체가 바뀌면 코드 변경 필요 → 유연성 ↓ Dependency Injection(DI)란?객체의 의존성을 외부에서 주입(Inject) 받는 패턴Spring에서는 이 기능을 IoC 컨테이너가 수행함public class PetOwner { private AnimalType animal; publ..

Java 2025.06.05

[Spring] 스프링이란?

웹 시스템웹 환경하에서 서로 다른 종류의 컴퓨터 간에 상호 작용을 하기 위한 소프트웨어 시스템클라이언트-서버 기반HTTP, 메시지 지향적(XML/JSON)플랫폼 중립적, 독립적 프레임워크란?프레임워크는 ‘구조 품질’을 보장SW품질기능 품질 : 고객이 원하는 바를 충족하였는지(고객의 니즈)구조 품질 : 유지보수 및 재사용이 쉽고, 확장이 가능하며 잘 설계, 코딩 되어 있어야 함 프레임워크의 중요성프레임워크는 반제품– 애플리케이션 구조 및 코드의 상당 부분을 제공– 개발자는 애플리케이션의 핵심 로직에 집중 가능프레임워크 장점– 높은 생산성– 코드 품질 보장 라이브러리 vs 프레임워크중요한 차이점은 "Inversion of Control“ (IoC를 구현하는 대표적인 방법 → 의존성 주입(DI))– 클래스..

Java 2025.06.05
반응형