[SSC] 1. 기술적 고민

김윤홍·2025년 1월 27일

SSC시작전 기술스택 고민

프로젝트 시작전 발생할 수 없는 고민들이 있다. 지금까지는 그냥 UIKit써왔고, SwiftUI가 UI를 그리는데 간편하다고해서 써보기도하고, 비동기 처리하는데 Rx가 편하다는데?, 이미지는 KingFisher쓰면편하고, Rest API이용할땐 Moya쓰면 간편하대~ 라는 말을 듣고 무작정 패키지설치하고 import하고 예시들 보면서 따라서 쓰기만 했던것 같다. 왜 써야 하는지에 대한 이유와 그방법들을 내가 노력없이 써왔기 때문에 이해도가 많이 부족했던것 같아 프로젝트 시작전 기술스택에 대해 고민한 바탕으로 결정하려 한다.

와이어 프레임과 플로우 차트

MVP단계에서의 나의 계획은 카메라가 알파벳 수화를 인식하고 그에 맞는 알파벳을 실시간으로 띄워주는 계획이다.


CreateML의 모델타입 결정

와이어 프레임은 위와 같은데 손동작을 프레임마다 손의 마다마다 키포인트를 확인을해서 CreateML로 만들어낸 모델과 일치한다면 그결과값을 화면에 자막처럼 띄워주는 것이다.

수화사진을 학습시키고 손의 모양의 이미지를 인식하게 해서 모델사진하고 비교해서 알파벳을 넣을까 고민을 해보았다. 알파벳의 수화는 정적이기 때문인데 아래 사진과 같이 모델을 선택하는 부분에서 HandPose가 있는데 굳이 이미지를 선택할 이유가 없었다.


SwiftUI vs UIKit

UIKit 프레임워크는 Xcode를 처음 시작하면서 부터 사용한것 같다. 앱을 만드는데 필요한 오브젝트들을 제공한다. 이런 객체들을 사용하면서 화면에 표시하고, 상호작용을 한다. UIKit이 SwiftUI보다 오래전에 개발되어 역사가 깊고 복잡하고 다양한 UI, 애니메이션등을 만들어 낼 수 있다.

SwiftUI는 명령형인 UIKit과 다르게 선언형이다. 따라서 화면을 쉽고 빠르게 그릴수 있다. 또한 화면을 그릴때 어떻게 그려지는지 preview를 통해 확인할 수 있다.

import UIKit

class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        
        // Label 생성
        let label = UILabel()
        label.text = "Hello World"
        label.textColor = .black
        label.textAlignment = .center
        label.font = UIFont.systemFont(ofSize: 24)
        
        // 레이아웃 설정
        label.translatesAutoresizingMaskIntoConstraints = false
        view.addSubview(label)
        
        // 오토레이아웃
        NSLayoutConstraint.activate([
            label.centerXAnchor.constraint(equalTo: view.centerXAnchor),
            label.centerYAnchor.constraint(equalTo: view.centerYAnchor)
        ])
    }
}
import SwiftUI

struct ContentView: View {
    var body: some View {
        Text("Hello World")
            .font(.system(size: 24))
            .foregroundColor(.black)
            .multilineTextAlignment(.center)
    }
}

두 개의 코드만 비교해도 SwiftUI가 UI를 간단하게 만들수 있다는 것을 알 수 있다.

또, 중요한 차이점으로는 데이터를 다루는 과정이다.
UIKit에서 사용자의 이벤트로 데이터가 변경될 때에는 데이터를 처리하고 UI도 그에맞게 그려줬어야 했다.(그만큼 코드증가 + 에러처리증가)

하지만 SwiftUI에서는 데이터가 변경되면 뷰의 상태를 저장하는 State 모델 객체의 변화를 보고있는 ObservableObject등 데이터변화를 뷰에 반영해주기 때문에 UIKit과 달리 간편하다.

SwiftUI의 단점?
먼저 UIKit에서 제공하는 일부 기능들이 지원되지 않을 수 있다 그래서 이 프로젝트에서는 SwiftUI에서 제공되지 않은 기술스택이 있다면 UIKit을 통해 처리해주고 데이터의 바인딩과 UI를 그리는 부분은 SwiftUI로 다뤄보려고한다.

AVFoundation

AVFoundation에서는 손 모양의 input과 output을 담당하려고 한다. 손모양이 들어오면 Vision을 통해 데이터를 처리해주고 처리한 데이터를 받아서 text를 띄워주려고한다.

Vision

vision 프레임워크를 사용해서 손의 좌표 값을 사용해 손동작을 인식 시키려고 한다. 손 관절 좌표를 추출하고 그 좌표들을 CoreML에 인식시켜 값을 model의 label을 AVfoundation으로 전달하려고 한다.


마무리

AVFoundation: 카메라를 통해 이미지를 가져옴
Vision: 가져온 이미지를 이해하고 분석함
Output 처리: 분석 결과를 전달.

0개의 댓글