iOS

번역) SwiftUI 간단한 뷰 레이아웃 구성하기
해당 글은 Apple 공식문서를 번역한 글로 의역이나 잘못 번역된 내용이 있을 수 있습니다.정확한 내용은 원문을 참고해주세요.https://developer.apple.com/documentation/swiftui/laying-out-a-simple-view개요뷰의 레이아웃을 만들려면, 먼저 자식 뷰들의 계층을 구성합니다. 그런 다음, 자식 뷰의 크기와 간격을 설정 파라미터와 frame, padding 같은 뷰 수정자를 통해 조정할 수 있습니다.레이아웃 구성 방식에 대해 더 알고 싶다면 스택 뷰로 레이아웃 만들기를 참고하세요. 뷰 계층 구성하기다음은 메시징 서비스에서 받은 메시지를 표시하기 위한 뷰 예시입니다.이 뷰는 HStack을 사용하여 발신자를 나타내는 뷰와 메시지 내용을 담는 뷰를 나란히 배치합니..

번역) SwiftUI 커스텀 뷰 선언하기
해당 글은 Apple 공식문서를 번역한 글로 의역이나 잘못 번역된 내용이 있을 수 있습니다.정확한 내용은 원문을 참고해주세요.https://developer.apple.com/documentation/swiftui/declaring-a-custom-view#Conform-to-the-view-protocol개요SwiftUI는 사용자 인터페이스 디자인을 선언형(declarative) 방식으로 제공합니다. 전통적인 명령형(imperative) 방식에서는 뷰를 생성하고, 배치하고, 설정하는 책임은 물론, 상태 변화에 따라 뷰를 지속적으로 업데이트하는 책임까지 컨트롤러 코드가 부담합니다. 반면, 선언형 방식에서는 UI의 원하는 레이아웃을 반영하는 뷰 계층을 선언함으로써, 사용자 인터페이스의 *간단한 설명(lig..

애플 로그인 서버부터 클라이언트까지(Swift + Nest.js + TypeScript)
iOS 앱을 개발할 때 소셜 로그인 기능을 구현한다면, 애플 로그인은 사실상 필수적인 기능입니다. 그렇기에 프로젝트를 할 때마다 애플 로그인을 구현하게 되는데, 매번 '어떻게 구현하더라' 하며 다시 찾아보는 일이 반복되곤 했습니다. “애플로부터 토큰을 발급받아 서버에 넘기면 서버가 알아서 로그인 또는 회원가입 처리를 진행하고, 그 후 액세스 토큰과 리프레시 토큰을 넘겨 받는다” 정도로만 기억하고 있었고, 로그인 플로우에 대한 명확한 이해가 부족해 발생하는 문제였습니다. 마침 클라이언트부터 백엔드까지 직접 구현해볼 수 있는 기회가 생겼고, 이번 기회에 로그인 플로우를 제대로 정리해야겠다고 생각해 iOS 클라이언트 코드와 서버 로직까지 모두 작성해보았습니다.iOS 클라이언트는 Swift 로, 서버 코드는 N..

CoreData 개요 및 동시성
CoreData란?CoreData는 Apple에서 제공하는 객체 그래프(Object Graph) 및 영속성(Persistence) 관리 프레임워크입니다.SQLite를 기반으로 로컬 데이터베이스로도 사용할 수 있지만, 단순히 데이터베이스 기능뿐만 아니라 객체 간의 관계 관리, 상태 추적, 변경 감지, iCould 연동, Undo/Redo, Lazy Loading 등 다양한 기능을 제공합니다.객체 그래프란?객체 그래프란 참조를 통해 서로 연결되어 있는 객체들의 구조를 말합니다.아래 코드 예시를 보면 Person과 Dog는 서로 참조를 가지고 있고, 이를 도식화하면 그래프 형태로 나타낼 수 있습니다.CoreData는 이 객체들 사이의 관계를 정의하고, 이를 저장소에 관계형 데이터처럼 변환하여 저장합니다.cla..

Alamofire 기능 정리
Alamofire는 Swift 기반 HTTP 네트워킹 라이브러리로 URLSession을 래핑하여 네트워킹 코드를 쉽고 가독성 좋게 사용할 수 있는 다양한 기능들을 제공합니다.URLSession 기반 코드의 문제점기본적으로 Foundation에서 제공하는 URLSession을 직접 사용할 경우 다음과 같은 단점들이 존재했습니다.요청(Request)을 구성하는 코드가 장황하며, 가독성이 떨어짐반복되는 코드가 발생함(ex: 헤더 설정, 에러 핸들링, JSON 디코딩 등)네트워크 요청을 디버깅하거나 로그를 남기려면 기존 코드에 많은 수정이 필요아래 예시 코드는 HTTP 요청을 통해 User 정보를 가져오는 간단한 예시입니다.단순한 GET 요청임에도 불구하고, 에러 처리, 디코딩 등 코드가 복잡해집니다.guard..

테스트 가능한 오디오 관리 객체 설계하기
문제소리가 정상적으로 입, 출력되는지 테스트하기 위해선 오디오 인터페이스부터 기타까지 실제로 연결해야만 테스트 할 수 있는 환경이었고, 그 결과 비효율적인 작업이 반복되었습니다.원인 분석AudioManager가 너무 많은 역할을 하다보니 필연적으로 코드가 길어지게 되었습니다.mark 주석으로 역할을 구분해두었지만 함수 내에서 다른 함수를 호출할 수 있어 사이드 이펙트 발생 위험이 존재했습니다.또한 실제 장치를 연결하지 않고 테스트할 수 없는 환경이었습니다.final class AudioManager { static let shared = AudioManager() private var cancellables = Set() // 사용 가능한 입력 장치 목록 var availableIn..