본문 바로가기

전체 글198

WWDC24: Demystify explicitly built modules 정확한 내용은 원문 참고 바랍니다. 명시적으로 빌드된 모듈 쉽게 이해하기원문소개Xcode에서 Swift와 Clang 모듈이 구축되는 새로운 방식인 명시적으로 빌드된 모듈에 대한 소개포함 내용모듈이란 무엇인지모듈을 사용하여 코드를 구축하는 방법새로운 Xcode의 차이점이미 구축된 모듈을 최대한 재사용하여 빌드를 최적화하는 방법  모듈기본적으로 모듈은 코드 배포의 단위이며 라이브러리나 프레임워크의 인터페이스를 설명한다.Swift Target에는 모듈을 구성하는 여러 Swift 파일이 포함된다.일반적으로 단일 타겟이나 프레임워크의 모든 Swift 소스 파일은 동일한 모듈에 포함된다.모듈의 인터페이스는 Swift에 액세스 지정자로 명시적으로 표시된다.클래스와 해당 변수가 public으로 표시되어 importer.. 2024. 9. 6.
뿌대식: 네트워크 관련 개선 네트워크 분석 글에서 언급했듯 이번 리팩토링에서는 아래 두 가지를 개선했습니다.네트워크 호출 로직네트워크 요청 속도 개선  네트워크 호출 로직 관련개선 전 뿌대식의 네트워크 호출은 DB가 백업 중인지 검사 후, 학생 식당 혹은 기숙사 DB 데이터를 불러옵니다.네트워크 체이닝 때문에 arrowHead 코드가 생기고, 캠퍼스 전환 시 네트워크 호출이 중첩되는 문제가 있었습니다.  arrowHead 코드 문제네트워크 호출 관련 코드는 긴 편인데, 데이터베이스 백업을 검사와 식당 데이터가 다른 모델을 사용해 중복되는 코드가 존재했습니다.   네트워크 호출 중첩 문제네트워크 호출이 중첩되면, 쌓인 네트워크 호출이 완료될 때마다 현재 식당이 호출 횟수만큼 증가하는 이슈가 있었습니다. (캠퍼스 탭을 전환하는 만큼 쌓.. 2024. 8. 23.
Swift: Managing user interface state Managing user interface state, 원문 뷰를 재사용할 수 있도록 앱의 뷰 계층 구조 내에서 뷰 별 데이터를 캡슐화뷰 전반에 걸쳐 공유되는 진실 소스를 확립하기 위해서 데이터가 필요한 뷰의 가장 공통 상위 뷰에 데이터를 State로 저장Swift 속성(property)을 통해 데이터를 읽기 전용으로 제공하거나, 바인딩으로 `state`에 대한 양방향 연결을 만든다.SwiftUI는 데이터의 변화를 감시하고, 필요에 따라 영향을 받는 뷰를 업데이트한다. 하지만, `state` 변수의 수명 주기가 뷰의 수명 주기를 반영하기 때문에 영구 저장에 `state` 속성을 사용하면 안 된다.대신, 버튼의 하이라이트 상태, 필터 설정, 현재 선택한 목록 항목과 같이 사용자 인터페이스에 영향을 미치는 .. 2024. 8. 22.
Single source of truth 단일 진실 소스, Single source of truth 시스템 전체에서 일관된 데이터를 보장하기 위해 사용되는 하나의 데이터 원본이를 통해 데이터의 무결성과 일관성을 유지한다.예를 들어, SwiftUI에서 @State, @ObservedObject를 사용해 뷰와 데이터 모델 간의 일관성을 유지한다. import SwiftUIclass ViewModel: ObservableObject { @Published var text: String = "Hello, World!"}struct ContentView: View { @ObservedObject var viewModel = ViewModel() var body: some View { VStack { Tex.. 2024. 8. 22.
Glue logic 접착제 논리, Glue logic시스템의 여러 구성 요소를 연결하고 조정하는 역할을 하는 코드.이를 통해 서로 독립적인 구성 요소들이 함께 작동하도록 만든다.예를 들어, 여러 데이터 소스에서 데이터를 가져와 하나의 화면에 표시하는 SwiftUI 뷰가 있다. 2024. 8. 22.
Swift: Model data 앱이 인터페이스를 구동하는 데 사용하는 데이터SwiftUI는 사용자 인터페이스 디자인에 대한 선언적인 접근 방식을 제공한다.뷰의 계층 구조를 구성할 때, 뷰에 대한 데이터 종속성도 나타내는데 외부 이벤트 또는 사용자가 수행하는 작업으로 인해 데이터가 변경될 때 SwiftUI는 인터페이스의 영향을 받는 부분을 자동으로 업데이트한다.결과적으로, 프레임워크(Frameworks)는 뷰 컨트롤러(View Controller)가 전통적으로 하는 대부분의 작업을 자동으로 수행한다.  프레임워크는 앱의 데이터를 사용자 인터페이스(User Interface)에 연결하기 위한 상태 변수(State), 바인딩(Binding)과 같은 도구를 제공한다.이 도구들은 부분적으로 접착제 논리(Glue logic)의 양을 줄임으로써 .. 2024. 8. 22.
Swift: Attributes 원문 선언과 유형에 대해 정보를 추가한다.스위프트에는 선언(declarations)에 적용되는 속성, 유형(types)에 적용되는 속성 두 가지 종류의 속성(Attributes)이 있다.속성은 선언이나 유형에 대한 추가 정보를 제공한다.예를 들어, 함수 선언의 discardableResult 속성은 값을 반환하는 함수가 반환 값을 사용하지 않아도 컴파일러가 경고를 생성하지 않는다.@ 기호와 속성의 이름, 속성이 허락하는 인수(arguments)를 작성하여 속성을 지정할 수 있다.- @- @() 2024. 8. 22.
뿌대식: 네트워크 분석 네트워크 관련 리팩토링을 진행하기 전, Instruments를 사용하여 뿌대식을 분석해 봤습니다.환경은 실기기 iPhone 14, iOS 17.5.1이며 각 캠퍼스에 대해 한 번씩 진행했습니다.  스냅샷부산 캠퍼스   밀양 캠퍼스  양산 캠퍼스  분석그동안 프로젝트를 진행하면서 식단이 로딩되는 속도가 느리다고 생각하고 있었는데, 그 이유가 응답 데이터 양으로 인한 속도 저하라고 생각했습니다. 그래서 네트워크 관련 리팩토링은 아래 두 가지를 염두했었습니다.중복 데이터 관련부산 - 밀양 - 부산 순으로 캠퍼스를 전환할 시 전환 시마다 네트워크 요청을 하는데, 식단은 탭을 이동하는 잠깐 사이 변경이 될 일이 없기 때문에 데이터 캐싱 처리네트워크 사용량 관련네트워크 요청 queryParam을 좀 더 세분화해 필.. 2024. 8. 19.
뿌대식: 뷰 컴포넌트 분리 개선 목표기존의 뷰 요소들이 MainView 파일 하나에서 모두 관리되기 때문에 원하는 뷰를 수정하려고 할 때 원하는 부분을 찾는 데 어려움이 있었습니다. 그래서 뷰 요소들을 각각의 파일로 분리하며 Binding을 통하여 데이터를 관리하기로 목표를 잡았습니다.  개선 전  메인 뷰에서 “앱 로고”, “설정 버튼” 등을 관리하는 title, “부산”, “밀양”, “양산” 캠퍼스에 대한 탭을 관리하는 campus, “월” ~ “금”과 해당하는 요일을 관리하는 week, “식당”과 “식단”을 관리하는 menu를 한 번에 관리합니다.  개선 후  각 뷰 요소들을 용도에 맞게 분리하고, 메인 뷰에서 통합하여 호출하도록 개선했습니다. 그리고, 상황에 맞게 커스텀하여 사용하던 텍스트, 이미지, 도형 등의 뷰 요소들을.. 2024. 8. 18.
뿌대식: 응답 모델 개선 개선 전 기존 프로젝트의 모델들(식당, 기숙사, 네트워크 응답, …)은 처음 모델을 생성한 의도와 다르게 필요에 따라 메서드가 하나씩 추가되었고, 메서드 간 종속성이 강하게 묶여있어 하나의 메서드를 수정하면 연관되는 모든 메서드를 수정했어야 했습니다. 그리고, 학생 식당과 기숙사의 응답 형식이 달라 각 응답을 보여주는 뷰가 2개 존재했습니다. 개선 목표는 학생 식당과 기숙사의 응답을 하나로 합치고, 뷰 또한 하나의 구조체로 표현하고자 했습니다.추가로, 필요에 따라 추가한 메서드들(예를 들어, static으로 선언된 rawValue를 통해 캠퍼스를 반환하는 메서드)을 재사용 가능하게 수정하는 것이었습니다.  개선 후  의도 결과를 설명하기 전, 오랜만에 열어본 프로젝트는 한눈에 보기 힘들 정도로 로직이 엉.. 2024. 8. 18.
Swift: Network 프레임워크 Network.framework전송 및 보안 프로토콜을 사용하여 데이터를 보내고 받기 위한 네트워크 연결을 만든다. 사용자 지정 애플리케이션 프로토콜을 위해 TLS, TCP 및 UDP와 같은 프로토콜에 직접 액세스해야 할 때 이 프레임워크를 사용한다.HTTP 및 URL 기반 리소스를 로드하기 위해 이 프레임워크를 기반으로 구축된 URLSession을 계속 사용한다.  NWEndPoint네트워크 연결에서 로컬 혹은 리모트 엔드 포인트 enum NWEndpoint: Endpoint Typescase hostPort(host: NWEndpoint.Host, port: NWEndpoint.Port)Host와 Port를 입력해 주는 EndPointcase service(name: String, type: Stri.. 2024. 8. 17.
JSON JSONJavaScript Object Notation(JSON)은 Javascript 객체 문법으로 구조화된 데이터를 표현하기 위한 문자 기반의 표준 포맷 JSON(JavaScript Object Notation)은 경량의 DATA-교환 형식이다.이 형식은 사람이 읽고 쓰기에 용이하며, 기계가 분석하고 생성함에도 용이하다.JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999의 일부에 토대를 두고 있다.JSON은 완벽하게 언어로부터 독립적이지만 C-family 언어C, C++, C#, Java, JavaScript, Perl, Python 그 외 다수의 프로그래머들에게 친숙한 관습을 사용하는 텍스트 형식이다.이러한 속.. 2024. 8. 16.
Client Server 모델 Client-Server, Client-Server model클라이언트-서버 모델은 리소스 또는 서비스 공급자인 서버와 서비스 요청자인 클라이언트 간 서비스 자원의 작업을 분리해 주는 분산 애플리케이션 구조이자 네트워크 아키텍처를 나타낸다.종종 클라이언트와 서버는 별도의 하드웨어에서 컴퓨터 네트워크를 통해 통신하지만, 클라이언트와 서버는 모두 같은 시스템에 상주할 수 있다.클라이언트-서버 모델을 사용하는 컴퓨터 응용 프로그램의 예로는 이메일, 네트워크 인쇄 및 월드 와이드 웹이 있습니다. 클라이언트 (Client)네트워크를 이용하여 서버(Server)측에 서비스 요청을 의뢰하는 측ex) 웹 브라우저, 데스크톱 프로그램, 모바일 앱, 다른 서버에 요청을 보내는 서버 등클라이언트는 보통 자원을 공유하지 않지.. 2024. 8. 16.
Echo Server Echo ServerEcho Server-Client는 클라이언트가 서버로 메시지를 전송하면, 서버는 동일한 메시지를 클라이언트에게 다시 전송하는 것  Server 작동 방식서버 소켓을 생성하고 특정 포트에 바인딩클라이언트의 연결을 기다린다.클라이언트와 연결되면, 데이터를 읽고 동일한 데이터를 클라이언트에게 다시 전송한다.연결 종료 Client 작동 방식서버의 IP 주소와 포트를 사용하여 소켓을 생성하고 서버에 연결서버에 메시지를 전송서버로부터 응답을 받는다.연결 종료 실행 방식EchoServer 실행EchoClient 실행서버에 메시지 전송서버 콘솔에서 클라이언트로부터 받은 메시지 확인하고, 클라이언트 콘솔에서 서버로부터 받은 응답을 확인 참고TCP Echo 서버와 클라이언트: Socket 통신 이해하기 2024. 8. 15.
패킷 통신, TCP 패킷 통신패킷 교환 (Packet Switching) 방식은 미리 이동 경로를 정하지 않고, 데이터를 패킷 (Packet)이라는 작은 단위로 나누어 다중 노드로 구성된 네트워크를 통해 전송하는 개념이다. 전송될 데이터는 네트워크를 통해 전송되기 전에 패킷으로 쪼개지고, 각 패킷에는 고유 번호가 지정되어 네트워크를 거쳐 최종 수신지에 도착했을 때, 번호 순서로 결합되어 데이터로 완성된다.각 패킷은 전송 당시 가장 효율적인 경로를 설정하여 최종 목적지까지 이동하게 된다.회선 교환 방식과 다르게 상황에 따라 매번 다른 경로로 갈 수 있도록 하여 효율성을 강조이게 가능하려면 출발지부터 목적지까지 가는 과정에서 거치는 모든 중간 노드들이 상황에 따라 이동 경로를 안내해야 한다.즉, 패킷을 수신한 중간 노드가 패킷.. 2024. 8. 14.
뿌대식: 리팩토링 근황졸업 발표를 준비하느라 포스팅하진 않았지만, 뿌대식은 그간 많은 변화가 있었습니다. 우선, 기능적으로는 지정한 식당의 식단을 시간에 맞춰 보여주는 위젯을 추가하거나, 데이터베이스에 수동으로 업데이트해주던 방식에서 주기적으로 파싱해 데이터베이스에 업데이트하도록 교체했습니다.(부산대학교 측에 문의해 비상업적 목적으로 데이터를 사용하는 걸 승인받았습니다.) 내부적으로는 뷰 요소를 조금 더 유저친화적으로 개편하고, 한 번에 3MB 가까이 소모되던 네트워크 사용량을 로직 개선으로 1MB로 줄였습니다. 코드 퀄리티보다 기능 개발에 초점을 맞춰 진행하다 보니 기술 부채가 꽤나 많이 쌓여버려서, 부스트캠프가 끝난 지금 시간 여유가 있을 때 내부 안정화를 진행하려고 합니다.  프로젝트 다이어그램클래스 다이어그램 호출.. 2024. 8. 13.
Swift: Result Builder Result Builder자연스럽고 선언적인 방식으로 목록이나 트리와 같은 중첩된 데이터를 만들기 위한 도메인별 언어(DSL)를 구현할 수 있게 해 준다.Class, Struct, Enum 타입 등에 사용할 수 있다. Result Builder Methodstatic func buildBlock(_ components: Component...) -> Component부분 결과의 배열을 하나의 결과로 결합한다.static func buildPartialBlock(first: Component) -> Componentfirst 요소로부터 부분 결과 요소를 만든다.buildBlock(_:)와 비교하면, 다른 수의 인수를 처리하는 오버헤드를 줄인다.static func buildPartialBlock(accum.. 2024. 8. 13.
SQL, Database SQLSQL, Structured Query Language관계형 데이터베이스에 정보를 저장하고, 처리하기 위한 프로그래밍 언어이다.관계형 데이터베이스는 정보를 표 형식으로 저장하며, 행과 열은 다양한 데이터 속성과 데이터 값 간의 다양한 관계를 나타낸다.SQL 문을 사용하여 데이터베이스에서 정보를 저장, 업데이트, 제거, 검색할 수 있으며 혹은 데이터베이스 성능을 유지 관리하거나 최적화하는 데 SQL을 사용할 수 있다. SQL 명령개발자가 관계형 데이터베이스에 저장된 데이터를 조작하는 데 사용하는 특정 키워드 또는 SQL 문 DDL, 데이터 정의 언어데이터베이스 구조를 설계하는 SQL 명령DDL을 사용하여 비즈니스 요구 사항에 따라 데이터베이스 객체를 만들고 수정한다.예를 들어, CREATE 명령을 사.. 2024. 8. 12.
HTTP HTTP, HyperText Transfer Protocol은 W3 상에서 정보를 주고받을 수 있는 프로토콜이다. 주로 HTML 문서를 주고받는 데 쓰인다. 클라이언트와 서버 사이에 이루어지는 요청/응답 프로토콜로 예를 들어 클라이언트인 웹 브라우저가 HTTP를 통하여 서버로부터 웹페이지(HTML), 그림 등을 요청하면 서버는 이 요청에 응답하여 필요한 정보를 해당 사용자에게 전달하게 된다. 메시지요청 메시지: 요청 내용과 헤더 필드는 로 끝나야 한다. 즉, 캐리지 리턴과 라인피드가 와야 한다. 빈 줄은 로 구성되며 그 외 공백이 존재해선 안된다.요청 내용헤더빈 줄기타 메시지요청 메시지 요약표HTTP 메소드요청 Body응답 Body안전멱등(Idempotent)캐시 가능GET선택 사항예예예예HEAD선택 사.. 2024. 8. 12.
VCS, Git VCS소프트웨어 팀이 시간이 지남에 따라 소스 코드의 변경 사항을 관리하는 데 도움이 되는 소프트웨어 도구  CVCS, DVCS중앙 집중식 버전 관리 시스템, CVCS(Centralized Version Control System)프로젝트 파일이 서버 한 곳에만 위치해 있어 파일의 버전이 일관적이고 관리자는 서버의 파일만 신경 쓰면 되므로 관리하기 편하다. 커밋 시에는 수정사항이 바로 서버로 올라가게 된다. 분산 버전 관리 시스템, DVCS(Distributed Version Control System)프로젝트의 전체 파일이 참여자들의 각 컴퓨터와 서버에 분산되어 저장된다. 파일을 서버와 각 참여자들의 컴퓨터에 분산하여 저장할 수 있기 때문에 문제가 생길 시 다른 컴퓨터 혹은 서버의 파일을 통해 복구할 .. 2024. 8. 12.
Swift: 이벤트 큐, 이벤트 핸들러 이벤트 큐 (Event Queue)역할: 이벤트 큐는 발생한 이벤트(예: 사용자 입력, 타이머 이벤트, 네트워크 응답 등)를 일시적으로 저장하는 데이터 구조작동 방식: 시스템이 이벤트를 발생시키면, 이 이벤트는 이벤트 큐에 추가된다. 이벤트 루프는 큐에서 이벤트를 하나씩 꺼내어 처리목적: 이벤트를 비동기적으로 처리하여 사용자 인터페이스가 응답성을 유지하고, 여러 이벤트를 순차적으로 처리  이벤트 핸들러 (Event Handler)역할: 이벤트 핸들러는 특정 이벤트가 발생했을 때 실행되는 콜백 함수 또는 메서드작동 방식: 이벤트가 발생하고 이벤트 큐를 통해 전달되면, 해당 이벤트와 연관된 핸들러가 호출되어 이벤트를 처리목적: 이벤트가 발생했을 때 특정 동작을 정의하고 수행하여 프로그램이 적절히 반응  im.. 2024. 8. 12.
Swift: Async, Await, Thread 동기, 비동기동기(synchronous): 앞선 작업이 끝날 때까지 다른 작업들이 기다리는 것비동기(asynchronous): 앞선 작업에 상관없이 작업을 시작하는 것  CompletionHandler작업이 끝난 시점에 수행할 작업으로 비동기 작업에서 작업이 끝나는 시점을 알릴 때 주로 사용 completionHandler 콜백 문제점중첩될 수록 코드의 가독성이 안 좋아진다오류 처리가 어렵고 장황해진다.호출을 잊을 수도 있다.self capture + cycle retain 발생 가능  Async & Await컴플리션 핸들러의 장황한 코드 블록과 복잡한 에러 핸들링 문제를 해결하기 위해 Swift 5.5부터 도입된 개념비동기 코드를 마치 동기 코드처럼 작성할 수 있게 해 준다.(외관상) 컴플리션 핸들러 .. 2024. 8. 12.
Swift: OperationQueue OperationQueueOperationsingle task에 관한 데이터와 코드를 나타내는 추상 클래스 OperationQueueOperation 객체들을 우선순위에 의해서 실행시키는 큐한 번, 큐에 operation 객체를 담아놓으면 task가 끝날 때까지 큐가 없어지지 않고 존재해당 큐에서 operation 객체를 삭제하거나 명령시킬 수 있는 장점 Operation Statepending: 큐에 operation이 추가 될 경우ready: pending에서 모든 조건 만족 시executing: start() 메소드를 호출하여 작업 시작한 경우finished: 작업이 완료된 경우 finished가 되고, 큐에서 operation 제거cancelled: 해당 상태는 3개의 상태 pending, rea.. 2024. 8. 12.
결합도, 응집도 강한 결합, 느슨한 결합결합도  모듈과 모듈 간의 상호 결합 정도강한 결합어떤 객체를 다른 클래스에서 생성하여 사용하였을 때, 해당 객체에 변경을 가하면 해당 객체를 생성한 다른 클래스에서도 똑같이 변경을 해줘야 하는 상태느슨한 결합약한 결합은 강한 결합과 반대로 객체를 변경해도 다른 곳에 아무런 영향이 주지 않는 것  응집도응집도는 모듈에 포함된 내부 요소들이 하나의 책임/ 목적을 위해 연결되어 있는 연관된 정도       참고[설계 용어] 응집도(Cohesion)와 결합도(Coupling) 2024. 8. 12.