전체 글

Swift Concurrency - Sendable
Swift6부터 Sendable 관련 경고나 에러가 너무 많이 뜨더라구요.Concurrency도 모르고 Sendable도 모르는데..!그래서 Sendable 애플 공식문서와 swift docs를 읽고 감을 익혀보려고 합니다.먼저 애플 공식문서부터 읽어볼게요! 애플 공식문서 링크: https://developer.apple.com/documentation/swift/sendableSwift docs 링크: https://docs.swift.org/swift-book/documentation/the-swift-programming-language/concurrency/#Sendable-TypesSendable 이란?protocol Sendable 데이터 레이스 위험(a risk of data races) 없..

Swift Concurrency - Task
Swift6가 나오면서 컴파일 단계에서 동시성 문제를 강하게 잡더라구요.그래서 더 이상 Swift Concurrency 공부를 미룰 수 없겠다 싶어 차근차근 학습해보려고 합니다.오늘은 Task에 대해서 공식문서와 함께 알아볼거에요. Task 공식 문서: https://developer.apple.com/documentation/swift/taskTask 란?비동기적인 작업의 단위(A unit of asyncchronous work) 입니다.@frozen struct Task where Success : Sendable, Failure : ErrorOverview 개요작업(Task)는 생성 직후에 바로 실행될 수 있으며, 명시적으로 시작하거나 예약할 필요가 없습니다.Tasks can start runnin..

Swift Task 내에서 weak self를 붙여야 하는가
피어 세션을 진행하며 동료가 겪었던 트러블 슈팅을 공유 받았었습니다.Task 블럭 내에서의 self 캡쳐와 관련된 내용이었는데, 당시 Concurrency에 대해 잘 몰라 이해가 가지 않았고 이해하기 위해 직접 실험해보았습니다!weak self 를 하는 이유Swift에서의 이스케이핑 클로저에서 self에 접근하려고 하면 명시적으로 self를 선언하라는 컴파일 에러가 아래와 같이 발생합니다.이는 self의 프로퍼티로 할당된 클로저가 self를 캡쳐하면 클로저와 self 인스턴스 사이에 순환참조가 일어나 메모리 누수가 발생할 수 있는 경우를 방지하기 위해 Swift에서 띄워주는 컴파일 에러입니다.이러한 문제를 해결하기 위해 이스케이핑 클로저에서는 self를 약하게 캡쳐해 순환 참조를 방지하도록 합니다. Ta..

네이버 부스트캠프 웹・모바일 9기 멤버십 과정 2차 학습스프린트 회고
서론추석 연휴 동안 인터미션 기간을 보내고 5, 6, 7, 8주차를 마친 지금 회고를 해보려고 한다. 인터미션 기간은 휴식 기간이었다.해보고 싶었던 게임도 해보고(시티즈 스카이라인 재밌다..) 맛있는 것도 먹으면서 휴식도 했지만, 2차 학습스프린트를 어떻게 해야 효율적으로 사용할 수 있을지 고민할 수 있는 시간이었다. 1차 학습 스프린트에서 단방향 이벤트 흐름도 구현해보고 Tuist 없이 모듈화도 진행해보고 많은 걸 학습할 수 있었지만, 마음 한편에는 이미 어느정도 아는 것들을 다시 학습하는 기분에 찜찜함이 있었다. 그래서 2차 학습 스프린트에선 한번도 안써본 것, 잘 모르는 것들을 위주로 학습해보려고 계획했다.근데 이것도 5, 6주차에는 미션 특성 상 익숙한 것 위주로 학습했다.. 7, 8주차에서야 깨..

SwiftUI 프로젝트에서 AppDelegate, SceneDelegate 사용하기
프로젝트를 생성할 때 SwiftUI를 선택하면 기본적으로 AppDelegate와 SceneDelegate가 생성되지 않습니다. 하지만 아직까지 외부 SDK연결이나 APNs와 같이 AppDelegate가 필요한 상황이 있고,기존 UIKit 에서 SwiftUI 로 마이그레이션하는 과정에 있다면 SceneDelegate에서 SwiftUI 뷰를 UIKit ViewController로 호스팅해 보여주는게 편할 것 같습니다. 그래서 오늘은 SwiftUI로 프로젝트 생성 후, AppDelegate와 SceneDelegate를 만들기, ContentView를 SceneDelegate를 통해 띄우는 것 까지 해보겠습니다. 먼저 SwiftUI 프로젝트를 생성합니다.XCode12 까지는 프로젝트를 생성할 때 AppDeleg..

SwiftLint SPM으로 설치하기
신규 프로젝트에서 SwiftLint를 도입하기로 했습니다!예전에 SPM으로 설치해본 경험이 있지만 너무 오래되서 가물가물하더라구요.그래서 이번 기회에 정리해놓으려고 합니다. 방식이 두가지가 있습니다. 첫번째는 SwiftLintBuildToolPlugin 을 사용하는 방법입니다.하지만 이 방식은 build phase에 script를 추가하지 않는 방법이라 커스텀 룰을 적용할 수 없어보여 추천하지 않습니다. 두번째는 brew를 통해 터미널에도 SwiftLint를 설치하고, SPM을 통해 SwiftLint를 설치하는 방법입니다.이 방식은 build phase에 script를 실행하도록 해 커스텀 룰을 적용할 수 있습니다. 먼저 간단한 SwiftLintBuildToolPlugin 방식을 알아보겠습니다.Swift..

View Draw Cycle
오늘은 View Draw Cycle에 대해 정리해볼거에요.평소에 layoutSubviews와 같은 View Draw Cycle에 해당하는 메소드를 오버라이딩하여 사용하는 경우가 있었는데, 이 메소드가 언제 호출되는지도 모르고 사용하는 건 잘못되었다고 생각하여 이번 기회에 정리해보려고 합니다!틀린 내용이 있을 수 있습니다. 😂Run LoopView Draw Cycle을 알아보기 전에 먼저 런루프에 대한 사전지식이 필요합니다.하지만 아직 런루프에 대해 학습하기 전이고,오늘은 뷰 드로잉 사이클에 대해 학습해보기로 했으므로 간단하게 알아보겠습니다.런루프란?Event(Input source, timer)를 처리하는 루프 객체수행해야 하는 작업이 있을 때 thread를 일하게 하고, 작업이 없을 때 thread를..

네이버 부스트캠프 웹・모바일 9기 멤버십 과정 1차 학습스프린트 회고
제목에서 유추할 수 있듯이, 기나긴 여정 끝에 멤버십 과정을 합격했고 1차 학습스프린트(1, 2, 3, 4주차)에서 경험했던 것들을 회고해보려고 한다.멤버십 과정 합격네이버 부스트캠프 웹・모바일 9기의 진행 순서는 아래와 같이 진행된다. 1. 서류2. 1차 문제 해결력 테스트3. 베이직 과정4. 2차 문제 해결력 테스트5. 챌린지 과정6. 3차 문제 해결력 테스트7. 멤버십 과정 8. 수료! 3차 문제 해결력 테스트까지 마치고, 합격 메일과 함께 멤버십 과정에 입과했다!챌린지 회고 글에선 부정 탈까봐 적진 않았지만 챌린지 과정 자체만으로도 너무 많은 걸 배울 수 있었고 값진 경험이었다고 생각해 떨어지더라도 상처받지 않도록 마음을 비우고 있었다.그리고 "내일쯤 결과 메일이 오겠지?" 생각하고 있던 찰나 ..

왁뮤 3.0 출시 및 장애 대응 기록
2024년 9월 7일(토), 왁타버스 뮤직 3.0 출시와 함께 발생한 장애를 포함한 이벤트들을 타임라인 순으로 기록하려고 합니다. 출시 일정우선 출시 계획은 다음과 같았습니다.오후 5시: 서버에서 진입 금지 플래그 설정오후 5시 30분: 앱 배포오후 6시: PV영상 공개 & 서버 진입 금지 플래그 제거컨텐츠 유출을 막기 위해 서버에서 진입 금지 플래그를 설정해두고, 실제 앱 공개시간인 오후 6시로부터 30분 정도 여유를 두고 배포를 누르기로 했습니다.그리고 6시에 PV 영상이 공개됨과 동시에 진입 금지 플래그를 제거해 유저들을 받을 계획이었습니다. 오후 5시 배포 시작완벽한 계획과는 달리 시작부터 문제가 발생했습니다.배포 당일에 계획이 수정되었지만, 예약 출시 시간을 변경하지 않아 5시에 배포가 시작되게..

UIScene, UIWindowScene, UIWindow
iOS 13 이후 SwiftUI 발표와 함께 아이패드에서 스플릿뷰를 통해 멀티 윈도우를 지원하게 되면서,SceneDelegate, Scene 이란 개념이 생겨났다고만 알고 있었습니다.프로젝트를 할 때마다 window 와 scene에 대한 정확한 개념이 없어서 대충 이런거겠거니.. 하고 사용했었는데, 이번에 제대로 짚고 넘어가보려고 합니다.UIWindow, windowwindow 는 UIWindow의 인스턴스 입니다.window의 역할은 아래와 같습니다.앱에 표시되는(visible) contents를 포함한다.뷰 및 기타 app object에 touch event 전달하는데 중요한 역할을 한다.app의 view controller와 상호작용하여 orientation 변경(화면 회전)을 처리한다.UIKit ..

IBOutlet과 IBAction
UIKit을 처음 접할 때, 스토리보드는 구닥다리다, 협업에 불편하다 등 악평을 많이 들어 코드베이스로 입문했었습니다. 그리고 이번에 스토리보드를 사용해보게 되었고, 이번 기회에 스토리보드와 코드간의 연결통로? 역할을 해주는 IBAction 과 IBOutlet이 무엇인지 학습해보기로 했습니다.목차IB(Interface Builder)IBOutletIBActionIB(Interface Builder)IBOutlet, IBAction 둘다 앞에 IB 라는 접두사가 붙는데 이게 뭔지 궁금했습니다.IB 는 Interface Builder (인터페이스 빌더) 의 줄임말이고,인터페이스 빌더는Xcode에서 사용자 인터페이스(UI, User Interface)를 만들기 위한 그래픽 환경.The graphical env..

View(ViewController) Life Cycle
목차ViewController? UIView?View Life Cycle 이란?실제 결과 확인ViewController? UIView?iOS 앱은 하나 이상의 뷰로 구성되어 있으며, 뷰는 ViewController 위에 있습니다.그리고 ViewController에 UIView 나 UIButton 과 같은 뷰를 올리기 때문에, 대체 뷰 라이프사이클의 뷰는 뭐지? ViewController를 말하는거야? UIView 를 말하는거야? 하고 헷갈리기 쉽습니다.위 계층 구조에서 보이듯이 뷰는 뷰컨트롤러 위에 존재합니다.그리고 뷰컨트롤러는 명칭처럼 뷰를 컨트롤하기 위한 객체일 뿐, Life Cycle에서의 뷰는 ViewController의 View를 칭합니다. 🙂View Life Cycle 이란?위에서 언급했듯이..