번호 : 021, 작성일자: 2025-06-16

2025.06.09 ~ 2025.06.15

⚡️ Swift Concurrency 병렬 프로그래밍 비교


순차적으로 실행하지 않아도 되는 네트워킹을 요청할 때 병렬로 요청하면 시간을 단축시킬 수 있는데 기존에는 DispatchGroup에 enter함수로 Task를 추가 하고 완료되면 leave 함수로 완료되었다는 신호를 주어서 모두 완료되었을 때 notify 함수로 처리할 수 있었습니다.

DispatchGroup 병렬 코드

func requestLegacyParallel() {
    let group = DispatchGroup()
    var results = [Bool]()
    let startTime = Date()
    print("시작 (DispatchGroup)")

    for _ in 0..<3 {
        group.enter()
        Task {
            let result = await self.networking()
            results.append(result)
            group.leave()
        }
    }

    group.notify(queue: .main) {
        let endTime = Date()
        let duration = endTime.timeIntervalSince(startTime)
        print("종료 (DispatchGroup) : 걸린 시간 \(duration)초")
        print("결과: \(results)")
    }
}

Swift Concurrency 순차적 코드 예시

func requestConcurrency() {
    Task {
        let startTime = Date()
				print("시작 (순차)")

        let a1 = await self.networking()
        let a2 = await self.networking()
        let a3 = await self.networking()

				let result = [a1, a2, a3]
        let endTime = Date()
        let duration = endTime.timeIntervalSince(startTime)
        print("종료 : 걸린 시간 \(duration)초")
        print("결과: \(results)")
    }
}

Swift Concurrency 병렬 코드 예시

func requestConcurrencyParallel() {
    Task {
        let startTime = Date()
			print("시작 (병렬)")

        async let a1 = self.networking()
        async let a2 = self.networking()
        async let a3 = self.networking()

        let results = await (a1, a2, a3)

        let endTime = Date()
        let duration = endTime.timeIntervalSince(startTime)
        print("종료 (병렬) : 걸린 시간 \(duration)초")
        print("결과: \(results)")
    }
}

걸린 시간을 확인해보면 DispatchGroup, async let 구문은 당연히 병렬요청으로 인해 순차적으로 실행한 코드가 빠르지만 애플에서는 Concurrency를 권장하기 때문에 병렬로 작성시 async let을 사용하도록 해야겠습니다.

📃 SQL 데이터 조회구문


SQL 데이터 조회 구문에 대해서 복습하는 시간을 가졌습니다.

SELECT 구문의 집계함수에 대해서 헷갈리는 부분이 있었는 데 여러 데이터셋이 하나의 데이터셋으로 합쳐진다는 개념이 이해하는 데 도움이 되었습니다.

여러 테이블을 조합해도 결과는 하나의 테이블만 추출

키워드 : SELECT, FROM, WHERE, GROUP BY, ORDER BY, HAVING, JOIN ~ ON, LEFT JOIN ~ ON, Count(), AVG(), MIN(), MAX()

📝 옵시디언


옵시디언은 마크다운문법을 활용하여 노트를 작성하고 관리하는 데 사용되는 앱인데 기존에 로컬에서만 사용할 수 있고 원격동기화를 위해서는 유료화여서 사용할 예정이였다가 검색해보니 Github, Dropbox, GoogleDrive등 다양한 클라우드 저장소를 활용하여 무료로도 원격동기화를 할 수 있어서 설정을 했습니다.

옵시디언을 먼저 완전 삭제를 해주었습니다.

완전 삭제 방법

# find / 루트 디렉토리부터 전체 검색 시작
# -iname "*obsidian*"	대소문자 구분 없이 obsidian이 들어간 파일/폴더 이름 검색
# 2>/dev/null	권한 오류 메시지는 무시하고 깔끔하게 결과만 출력
$ sudo find / -iname "*obsidian*" 2>/dev/null

# -iname "obs*"		대소문자 구분 없이 obs가 들어간 이름 검색
$ sudo find / -iname "*obs*" 2>/dev/null

그리고 저는 Git 플러그인과 Github, Remotly Save 플러그인과 Dropbox를 연동해주었습니다.

옵시디언 Sync 유료요금제가 안정적이고 매번 플러그인 설정도 해주는 부분은 번거롭지만 옵시디언을 조금 더 익숙해지면 고민해봐야겠습니다.

번외로 맥에서 캐시용량이 증가하는 느낌이 있어 검토를 해봐야할 것 같습니다.

🙋🏻‍♂️ 기타 사항


  1. WWDC 2025에 iOS 26 부터 리퀴드 글래스를 지원하면서 앱아이콘도 같이 활용하기 쉽도록 IconComposer라는 앱을 출시해서 사용해봤습니다.
  2. E-Tag를 지원하는 이미지URL, 웹URL등을 활용할 수 있는 이미지로더를 제작해볼 예정입니다.
  3. AI를 활용하기 위해 M1 Max로 FramePack이라는 비디오 생성 AI를 실행해봤는 데 RAM도 중요하지만 GPU성능도 중요해서 결과물 생성에 오래걸려서 다른 방법을 검색해보다가 원격으로 실행할 수 있는 Hugging face의 Space를 활용하는 방법도 좋은 것 같습니다.