개발(36)
-
[생존 매뉴얼] 작동하는 코드보다 더 무서운 건, 작동하는 줄 알고 넘어간 코드다.
오래된 앱을 유지보수 하는 입장에서는 고쳐야 할 곳이 너무 많다.그 때 그 때 고치고 덧대는 이런 느낌. 서드파티 라이브러리는 지원을 하지 않고, View는 아주 오래전에 쓰던 방식이고.그렇다고 한번에 바꾸는 건 회사에서 허락해주지 않는다. (시간적 비용 등…) 결국 조금씩 리팩토링을 해나가는 방법 뿐이지만, 그렇게 되면 사이드 이펙트를 무시할 수 없다.사소한 로직을 하나 고치고 “에이, 이건 괜찮겠지~” 넘어갔다가 앱을 배포하면다음 날 엄청난 Crash 지옥을 맛볼 수 있다. 코드는 “에러 없이 돌아간다”고 해서 끝난 게 아니다.“내가 의도한 대로, 모든 케이스에서 정확히 동작한다”는 확신 없이는결국 폭탄 돌리기일 뿐이다.오류를 줄이는 디테일한 실천 가이드 (생존 매뉴얼)(1) 작은 수정도 반드시 직접..
2025.03.25 -
보이지 않는 문자들의 연합: 유니코드 이야기
옛날엔 나라별로 문자 인코딩이 다 달랐다.영어는 ASCII, 한국어는 EUC-KR, 일본어는 Shift-JIS...그래서 문자 하나 복붙만 해도 깨지고 뭉개지고 난리 난리~ 그래서 등장한 유니코드 !! “전 세계 모든 문자를 한 표준으로 다 담아버리자 !!!!” 1. 유니코드란?전 세계의 모든 문자를 하나의 표준으로 통합한 문자 체계 !!!!특징각 문자는 고유 코드포인트를 가짐 → 예: ‘A’ = U+0041, ‘가’ = U+AC00이모지, 한글, 일본어, 아랍어 전부 포함인코딩 방식: UTF-8, UTF-16, UTF-32 등 (저장 방식 차이)15만 개 이상의 문자를 지원하며 현재도 계속 증가 2. 인코딩 (UTF-8, UTF-16, UTF-32)유니코드는 “문자를 숫자로 바꾸는 표준”이고,인코딩은 ..
2025.03.21 -
빌드 환경 세팅, SSD가 HDD보다 효과적일까?
회사 앱이 무거워질수록 빌드 속도가 확연히 느려졌다.가끔은 하나를 수정하고, 빌드 하는데 10분이 걸리기도…회사에서 지원되는 컴퓨터 스펙 항목 사양 CPUIntel i5-10세대 (4코어 8스레드)RAM (메모리)32GB저장장치 1 (C 드라이브 - SSD)Crucial MX500 250GB (SATA SSD)저장장치 2 (D 드라이브 - HDD)Seagate Barracuda ST2000DM008 (2TB HDD, 7200RPM)GPU (그래픽카드)Intel UHD Graphics 630이 정도면 애뮬레이터를 돌리기는 힘들지만 Android Studio를 운영하는 데는 큰 무리가 없다.하지만 자꾸 빌드 속도는 느려지고 Compose로 돌리는 순간 컴퓨터는 무한 버벅임이 시작되었다.그렇다면 문제는 저장 ..
2025.03.19 -
메타 프로그래밍 리플렉션(Reflection)이란?
1. 리플렉션(Reflection)이란?리플렉션은 앱 실행 중에 클래스, 메서드, 속성 등의 정보를 동적으로 가져오거나 수정할 수 있는 기능이다.즉, 코드가 자기 자신을 들여다보고 조작하는 능력.(1) 리플렉션이 필요한 이유런타임에서 클래스 정보를 조회해야 할 때 → 예를 들어, DI(의존성 주입) 같은 곳에서 객체 타입을 몰라도 생성해야 할 경우코드 수정 없이 동적으로 메서드 호출 → 프레임워크에서 코드를 직접 수정하지 않고 기능을 확장할 때JSON 직렬화/역직렬화 → Gson, Moshi 같은 라이브러리가 리플렉션을 사용해서 객체를 변환(2) 리플렉션 사용 예제클래스 정보를 가져오기import kotlin.reflect.full.*data class User(val name: String, val a..
2025.03.12 -
오버헤드(overhead)와 스택 오버플로우(Stack Overflow), 왜 발생하고 어떻게 해결할까?
오버헤드(overhead)란?어떤 작업이나 시스템을 운영할 때 추가적으로 드는 비용, 시간 메모리 같은 리소스를 의미한다.> 코드 실행 오버헤드불필요하게 많은 객체 생성 시 발생복잡한 연산 수행 시 발생⇒ 결과적으로 실행 속도가 느려짐> 메모리 오버헤드필요 이상으로 큰 데이터 로드할 때 발생캐시를 많이 사용할 때 발생⇒ 결과적으로 메모리가 낭비됨> 네트워크 오버헤드짧은 데이터를 보내는데도 요청/응답을 위한 추가적인 정보가 많을 때 발생⇒ 결과적으로 더 많은 트래픽이 발생함 대충 “뭔가를 하려는데 쓸데없이 부담되는 짐이 추가된다” 정도의 느낌.오버헤드 성능 최적화 시 고려해야 할 사항재귀보다는 반복문 사용 (StackOverflow 방지)불필요한 객체 생성 줄이기 (GC 부하 감소)쓰레드보다는 코루틴 사용..
2025.03.04 -
Dagger Hilt를 사용할 때, @Binds와 @Provides의 차이
의존성을 주입할 때 Hilt에는 두가지 방법이 있다.@Binds와 @Provides이 두가지는 어떤 차이점이 있을까?1️⃣ @Binds와 @Provides의 공통점둘 다 의존성 주입에서 객체를 제공하는 역할을 한다.즉, @Provides와 @Binds 모두 Hilt(Dager)가 어떤 객체를 사용할지 알 수 있도록 도와준다.2️⃣ 차이점✅ 객체 생성 방식@Provides : 메서드에서 객체를 직접 생성 (return 사용)@Binds : 이미 생성된 객체를 인터페이스에 바인딩@Module@InstallIn(SingletonComponent::class)object NetworkModule { @Provides fun provideRetrofit(): Retrofit { return..
2025.02.24