![](http://i1.daumcdn.net/thumb/C148x148.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/bXFXZk/btsLE1rmYpc/6HfmOukGiO7lFTqR00hvaK/img.png)
2024년도가 벌써 지나갔다. 바쁘고 바쁜 현대사회를 살아가다 보니 어느덧 2025년도가 되어있었다. 2024년도는 겨울이 늦게와서 가을이 길었다. 가을의 선선한 날씨를 참 좋아하는데 이곳저곳 많이 다니지는 못했어서 좀 아쉽긴 하다. 많은 일이 있었던 24년도를 돌아보는 시간을 가지려고 한다.1. 건강해짐24년도는 다이어트의 해 라고 불러도 될것같다. 얼굴이 안좋아보인다는 얘기에 2월달에 내 인생 처음으로 헬스장을 등록해봤고, 운동을 시작했고 재미가 들렸다. 건강해지기 위해 시작한 운동이지만 근육이 붙는걸 보는것도 즐겁고 무게가 올라가는것도 재미있었다.8개월 동안 12kg 정도를 감량했고 체지방 28% 로 시작했는데 지금은 17% 유지중이다.다이어트는 끝났지만 헬스와 가끔 러닝, 풋살 등을 하면서 유..
Open API Generator 를 초기 세팅 이후 사용하면서 점차 적응해보고 있다. Open API Generator 에 미들웨어를 적용해 네트워크 레이어에 필요한 여러 기능을 사용했다.우선, 내가 필요했던 기능은 다음과 같다. - 로깅 - 엑세스 토큰 주입 - 401 에러 캐치, 리프레시 토큰 갱신 후 재시도 (retry) 주로 사용했던 Alamofire 에서는 Interceptor 와 Event Monitor 로 사용했던 기능들인데,다행스럽게도 미들웨어의 example 이 잘 되어 있고, Swift Concurrency 를 활용해 간결하게 되어 있어어렵지 않게 적용할 수 있었다. 우선 미들웨어는 결국 인터셉터다. 프로토콜로 되어있는데, public protocol ClientMiddlewar..
![](http://i1.daumcdn.net/thumb/C148x148.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/bxcFSP/btsJUWFiO2H/aId9QxwmwYgLUML1dWLbp0/img.png)
개인 앱 Easy Cue 를 개발해 출시한지도 10개월 정도가 흘렀다. Easy Cue 란?전 세계의 뮤지컬, 공연 등에서 멀티미디어 컨트롤을 위해 표준적으로 활용하는 QLAB이라는 소프트웨어가 있습니다. 공연의 감독, 프로듀서, 오퍼레이터는 미리 작성해둔 큐시트를 QLAB으로 옮겨 각 큐마다 필요한 음악, 조명, 무대효과 등을 재생시킵니다.Easy Cue는 UDP 통신 방식인 OSC 프로토콜을 활용하여 QLAB과 통신합니다. 이제 더이상 컴퓨터에 앉아서 큐를 재생하는 것이 아닌, 무선 환경에서 큐를 재생시킬 수 있습니다.간단하지만 유저 친화적인 UI를 통해 신호를 보낼 IP와 각 큐를 입력할 수 있으며, 각 큐의 이름과 메시지 옵션 등 강력한 커스터마이징 기능을 제공합니다. 작년에 1주일만에 만들어서 ..
![](http://i1.daumcdn.net/thumb/C148x148.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/Epblv/btsJpez1wUA/CBGW6mpQcY1Es26lprO2Gk/img.png)
이번 사이드 프로젝트에서 서버 개발자분들이 OpenAPI Generator 를 사용해보자고 제안해주셨다. ..그게 뭔가요 ?! OAS (Open API Specification)Restful API 를 정의하기 위한 규격 이라고 생각하면 될 것 같다. 각 요청의 엔드포인트, 인증 등등 API 명세 를 위한 규격 이다. 우리가 서버 개발자에게 받는 스웨거 가 OAS 를 기반으로 만들어진다고 하더라. OAS. 라는 규격이 있고, json 혹은 yaml 형식으로 문서가 만들어지고 스웨거가 만들어진다. 그렇다면 서버와 클라이언트에서 각각 통신하는 코드도 자동화 할 수 있겠다. 그래서 Open API Generator 가 있다. Open API Generator우리가 서버와 통신하는 코드를 만드는 것은 반복적인 ..
![](http://i1.daumcdn.net/thumb/C148x148.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/cQiVDN/btsI8FZmzOB/7ritafmkYuuyqfjlkfc0gK/img.png)
사이드 프로젝트 팀에서 신규 프로젝트 기획이 진행중이다.오랜만에 찾아온 신규 프로젝트를 위해 개발 환경 세팅을 진행했다. 사이드 프로젝트인 만큼그동안 못해봤던 기술들을 새로 적용해보고 경험해보고 싶었다. 그중 우선적으로 적용하기로 한 것은 두가지다. 1. Tuist 4 + - 그동안 사용했던 Tuist 는 3.3이였나.. 버전에 머물러 있었다. - 회사에서 사용하는 Tuist 는 메이저 버전을 올리기가 쉽지 않았다. - 4.0 에서 큰 변화가 있었다고 들었는데 아직 못해봤음. - 그러던 사이 벌써 4.29 까지 출시했음. 나 말고 모든게 빠른듯. - tuist test 도 있는데 한번 돌려보기로..2. Github Action - CI/CD로 Xcode Cloud 를 사용했었기 때문에 경험..
![](http://i1.daumcdn.net/thumb/C148x148.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/DwuaR/btsIUUi6uQ3/BVTE73WPKyKdS7kEwsvOGk/img.png)
사건의 발단회사 프로젝트에 date를 비교하여 유효한지 체크하는 로직이 있었다.간단한 로직이고 대부분 유저들에게 잘 작동했는데, 어느 한 유저만 작동하지 않는다고 문의가 들어왔다.로그를 살펴보니, 당연히 되어야 하는 date 비교 후 결과를 리턴하는 함수에서 false 를 리턴하는 것이였다. 본래 로직은 서버에서는 "yyyyMMddHHmmss" 형식으로 시작일과 종료일을 date를 내려주고 있었고,date 객체로 변환하여 현재 시점이 validate 한지 체크했었다. 모든게 정상이였다. 대부분 유저들도 잘 사용했고 내 시뮬레이터와 실기기, 테스트코드 환경에서도 잘 작동해서 실마리를 찾는게 어려웠다. 그런데 google 에 'swift dateForamtter issue' 를 검색하니 dateFormatt..
![](http://i1.daumcdn.net/thumb/C148x148.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/YwYe1/btsHqjRmmv3/PsyysKfk6e8PqDrjGhqs3K/img.png)
올해 초 회사 프로젝트에 큰 변화가 있었다. 단일타겟이였던 앱 프로젝트를 멀티모듈로 전환했다.신규 기능 개발 + 유지보수 와 함께 병행해야 했기 때문에 시간 분배가 필요했고, 약 2-3개월 정도 소요되었다. 1. 왜 멀티모듈로 전환했나요?A. 코드 관리의 측면프로젝트가 다른 슈퍼앱처럼 엄청 방대한 사이즈는 아니지만 그렇다고 아주 작은 사이즈는 아니였다.컨벤션이 없는 상태에서 많은 사람들의 손을 거쳐왔고, 네이티브로 구현된 많은 기능과 코드가 존재했다.따라서 IntelliSense(코드 자동완성) 도 느렸고 빌드도 느리고 모든게 다 느려 생산성이 떨어진다 생각이 들었다.거기에 올해 예정되어있는 많은 추가 개발 기능 건 들은 나의 마음을 답답하게 만들었다.B. SwiftUI 도입 추진SwiftUI가 출시된..
![](http://i1.daumcdn.net/thumb/C148x148.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/FI6l5/btsG6f8JmLl/p1Lze0FT60BNTtcxUJlUV0/img.png)
최근에 진행한 Weave 프로젝트를 진행하면서 Custom Alert을 구현할 기회가 있었다. UIKit에서의 Custom Alert이 아닌, SwiftUI 환경에서의 Alert은 첫 구현이라 어떨지 궁금했고, 결과적으로 UIKit보다 더욱 간편하게 구현이 가능했다.또한 어떻게 SwiftUI스럽게 구현할 수 있을지 고민해보았다. 1. 디자인 요구사항디자인 에서 요구되는 Alert은 이러한 모습이다. 위 요구사항을 다음과 같이 분석해 코드에 옮기기로 했다. 2. 뷰 구성하기public struct WeaveAlert: View { @Binding var isPresented: Bool let title: String var message: String? let prima..
![](http://i1.daumcdn.net/thumb/C148x148.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/eCKf3W/btsGOHq7A1m/ciY9DU54F78SWzIyAj3ryK/img.png)
리스트 형태의 뷰는 모바일 개발자라면 많이 만들게 되는 뷰일 것이다.기존 UIKit에서는 UITableView 로 만들게 되었는데,SwiftUI 에서도 UIKit과 메뉴를 관리하는 방식이 크게 다르지 않았다. 아래와 같이 프로필 뷰에 섹션과 메뉴가 있는 형태다. (이하 섹션, 메뉴) 이러한 구현할 때, 뷰를 일일이 나열할 수도 있지만나는 UIKit에서부터 이러한 뷰는 enum 으로 만들어 관리하는걸 좋아한다.SwiftUI에서도 enum 으로 관리했다. 1. Category & SubView(menu) Enumenum MyPageCategoryTypes: CaseIterable { case contactPoint case myPrfile case universityVerification ..
![](http://i1.daumcdn.net/thumb/C148x148.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/cc7fGj/btsGMidntah/KxeSZFLlLa0Sk2pWRxhIlK/img.png)
서비스 운영할 때는 대부분 develope, production (or Staging) 서버를 함께 운영한다. dev 에서 테스트하고 추가한 기능들을 릴리즈에 맞춰서 prod로 옮기는 방식일텐데, 서버의 URL이 달라지므로 클라이언트에서는 이 부분에 대한 처리가 필요하다. 방법은 여러가지가 있겠지만 이번에 사용한 방법은 Target을 분리하고, Schem에 따라 처리가 되도록 구현했다. 진행한 프로젝트는 Tuist를 사용했기 때문에 Tuist Manifest에서 설정을 시작한다. 1. Tuist Manifest - Build Setting public enum AppEnviroment: String { case dev case prod } public func setEnviroment(to env: Ap..
- Total
- Today
- Yesterday
- IOS
- AVFoundation
- locale
- 회고
- demical
- watchOS
- Swift
- SwiftUI
- swift날짜
- Xcode15
- keyboardtype
- Xcode
- easy cue
- openapi-generator
- 토큰
- OAS
- flo
- musicplayer
- TextField
- retry
- DateFormatter
- KVO
- watch connectivity
- open-api-generator
- 애플워치
- auth
- 애플워치 데이터 전송
- avplayer
- 2024년
- 소수점
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |