전체 글

WWDC25 - FoundationModels로 엿본 애플이 꿈꾸는 개인화 AI의 미래
올해 WWDC25에서 가장 궁금하던 부분은 "애플은 AI에 어떻게 대응할까?" 였습니다.ChatGPT나 Gemini처럼 클라우드 기반 LLM이 각광받는 시대에 개인정보 보호와 기기간 통합을 중시하는 애플이 어떻게 대응할지 궁금했는데요. 바로 이번에 발표된 FoundationModels을 통해 애플의 스탠스를 확인할 수 있었습니다. 이대로라면 골든 타임을 놓칠 수 있겠다고 생각한 것인지, Apple Inteligence 출시 전에 개발자들로 하여금 먼저 온디바이스 AI 모델을 사용하여 개발할 수 있도록 'FoundationModels' 이란 프레임워크를 공개했습니다. 이 프레임워크는 iOS, iPadOS, macOS, visionOS를 포함하는 Apple 전 플랫폼에서 온디바이스 언어 모델을 활용할 수 있..

iOS Hang, Hitch 그리고 Render Loop
앱이 멈추거나 끊기는 이유는 크게 2가지로 나뉩니다.Hang(앱이 반응하지 않는 문제)과 Hitch(스크롤이 버벅이는 프레임 드롭 문제)두 용어에 대해 혼동할 때가 많았는데, 이를 정리하고 어떻게 개선할 수 있을지 알아보려고 합니다.Hang과 Hitch 구분Hang: 메인 스레드의 멈춤 현상앱 전체가 멈추고 터치 등 사용자 입력에 전혀 반응하지 않는 현상으로, 메인 스레드 내 작업이 너무 많을 경우 발생합니다.Hang은 2가지 시나리오로 발생할 수 있는데, 메인스레드가 너무 많은 작업을 수행하는 경우와 단일 긴 작업으로 인해 블로킹되는 경우입니다.예를 들어 화면에 보여지는 이미지는 4개지만, 전체 이미지를 준비하려고 할 경우 아래와 같이 메인스레드가 불필요하게 너무 많은 작업을 수행하게 되고 Hang으로..

의존성 역전을 통한 독립적인 네트워크 모듈 설계하기
최근 프로젝트를 진행하며 독립적인 네트워크 모듈을 직접 설계하며, 아래와 같은 목표를 세웠습니다.네트워크 관련 서드파티 라이브러리는 네트워크 모듈 내에서만 알도록 할 것모듈 외부에선 NetworkService만 알도록 할 것토큰 리프레쉬 로직과 같이 인증 관련 세부 구현은 숨길 것이를 위해 NetworkService 내부에서 Alamofire의 AuthenticationInterceptor 를 활용하여 인증을 처리하고 있었습니다.이렇게 설계하면 사용하는 쪽에선 인증 로직을 신경쓰지 않아도 되게 됩니다.401 인증 에러 응답을 받으면 Alamofire가 Authenticator.refresh() 를 호출하고, 토큰을 갱신한 뒤 자동으로 요청을 재시도하니까요. 그런데 한가지 문제가 발생했습니다. 의존성 문제..

Demystify SwiftUI - Identify: SwiftUI는 뷰를 어떻게 구분할까?
SwiftUI는 뷰를 어떻게 구분할까?SwiftUI는 정체성(Identity)을 통해 뷰를 구분합니다.UIView, NSView를 클래스로 모델링한 UIKit, AppKit과 달리 SwiftUI에선 View를 Struct로 취급하기 때문에 View를 식별하기 위해선 별도의 ID가 필요합니다.정체성은 명시적 정체성, 구조적 정체성 두가지 방식으로 표현될 수 있으며, 명시적 정체성을 부여하지 않더라도 뷰 계층 구조를 활용해 뷰에 암시적인 ID를 부여합니다.명시적 정체성 (Explicit Identity)개발자가 ID 나 Identifiable 프로토콜을 사용하여 뷰나 데이터에 직접 고유한 식별자를 제공하는 방식입니다. ForEach와 같은 데이터 기반 컴포넌트에서 특히 중요하며, SwiftUI가 컬렉션의 항..

번역) 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..

Socket vs WebSocket
소켓(Socket)이란?소켓(Socket) 은 네트워크를 경유하는 프로세스 간 통신의 종착점.OSI 7계층 중 응용 계층에 속하는 프로세스들은 데이터 송수신을 위해 반드시 소켓을 거쳐 전송 계층으로 데이터를 전달해야한다.즉, 소켓은 전송 계층과 응용 프로그램 사이의 인터페이스 역할을 하며 떨어져 있는 두 호스트를 연결해준다.소켓은 아래의 요소들을 담고 있는 하나의 파일인 것이다.프로토콜상대와 자신의 IP 주소Port 번호통신 동작 진행 상태소켓에 담기는 정보 심화편+ with GPT더보기✅ 소켓(Socket)의 기본 구성 정보소켓은 단순한 ‘연결’이 아니라, 네트워크 통신을 위한 컨텍스트(Context)입니다.즉, 소켓을 생성하면 다음과 같은 중요한 정보들이 내부에 저장됩니다:정보항목설명IP 주소로컬 I..

HTTP 개요 및 HTTP 버전별 차이
HTTP란?HTTP(HyperText Transfer Protocol)는 클라이언트와 서버 간에 의미 있는 요청과 응답을 주고받기 위한 텍스트 기반 통신 프로토콜입니다.'의미 있는' 이란?HTTP는 단순히 데이터를 주고받는 수준을 넘어서, 요청과 응답의 목적과 맥락을 헤더(Header)를 통해 설명할 수 있습니다.예를 들어, GET, POST와 같이 요청의 종류를 설명하고, User-Agent를 통해 누가 보냈는지를 설명하며 Content-Type을 통해 데이터의 형식이 무엇인지를 설명할 수 있습니다.전송 방식HTTP는 어플리케이션 계층의 프로토콜로 신뢰가능한 전송 계층 프로토콜(TCP) 위에서 동작합니다. 보안이 강화된 버전인 HTTPS(HTTP over TLS)는 TLS(SSL)를 통해 데이터를 암호..

애플 로그인 서버부터 클라이언트까지(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..

AWS EC2 npm run build 시 멈추는 문제
개인 프로젝트 서버를 AWS EC2 인스턴스에 배포하는 과정에서, 서버가 중간에 멈추는 문제를 마주했습니다.제가 사용 중인 인스턴스는 t2.micro 로, 즉 프리티어에서 제공되는 최소 사양 인스턴스였습니다.vCPU: 1개RAM: 1GB서버를 실행했을 때 반응이 없어 AWS 대시보드에서 확인해보니, CPU 사용량이 100%에 가까운 상태로 장시간 유지됨을 확인할 수 있었습니다. 또한 인스턴스에 접속해 top 명령어로 리소스 사용량을 확인한 결과, DB 서버(mysqld)가 메모리의 40% 이상을 점유하고 있는 상황으로 가용 메모리가 약 150MB 밖에 되지 않는 상황이었습니다. 이러한 리소스 부족으로 인해 Nest.js 서버를 실행하는 명령어인 npm run start 나, npm run build 시 ..

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