본문 바로가기

분류 전체보기

(11)
다수의 Notification channel 관리시 주의사항 안녕하세요! 이번에는 개발 중인 앱에서 다수의 Notificaion channel을 생성하여 관리할 때 겪었던 이슈와 원인, 해결 방법을 공유해보려 합니다. Notificaion Channel이란? 우선 안드로이드 O부터 나타난 Notificaion Channel이란 게 무엇인지 간단하게 알아보겠습니다. Clock앱의 환경 설정에 들어가면 알림에 대한 설정이 가능합니다. 이 앱의 경우에는 여러 가지 상황에서 Notification을 주고 있네요. 알람&타이머에 대한 Notification, 놓친 알람에 대한 Notification, 스톱워치 관련 Notification 등등 여러 가지 분류의 Notification이 존재합니다. 이 상황에서 사용자는, 자신이 원하는 분류의 알림만 받고 나머지 알림은 받지..
Live Template로 개발자 정신건강을 챙기자. 안녕하세요. 다우기술에서 안드로이드 앱을 개발하고 있는 개발세끼의 막내 "_세끼"입니다. 저는 최근에 취미삼아 플루터를 공부하고 있는데요, 플루터의 여러 장점을 떠나서 가장 와 닿았던 점이 개발자 경험이었습니다. 더 정교하고 강력해진 자동완성 기능 뿐만 아니라 Hot Reloading, 디버그 모드로 에뮬레이터의 특정 위젯을 클릭하면 해당 위젯을 구현한 코드로 자동으로 이동하는 기능 등 코틀린으로 안드로이드를 개발할 때 보다 훨씬 더 쉽고, 빠르고, 즐거웠습니다. 사용자 경험도 중요하지만, 좋은 사용자 경험을 제공하는 서비스를 만들기 위해서는 좋은 개발자 경험이 선행돼야 한다고 생각합니다. 안드로이드 스튜디오, Intelli J 에서 개발자 경험을 올려보자. 그래서 오늘은 live template라는 것..
스위프트에서 빌더 패턴 구현 두끼 전건우 UIKit을 사용해 iOS 개발을 하다보면 개발 속도 향상 등의 이유로 인해 Storyboard를 사용하지 않고 코드만으로 UI를 구성하게 되는 경우가 종종 있다. UI를 코드로 반복해서 구현하다 보면 UI Component 마다 자주 호출되는 Property가 따로 있다는 것을 알게된다. 예를 들어 UILabel을 구현할 땐 경험상 text, font, textColor, textAlignment 순으로 자주 호출한다. UILabel 객체를 Builder 패턴을 사용해 생성하는 예제를 통해 자주 사용되는 Property를 어떻게 간단히 초기화할 수 있는지 알아보자. Builder 패턴이란 여러 속성을 가진 복잡한 객체를 간결하게 생성하기 위해 사용한다. 먼저 Builder의 Protocol..
Functional Interfcae를 활용한 Resources close 패턴 안녕하세요, 임금님수라상의 첫번째 글입니다. 오늘의 주제는 함수형 인터페이스를 활용한 Resources close 패턴입니다. (라고 쓰고 후행처리 패턴이라고 하겠습니다.) File IO 처리를 하다보면 이러한 지저분한 코드를 자주 마주치게 됩니다. FileOuputStream객체를 생성하여 사용하고 난뒤, 객체사용에 필요한 자원들을 해제하여 주는 전형적인(고전적인) 코드 패턴입니다. FileOutputStream과 같은 IO관련 클래스들은 시스템자원을 활용하기 때문에 이를 해제시키기위한 close라는 추상메소드가 정의된 Closeable 인터페이스를 구현하고 있으며, 이는 객체의 사용이 끝난뒤에 자원의 사용해제를 위해 '반드시' 불려져야 하는 로직입니다.(필수는 아니더라도 대부분) 다시 정리하면, 이 ..
Custom annotation을 이용한 Signal 처리 안녕하세요 개발 세끼의 '첫끼'입니다. 서버 개발을 하다 보면, 아주 예외적인 케이스를 위해서 본인만 호출할 수 있는 api를 만들곤 합니다. 하지만,, 이런 API가 외부로 노출 되었을 경우를 생각한다면, 굉장히 큰 취약점을 스스로 노출시키는 것과 같습니다. 그렇다면, 이런 API 노출 이외에 ‘서버 데몬’과 ‘서버 운영자’간의 대화는 어떤 방식으로 이뤄질 수 있을까요? 저는 오래전에 즐겨 사용 했었던 'Signal Programming' 에서 찾아보려 합니다. java에서도 이런 os의 시그널을 처리할 수 있는 Handler를 제공해주고 있는데, 저는 불편한 Signal 처리를 Spring Framework위에서 아주 자연스럽고, Spring 스럽게 커스텀해서 쓰는 방법에..
ENUM + Funcational Interface 활용하기 안녕하세요 개발세끼의 '첫끼'입니다. 오늘은 ENUM과 함수형 인터페이스를 활용해서 복잡하고 유지보수가 어려운 코드들을 단순화시키는 방법에 대해서 포스팅해보겠습니다. 제가 오늘 만들어 볼 기능은, '1+1', '551/1' , '641-12'와 같은 단순한 계산 스트링을 입력받아서, 결과를 반환시켜주는 계산기를 만들어 볼 생각입니다. 우선, 아래와 같은 테스트 케이스가 필요하겠군요 @Test public void plusTest() throws CloneNotSupportedException { Calculator calculator = new Calculator("123 + 123"); Assert.isTrue(calculator.calculate().equals(246.0)); } @Test publ..
Android DataBinding을 살펴보자! 안녕하세요! '개발세끼'의 막내를 담당하고 있는 '세끼'라고 합니다. 이번에는 안드로이드 Data Binding에 대한 글을 적어보려 하는데요, 데이터 바인딩 사용법에 대한 글은 아닙니다. 데이터 바인딩이 무엇이고, 왜 필요하며, 어떻게 동작하는지에 대한 제 나름의 고찰과 정리 내용을 공유해보려 합니다. 데이터 바인딩이란? mvvm 패턴이 대중화가 되면서 많은 분들이 data binding 기술을 사용하고 계실것 같습니다. 그런데 데이터 바인딩이 무엇인가요? 데이터 바인딩은 xml에 자바 코드를 삽입하기 위한 기술입니다. 왜 xml에 자바 코드를 삽입하려 할까요? 그 이유를 알기 위해서는 안드로이드에 xml이 도입된 이유를 알아야 합니다. 안드로이드는 View를 xml으로 그리죠. 물론 자바 코드로 한 ..
스레드 안전한 객체 구현 스레드 안전성을 구현하는 방법은 크게 두가지가 있다. 임계영역을 제거한다. 임계영역을 참조하는 연산을 동기화한다. 이 글에서는 객체지향 프로그래밍 시에 스레드 안전성을 구현하는 방법에 대해 서술하고자 한다. 첫 번째 방법은 함수형 프로그래밍에 적합하기에 두 번째 방식을 위주로 서술한다. 객체지향 프로그래밍에서 임계영역이 발생할 가능성이 존재하는 위치는 단 두 곳밖에 존재하지 않는다. 바로 클래스 변수와 인스턴스 변수이다. 따라서 스레드 안전성을 확보하기 위해서는 이들에 직접접근을 허용하지 않고 여기에 접근하는 모든 함수, 예를 들면 게터, 세터 등에 동기화 처리를 해주어야 한다. class Cat { private let semaphore: DispatchSemaphore = .init(value: 1)..