Android 12

[Android] WebSocket으로 실시간 채팅 구현하기 1 - WebSocket이란?

최근에 "납작마켓"이라는 프로젝트에서 웹소켓을 활용한 채팅 기능을 구현했습니다. 이전엔 Retrofit을 활용한 REST 통신만 다뤄봤기에 안해 많이 해멜 것이라고 예상했는데, 예상대로 시행착오도 많았고 완성까지 꽤 오랜 시간이 걸렸습니다.많은 고민과 시간을 투자한 기능이기에, 추후에 다시 웹소켓 기반 기능을 구현하게 되거나 웹소켓의 기능을 확장하는 상황에 대비해, 이 시점에서 생생한 구현 경험을 기록으로 남겨보고자 합니다. 한 번에 다 풀어내기엔 양이 많아서, 여러 편에 걸쳐 차근차근 정리할 예정입니다. 이번 글 1편에서는 본격적인 구현 설명에 앞서, 웹소켓이 어떤 방식으로 동작하며 서버와 클라이언트를 연결해주는지, 그 개념을 먼저 간단히 정리해보았습니다.HTTP와 실시간 통신일반적인 http 프로토콜..

[Jetpack Compose] 안정성 어노테이션에 대하여...

https://getstream.io/blog/jetpack-compose-stability/해당 포스트를 내 마음대로 정리한 글이다. 더 자세한 내용을 알고 싶다면 이 포스트를 읽어보자! 여러 안드로이드 프로젝트의 코드를 들여다보면서 @Stable, @Immutable과 같은 어노테이션을 많이 마주치곤 했다.하지만 그 둘의 차이점과 동작 방식을 몰라 코드를 온전히 이해할 수 없었다. 그러다 최근에 진행 중인 프로젝트에서 팀원이 안정성 어노테이션을 사용하는 것을 보았고, 이제는 제대로 짚고 넘어가야겠다 싶어 안정성과 어노테이션에 대해 알아보았다. 이 글에선 안정성 어노테이션만을 다루고자 했지만, 온전히 이해하기 위해선 Compose 안정성에 대한 이해가 바탕에 있어야 하기에 때문에 안정성에 관한 설명도 ..

[Jetpack Compose] derivedStateOf에 대하여...

[Medium] Jetpack Compose - When shoul I use derivedStateOf?해당 포스트를 내 마음대로 해석한 글이다.derivedStateOf란?derivedStateOf를 사용하면 계산에 사용된 상태 중 하나가 변경될 때마다 계산을 실행한다.하지만 계산된 값이 기존 값과 동일한 경우 컴포즈 상태 스냅샷 시스템에서 상태 변경으로 간주하지 않아 리컴포지션 이벤트를 발생시키지 않는다고 한다. derivedStateOf는 상태값이 UI보다 더 자주 업데이트돼야 하는 경우에 사용해야 한다. 왜냐하면 입력이 바뀌어 derivedStateOf가 다시 계산되더라도, 결과가 같으면 리컴포지션이 일어나지 않기 때문이다. 예시를 하나 보자. 아이디를 입력하는 TextField와 아이디가 유효..

[Jetpack Compose] CompositionLocal에 대하여...

CompositionLocal이란?Composable 트리의 최상단에서 상태를 관리하기 위해 소개된 개념 상태 호이스팅 (State Hoisting)컴포저블 함수는 트리 구조로 조직된다. 먼저 등장하는 컴포저블이 상위, 그 다음이 하위가 된다.상태를 트리의 가능한 가장 상위 노드에 선언하여 관리하는 것이 상태 호이스팅이며, 컴포즈에서 권장되는 패턴이다.특정 상태가 여러 컴포넌트에서 필요한 경우, 그 모든 컴포넌트들의 접점이 되는 상위 컴포넌트에서 관리함으로써 재사용성을 높임여러 컴포넌트들이 하나의 상태를 참조함으로써, UI의 일관성을 유지할 수 있음상태 변경 로직을 한 곳에 집중시킬 수 있음. 이를 통해 가독성을 향상시키고, 상태 변경에 따른 부수 효과(Side-Effects)도 관리하기 쉬워짐하위 컴포..

[트슛] 모듈 Extension 오류: Extension of type 'LibraryExtension` does not exist

멀티모듈 환경에서 빌드로직을 구현하고 적용하던 중 맞닥뜨린 오류다. Compose와 Kotlin에 관련된 플러그인을 마련한 후 Application 모듈에 해당 플러그인들을 적용하려는 순간 다음과 같은 오류가 발생했다. //오류 중 일부 발췌Caused by: org.gradle.api.internal.plugins.PluginApplicationException: Failed to apply plugin class 'com.boiled.calendar.buildlogic.primitive.ComposePlugin'...Caused by: org.gradle.api.UnknownDomainObjectException: Extension of type 'LibraryExtension' does not ex..

[Jetpack Compose] State Holder로 상태관리하기

컴포즈에서 UI의 상태를 관리하다보면, 상태값을 어디에서 관리해야 하는지 굉장히 헷갈린다. 상태 호이스팅을 통해 최대한 공통되는 Composable 함수로 끌어올려서 Stateful한 컴포저블을 최소화하는 건 좋지만, 이렇게 만들어진 Stateful한 컴포저블에 지나치게 많은 상태가 포함되는 일이 발생한다. 그렇다고 뷰모델에 넣기엔 UI에 대한 정보를 지나치게 많이 포함하게 된다. 뷰모델은 비즈니스 로직에 집중해야 한다. 컴포즈에선 이러한 문제를 해결하기 위해 상태 홀더(state holder) 클래스 사용을 추천한다.컴포저블에 UI 요소의 하나 또는 여러 개의 상태 필드가 사용되는 복잡한 UI 로직이 포함되어 있다면 상태 홀더 클래스로 그 책임을 위임해야 합니다. 이렇게 하면 컴포저블의 로직을 격리된 ..

[Android] 클린아키텍처 2부, 사용기

클린 아키텍처를 어떻게 사용하고 있을까?현재 수많은 안드로이드 프로젝트들이 클린 아키텍처를 도입하여 개발 중인데, 대부분은 레이어 구조를 다음과 같이 구성합니다:박스들은 클래스를 나타내고, 화살표들은 의존 관계를 나타냅니다.도메인 레이어가 최고수준 계층을 포함하고 프레젠터이션과 데이터 레이어가 인터페이스 어뎁터 및 프레임워크 계층을 포함해요. 의존 방향도 그에 맞게 설정돼 있는 것을 볼 수 있을 것입니다. 위 사진은 제가 다른 프로젝트에서 클린아키텍처를 적용했을 때 만든 패키지 구조입니다! 그럼 각각의 클래스들은 뭘 하는 것일까요? 이걸 알아야 잘 써먹을 수 있겠죠?기본적인 부분 위주로 설명해보도록 하겠습니다! 프레젠테이션 레이어클린 아키텍처 청사진으로 치면 프레임워크와 인터페이스 어댑터 층에 속한 요소..

Android 2025.03.02

[Android] 클린아키텍처 1부, 클린아키텍처란?

아키텍처란?이 세상에는 정말 다양한 시스템 아키텍처들이 존재합니다.⇒ Hexagonal Architecture, Onion Architecture, Screaming Architecture 등등… 이 아키텍처들은 디테일들이 살짝 다르지만, 계층을 분리하여 관심사 분리를 이룬다는 공통된 목표를 가지고 있죠.왜 아키텍처를 만들까요? 클린 코드와 클린 아키텍처를 만드신 Robert C. Martin a.k.a 밥 아저씨께선 이런 말씀을 하셨어요:The goal of software architecture is to minimize the human resources required to build and maintain the required system.소프트웨어 아키텍처의 목표는 시스템을 구축하고 유지하는..

Android 2025.03.02

[Android] Maven Central 라이브러리 배포기

오픈소스 라이브러리란?오픈소스 라이브러리는 소스 코드가 공개되어 누구나 자유롭게 사용, 수정, 배포할 수 있는 소프트웨어 라이브러리를 의미합니다.내가 개발한 코드를 남들이 사용할 수 있도록 배포하고, 남들이 지속적으로 유지보수 및 개선을 하며 기능을 보강하거나 확장해나갈 수 있죠.이 포스트에선 직접 구현한 안드로이드 라이브러리를 Maven Central에 배포하는 방법을 소개합니다.  Maven Central 설정 Maven CentralOfficial search by the maintainers of Maven Central Repository.central.sonatype.com 오픈소스 라이브러리를 다른 프로젝트에서 활용하기 위해서는 Maven이나 Jitpack과 같은 공용 오픈소스 저장소에 등록..

Android 2025.02.25

[Jetpack Compose] NavigationBar 탐구하기

개인 프로젝트를 진행할 땐 디자인을 신경쓰지 않다보니 안드로이드가 제공하는 NavigationBar를 사용하여 바텀바를 구성하곤 했습니다. 하지만 디자이너가 가세한 프로젝트에서, 쌤들이 열심히 만들어주신 디자인을 최대한 반영하고자 노력했어요. 그 과정에서 MaterialDesign3 디자인을 따른 NavigationBar를 탐구하게 되었고 이 글을 작성하게 되었습니다. NavigationBar가 뭔데?NavigationBar는 화면의 최하단에 위치하며, 일관적이고 편리한 화면 전환 방법을 제공하는 패턴입니다.네비게이션 사진주로 3개에서 5개의 화면 아이템을 포함하며, 이를 넘어갈 경우 5번째 화면을 더보기로 표시하는게 일반적입니다. Material Design 3 NavigationBar의 스펙구글은 안..