👨💻 프로그래밍 99 Gradle 기반 프로젝트에 Ktlint 적용하기 Gradle 기반 프로젝트에 Ktlint 적용하기 Ktlint란?Kotlint에서 코딩 스타일을 자동으로 통일시켜 주는 도구 컴퓨터는 똑같이 인식해도, 사람마다 여러 코딩 스타일이 다를 수 있습니다. 대표적으로는 대괄호가 있습니다.# 1번째 스타일fun main(){ println("Hello World!")}# 2번째 스타일fun main() { println("Hello World!")} 1~2명이서 작업한다면 이런 스타일의 차이가 크게 상관없지만 여러 명이서 작업하면 큰 문제가 됩니다. 이건 여러 이유가 있는데요. 제가 느낀 이유 3가지는...누가 작성했느냐에 따라 스타일이 너무 다르면 일관성이 떨어져 코드 읽기가 힘들어짐같은 부분을 수정하면 Git에서 Conflict이 나서 이걸 해소하느라 불필요한 시간을 소모하게 됨내가 작성한 코드라.. 2025. 2. 15. @FunctionalInterface란? @FunctionalInterface란? 어떤 때 쓰는 걸까?interface인데 Abstract Method가 딱 1개 있는 경우 Abstract Method가 1개인게 왜 중요할까요? Abstract Method가 1개이면 interface를 구현하는 class를 직접 만들지 않고 여러 간결한 문법들을 써서 변수에 interface를 구현하는 값을 바로 할당할 수 있기 때문입니다. 예를 들면...Lambda 식Method Reference 실제로 유용한 예시는 아니지만 String을 조작하기 위해 interface를 만든다고 해 보겠습니다.@FunctionalInterfaceinterface StringTransformer { String transform(String input);}🐜 Lambda 식@FunctionalInterfa.. 2025. 1. 30. (Spring 위주로) AOP 용어 정리 (Spring 위주로) AOP 용어 정리 AOP란?코딩을 하다 보면 공통적으로 해야 하는 작업들이 있습니다. 대표적으로 로깅 (Logging)입니다. 프로그램에 문제가 생겼을 때 문제를 찾게 해 주는 단서가 로깅입니다. 그래서 당연히 중요한 것들을 최대한 자세히, 많이 남기는 게 좋습니다.처음 요청이 시작할 때가 몇 시 몇 분이고 어떤 Payload가 담겨져서 왔는지,중간중간 어떤 함수들을 호출했는지,끝날 때는 몇 시 몇 분이고, 어떤 Response가 나갔는지등등 다양합니다. 문제는 로깅 프레임워크나 라이브러리를 만들지 않는 이상 로깅은 애플리케이션의 핵심 기능이 전혀 아니라는 겁니다. 하지만 꼭 중요하고 필요한 것이기 때문에 빼먹을 수는 없습니다. 이걸 수기로 하게 되면 문제가 2가지 있습니다.코드에 핵심 기능이 아닌 여러 부수 기능들을 위.. 2025. 1. 26. MDC로 풍부한 로그 쉽게 남기기 MDC로 풍부한 로그 쉽게 남기기 기존 로깅의 문제점로깅 (Logging)은 문제가 발생했을 때 원인을 찾아내고 해결하기 위해 애플리케이션 곳곳에 남기는 정보들입니다. 당연히 이 정보들은 많으면 많을수록 좋습니다. 일반적으로 로그에 남기면 좋은 정보들은 다음과 같은데요.HTTP 요청 1개 1개를 구별할 수 있는 고유한 값(MSA 환경인 경우) 여러 MS 같의 요청을 묶을 수 있는 값(유저가 시작한 요청인 경우) 그 유저의 고유 값 (PK 등)요청 시작 시간애플리케이션의 버전개발 환경 (Live, Dev, Staging 등)이건 극히 일부의 정보들을 나열한 것 뿐입니다. 문제는 이걸 수기로 남기게 되면 많은 문제들이 있습니다. 일단 로그를 남길 때마다 저 정보를 다 포함해야 한다면... 얼마나 짜증 날지 상상이 되시나요?private va.. 2025. 1. 12. 사이드 프로젝트 장애 회고 사이드 프로젝트 장애 회고 발단...틈틈이 주말마다 제가 출시한 앱들을 업데이트하고 있는데요. 어느 때와 다름없이 주말에 업데이트를 하고 편하게 쉬고 있었습니다. 그런데 다음날 이런 메일이 왔습니다.그리고 앱에 들어가서 확인해 보니 정말로 그랬습니다! 🥲 💀프로그래밍적 원인원인은 의외로 간단했습니다. 제가 새로 추가한 기능이 이미 추가된 구독을 UI에 표시해 주는 기능이었는데요.그런데 추가됨을 판단하는 로직이 생각보다 복잡해서 (미리 이 기능을 고려해서 데이터에 추가하지 않았기 때문에) 이걸 Main Thread에서 돌리니 앱의 반응성이 너무 느려진다는 것이었습니다. 속도를 개선하기 위해서 여러 가지를 시도해 봤습니다.Lazy 하게 하기도 하고UserDefaults에 저장해서 Cache를 쓰기도 하고계산 결과를 UI 진입 전에.. 2024. 12. 30. Chrome Extension 개발하기 Chrome Extension 개발하기 Google Chrome Extension의 구조Google Chrome Extension의 구조는 엄청 간단합니다. 사실 Google Chrome Extension은 크게 3가지 기능 밖에 안 하는 간단한 프로그램입니다.웹 사이트의 HTML, CSS, JS를 조작사용자의 크롬을 조작 (탭, 테마 등)Extension을 클릭했을 때 나오는 UI 제공이 3가지는 모두 HTML, CSS, JS와 Chrome에서 제공해 주는 간단한 API들을 사용하면 개발할 수 있습니다. 그래서 manifest.json에 이 각각의 것들을 어떤 파일이 하는지 명시해 주고, 필요한 API들을 명시해 주면 끝납니다.아래는 제가 개발한 간단한 Chrome Extension의 manifest.json입니다.name, descript.. 2024. 12. 21. 🍎 SwiftUI에서 Local Notification URL 처리하기 🍎 SwiftUI에서 Local Notification URL 처리하기 뭐 하려는 거야?APN을 통해 서버로 알림을 보내는 게 아닌, Local에서 UNNotificationCenter를 써서 알림을 보낼 수 있습니다. 이 경우 알림을 등록하는 시점에 이 알림이 언제 가야 하는지를 미리 알아야 하는 단점이 있긴 하지만 라마인더나 타이머 같은 앱들은 알림을 보내고자 하는 시점에 언제 알림을 보낼지 다 알 수 있기 때문에 Local Notification을 사용합니다. 1번째 사진와 같이 알림이 와서 클릭하면 기본적인 동작은 2번째 사진처럼 앱의 메인 화면에 가는 겁니다. 하지만 3번째 사진처럼 원하는 특정 화면에 가고 싶다면 어떻게 해야 할까요?전체적인 그림일단 이 기능은 SwiftUI에서 자체적으로 지원하지 않습니다. 그래서 UIKit을 끌고 와야 하는데요.이를 위해 UN.. 2024. 12. 7. ☁️ AWS에서 무중단 배포 구현하기 ☁️ AWS에서 무중단 배포 구현하기 목표Cloud의 편리함은 최대한 누리면서 AWS에는 종속되지 않게무중단 배포를 구현한다 사실 무중단 배포를 구현하는 거 자체는 간단합니다. 새로운 버전의 서버를 미리 띄워 두고, Health Check를 해서 괜찮으면 트래픽을 전환한다... 하지만 이걸 구현하기 위해 내려야 할 여러 기술적인 결정은 단순하지 않습니다.오늘은 진작에 접었어야 했지만 접지 못 해 계속 하고 있는 제 포트폴리오 사이트 책잇아웃의 무중단 배포를 AWS와 Github Actions로 구현하는 과정에서 했던 여러 기술적인 결정들과 배운 것들을 기록해 보겠습니다.현재상황 (시작점)🐜 AWS 구조현재 상황은 ELB (Elastic Load Balancing)가 가장 앞단에 있어 트래픽을 받는 구조입니다. ELB에는 Public IP .. 2024. 11. 22. 🥒 피클 (PKL): 새로운 설정 관리 언어 알아보기 🥒 피클 (PKL): 새로운 설정 관리 언어 알아보기 설정 파일?프로그래밍을 하다 보면 여러 설정 값들을 다뤄야 합니다. 서버라면 어떤 포트에 띄울지, API 통신을 한다면 API Key 값, DB의 아이디/비밀번호까지... 이런 값들은 코드에 하드코딩을 해 놔도 되지만 여러 이유로 따로 설정 파일을 둬서 관리합니다.프로그램이 실행되는 환경에 따라 값을 다르게 하기 위해 (개발 환경, 운영 환경 등)코드가 공개된 경우 보안을 위해 민감한 값을 실행 시점에 주입받기 위해코드 수정 없이 설정 값만 빠르게 바꾸기 위해 이런 설정 파일을 위해 보통은 .yml, .properties, .json 이나 아니면 언어별로 특화된 DSL을 각자 만들어 씁니다. 자바 진영에서는 gradle 설정을 위해 Groovy나 Kotlin의 DSL을 사용합니다.하지만... 이런 설정 .. 2024. 11. 2. 🍎 Tipkit을 사용해서 앱의 숨겨진 기능을 유저에게 넛지 주기 🍎 Tipkit을 사용해서 앱의 숨겨진 기능을 유저에게 넛지 주기 TipKit이 뭐고 꼭 필요할까?iOS 17부터 사용 가능한 앱을 쓰면서 새로운 기능, 숨겨진 기능, 꿀팁들을 슬쩍 알려주는 UI를 띄워주는 Framework입니다.아래와 같이 리스트를 꾹 눌러서 순서를 조정할 수 있는 건 보통 알기 힘든 경우가 많기 때문에 슬쩍 알려주는 형식입니다.물론 이걸 직접 구현할 수도 있습니다. Tooltip 정도는 간단한 UI이니 공수도 그렇게 많이 들지 않겠죠? 하지만 Tipkit에서는 저 Tip 언제 어떤 조건으로 보여줘야 하는지, 너무 많은 팁이 노출되면 유저가 피로하니 너무 많이 노출되지 않게 조절하는 등의 편리한 추가 기능이 있어서 굳이 안 쓸 이유는 없습니다.너무 과하게 쓰면 안 됨! 😵애플의 Human Interface Guideline을 보면 Tipkit의 역.. 2024. 9. 23. 🍎 Stanford iOS 강의 (CS193P) 수강 후기 🍎 Stanford iOS 강의 (CS193P) 수강 후기 이게 뭐야?말 그대로 미국의 1류 대학인 스텐포드 대학에서 제공하는 강의입니다. 스텐포드 대학은 실리콘 벨리 근처에 있는데, 그래서 그런지 컴퓨터 과학 학과가 특히 유명합니다. 오죽하면 애플에서는 신입이 스텐포드 출신이 아니면 이력서에서 거른다는 소문이 있을 정도입니다. (사실은 아니겠지만...) 스텐포드 뿐만 아니라 많은 미국 대학이 강의를 공짜로 공개해 놓는데, 코로나 시국을 거치면서 특히 더 활발해 졌습니다. 하지만 인터넷에 공개된 모든 대학 강의가 수강할 가치가 있지는 않습니다. 꼭 내용만을 말하는건 아닌데요. 저는 아래 조건중에 1개라도 해당되면 듣지 않습니다.오디오, 카메라 품질이 좋지 않음강의 자료가 많이 제공되지 않음제 경험상 일류 대학들의 강의는 어렵기 때문에 많은 시간을 들여 수강해야 .. 2024. 9. 14. 내가 Python을 싫어하는 이유 내가 Python을 싫어하는 이유 Python과 관련된 경험서버 개발자로 취업하기 전에는 인공지능 관련 분야로 취업하려 해서 Numpy, Matplotlib, Keras, Tensorflow 같은 Pyhton Library를 사용해 모델링을 했습니다.Django로 간단한 CRUD 웹 개발을 해 봤습니다.싫은 이유 1 - Indentation으로 Scope 구분이건 순전히 개인 취향입니다. 하지만 첫 프로그래밍 언어로 Swift, 다음 언어로 Java를 배운 사람 입장에서는 C 언어에서 유래된 중괄호 ({})로 Scope를 구분하는 문법이 너무 익숙해 져서 Python의 Indentation으로 구분하는 방식이 굉장히 보기 힘들고 자유도가 떨어지는 느낌이 듭니다.예를 들어 여러 겹의 if나 for 문을 중첩해서 쓸 때 Python은 In.. 2024. 9. 5. 🍎 Swift의 mutating 알아보기 (feat. Cannot assign to property: 'self' is immutable) 🍎 Swift의 mutating 알아보기 (feat. Cannot assign to property: 'self' is immutable) Swift에서 structSwift에는 class와 struct으로 객체를 표현합니다. struct은 SwiftUI의 기본이 되기도 하고, 현대 프로그래밍의 개념들에 영향을 많이 받은 단위입니다. 현대 프로그래밍의 개념들이라 하면 흔히 아래와 같은 특징들을 말합니다.최대한 변하지 않게 한다유용한 문법 설탕을 많이 제공한다명시적이다 struct도 비슷하게 value type이라 주고받을 때 새로운 값을 만들고,Computed Property로 개념상으로는 property인데 내부적인 계산을 해야 하는 값을 property처럼 다룰 수 있게 하고,내부 property를 변화시키는 건 명시적으로 mutating을 붙이도록 돼 있습니다. 여기서 3번째 mutating에 대해 자세히 알아 보겠습니다!struct은.. 2024. 9. 1. 다양한 배포 전략 비교 (카나리, 블루그린, 롤링, 그림자) 다양한 배포 전략 비교 (카나리, 블루그린, 롤링, 그림자) 배포에서 중요한 것유저에게 배포가 나갔는지도 모르게 하는 것 규모가 작거나 복잡하지 않은 환경에서는 배포에 대해 크게 신경 쓸 필요가 없습니다. 오히려 그 시간에 MAU를 늘릴 생각을 하는게 더 이득일 지도 모릅니다. 하지만 시스템의 구성요소가 많고 (카프카, 배치 등) 잠깐의 중단도 비즈니스에 악영향을 주는 환경에서는 배포 자체에 많은 리소스를 쓰게 됩니다. 🐜 무중단불과 몇 년 전만 해도 새벽 시간에 점검을 한다고 하고 배포하는 일도 흔했습니다. 하지만 최근에는 어떤 서비스를 쓰든 배포를 한다고 점검을 걸고 서비스를 중단하는 일이 매우 적어졌습니다. 배포의 중요한 소양이 무중단이기 때문입니다. 말 그대로 서비스를 1초도 중단하지 않고 새로운 버전을 내야 합니다.🐜 쉬운 롤백이상적으로는 모든 배포는.. 2024. 8. 24. B2B vs B2C, 개발자 입장에서 비교해 보기 B2B vs B2C, 개발자 입장에서 비교해 보기 B2B? B2C?회사가 제품을 다른 회사에게 파는지, 대중에게 파는지 먼저 B2B와 B2C에 대해서 간단히 짚고 넘어가겠습니다!B2B는 Business to Business, B2C는 Business to Consumer를 각각 줄인 말 입니다. 여기서 to가 2와 발음이 똑같기 때문에 저렇게 줄여서 씁니다.우리가 살면서 고객으로서 접하는 대부분의 제품은 B2C 제품입니다. 삼성이 만드는 TV, 애플이 만드는 스마트폰... 그래서 특별히 의식하지 않을 수 있지만 우리만 물건을 사는게 아닙니다. 회사도 다른 회사의 제품을 삽니다. 아무리 큰 대기업이라고 해도 회사 운영에 필요한 모든 걸 다 할 수는 없기 때문입니다.사내 메신저만 해도 그렇습니다. 물론 직접 만들 수 있지만 대부분 슬랙 (Slack) 같은 .. 2024. 8. 23. 🍎 Swift Testing: 보기 싫은 XCTest는 이제 안녕!! 🍎 Swift Testing: 보기 싫은 XCTest는 이제 안녕!! Swift Testing이 뭐야?애플이 Object-C를 대체할 Swift를 발표한 이후로 Swift 언어의 기능을 적극 활용하는 새로운 API들을 출시하고 있습니다. SwiftUI나 SwiftData는 기존의 UIKit이나 CoreData에 비하면 쓰기가 매우 편하고 깔끔해서 확실하게 생산성이 올라갔습니다.Swift Testing도 비슷하게 XCTest를 대체하기 위한 Swift에 최적화된 API입니다.하지만 솔직히 SwiftUI나 Swift Data 정도로 다르지는 않고 그냥 더 깔끔하고 빠르다 정도이긴 하지만, 그래도 XCTest 보다는 나으니 사용했습니다. Swift Testing | Apple Developer DocumentationCreate and run tests for your Swif.. 2024. 8. 15. Kotlin의 @JvmStatic 알아보기 Kotlin의 @JvmStatic 알아보기 사용법과 효과평상시에는 @JvmStatic을 신경 쓸 필요가 전혀 없습니다. 하지만 Java와 Kotlin을 같이 써야 한다면 Kotlin이 어떤 식으로 컴파일되는지 알아야 하고, Java와 다른 점이 있다면 보정해 줘야 합니다. @JvmStatic은 Kotlin의 companion object와 object를 보정해 주기 위한 annotation입니다.공식 문서를 보면 자세히 나와 있는데요. Calling Kotlin from Java | Kotlin kotlinlang.org 아래의 Kotlin 코드를 자바에서 호출한다고 하면...class ExampleClass { companion object { fun exampleFunction() {} }} 아래와 같이 해야만 동작합니.. 2024. 8. 12. 🍎 Swift Package에서 Localization 처리하기 🍎 Swift Package에서 Localization 처리하기 뭘 하려는 걸까?🐜 Package란?여러 개의 iOS 프로젝트를 하다 보면 공통으로 쓰게 되는 코드들이 많아지게 됩니다.예를 들어 저의 경우는 숫자를 입력할 때 실시간으로 ,를 넣어주는 TextField가 필요해서 만든 적이 있는데, 이건 사실 도메인에 상관없이 공통적으로 필요한 기능입니다. 그래서 SwiftUI 자체적으로 있으면 좋겠지만... 아쉽게도 직접 만들어서 써야 합니다. 🍎 SwiftUI에서 숫자 입력하면 실시간으로 구분자(,) 붙이기하려는 것숫자가 길어지면 읽기가 힘듭니다.1000000000와 1,000,000,000가 있다면 전자는 일십백천만... 하면서 1개씩 세야 겠지만 숫자를 자주 다루신 분들이면 후자가 10억이라는걸 바로 알 수 있습니jinkpark.tistory.com물론 직.. 2024. 8. 10. 🍎 나만의 Swift Package 만들기! - 개인 프로젝트에서 중복되는 코드 없애기 🍎 나만의 Swift Package 만들기! - 개인 프로젝트에서 중복되는 코드 없애기 Swift Package가 뭐고 이게 왜 우리 프로젝트에 필요할까코딩을 하다보면 중복되는 코드가 나옵니다. 이럴 경우 일반적으로 함수나 클래스로 나눠서 관심사를 분리하고 중복을 줄입니다. 하지만 문제는 중복되는 코드가 프로젝트 단위로 나올 때 발생합니다. 분명 중복되는 코드인데, 다른 프로젝트니 import 할 수 없고, 결국 복붙을 하게 됩니다. 이 경우 문제가 여러가지 있습니다.당연히 중복되는 코드의 문제가 해결되지 않는다.변경점이 있으면 프로젝트 별로 적용해 줘야 한다.같은 역할을 하는데 미묘하게 변수나 사용법이 다른 경우가 있어 헷갈린다.사실 프로젝트나 1개~2개 정도면 괜찮지만 10개, 20개, 심지어 100개가 된다면? 상상하기도 싫습니다. 제 현재 상황은 앱스토어에 출시 해 판매중인 앱이 2.. 2024. 8. 8. 🍎 Swift UI에서 홈 화면 Context Menu 추가하기 🍎 Swift UI에서 홈 화면 Context Menu 추가하기 하려는 것iOS에서는 앱 아이콘을 길게 누르면 앱 내에서 자주 쓰는 동작들을 바로 실행할 수 있는 기능이 있습니다. 아래 사진은 토스의 Context Menu인데요, 토스에서 가장 자주 쓰는 기능인 소비, 송금, 주식, 만보기 등이 있습니다. 당연하지만 위의 Context Menu는 단축키 일 뿐이라 Context Menu의 존재를 전혀 몰라도 앱을 문제 없이 사용할 수 있습니다. 실제로 애플의 Human Interface Guideline에서도 Context Menu를 앱을 자주 사용하는 헤비 유저들이 편하게 사용하는 기능이 될 수는 있어도 똑같은 동작을 앱에서도 제공할 것을 권고하고 있습니다. 😅 Although a context menu provides convenient access to fre.. 2024. 8. 5. 영어권에서 자주 쓰는 프로그래밍 신조어 소개 (feat. Programming Slag) 영어권에서 자주 쓰는 프로그래밍 신조어 소개 (feat. Programming Slag) 프로그래밍 신조어 (Programming Slang)? 저는 영어권 프로그래밍 유튜버나 커뮤니티를 자주 보는 편 입니다.이곳을 눈팅 하다 보면 공식 문서나 책에서는 보기 힘든 재밌는 표현이나 과격한 표현이 많은데요.오늘은 재미 삼아, 또 영어권 프로그래밍 유튜버나 커뮤니티를 보시게 된다면 도움이 될 표현들을 몇 가지 소개하겠습니다.제가 느끼기에 자주 쓰이는거나 재밌는 표현 위주로 소개했습니다!한국에서도 많이 알려진 표현한국에 많이 알려진 표현은 이제 이게 신조어가 맞는지 헷갈릴 정도로 자주 쓰이는 표현이 대부분입니다. 하지만 프로그래밍을 잘 모르시는 분들에게는 여전히 이상한 표현처럼 들릴 수 있어 포함 해 봤습니다. 이 표현들을 보면 제가 신조어라 말하는게 어떤 의미인지 감이 잡히실 겁니다! 🐜 Cod.. 2024. 8. 4. 이전 1 2 3 4 5 다음 반응형