iOS 빡! 스터디의 첫 번째 개인 프로젝트를 마치며

Minji Kim·2022년 6월 6일
0

My Review

목록 보기
3/5
post-thumbnail

필자는 2022년 5월 14일에 결성된 iOS 빡! 스터디의 멤버다. 유튜버 '개발하는 정대리'의 디스코드 방에서 모집 중이었던 iOS 스터디에 참여하게 되었다. 인원은 총 4명으로 개발할 앱의 주제를 정해서 3주동안 각각 개발하고, 매주 개발 진행 상황을 이야기하며 서로 코드 리뷰도 하는 방식으로 진행 중이다. 우선은 각자 개발하고 나중에는 팀 프로젝트도 만들어 볼 예정이다.

첫 번째 앱 : 에그 타이머

그리하여 우리의 첫 번째 앱의 주제는 에그 타이머로 정해졌다. 달걀 삶기 타이머인데, 선택한 익힘 정도(완숙, 반숙 등)로 타이머가 실행되는 앱이다.

새로 알게된 점

📌 Git Organization
스터디에 참여하기 전까지는 혼자서 공부했다보니 Git을 다른 사람과 같이 사용할 일이 없었다. 하지만 이번 스터디 멤버 중 GitHub을 잘 다루는 멤버 덕분에 Git Organization도 알게되었다. 그래서 멤버들과 Organization을 만들어서 앞으로의 스터디 관련 프로젝트 레포지토리는 여기서 관리하기로 했다.

▼ 우리 스터디의 Organization 공간

📌 Storyboard에서 UITableView의 Header(또는 Footer)를 쉽게 만드는 방법
이번 프로젝트에서 Storyboard를 사용했는데, TableView의 헤더를 쉽게 만드는 방법을 알게 되었다. CollectionView는 우측 속성 창에 헤더와 푸터를 설정할 수 있는 체크 박스가 있어서 쉽게 추가할 수 있는데, TableView는 없다. 그래서 TableView안의 Cell을 기준으로 제일 위에 View를 넣으면 Header가 되고, 제일 아래에 넣으면 Footer가 된다.

📌 ContainerView
예전에 넷플릭스 스타일의 영상 앱을 만들면서 ContainerView을 처음 접했는데 그새 잊어버렸다.. TableView의 헤더로 Horizontal StackView를 넣어서 옆으로 슬라이딩할 수 있는 View를 구성하고 싶어서 ContainerView를 사용했다. 별도의 ViewController를 가지지만 한 ViewController에 모두 포함되어 있는 것처럼 보이기 때문에 UI를 쉽게 구성할 수 있었다.

📌 Open Library(HGCircularSlider, WaterDrops, PanModal)
필자는 오픈 소스 라이브러리 사용을 지향하는 편이라서 이번 프로젝트를 만들면서 새로 알게 된 오픈 소스 라이브러리도 꽤 있었다. 하지만 스터디 멤버 중에서 라이브러리 사용을 지양하는 분도 계셔서 오픈 소스 라이브러리 사용에 대해서 다시 한번 생각하게 되었다. 그래서 오픈 소스 라이브러리는 최대한 사용을 지양하되 정말 필요한 부분은 공식 또는 공인 라이브러리를 사용하자는 쪽으로 생각이 바뀌었다.

HGCircularSlider원형 슬라이더를 쉽게 구현할 수 있는 라이브러리다. 다만, 아쉬웠던 부분은 속성 설정에 대해서 자세하게 설명되어 있지 않아서 일일이 설정해 보며 구성했고, Storyboard에서는 UI가 보이지 않는다. 코드로 작성할 때가 최적인 것 같다.

WaterDrops물방울 애니메이션을 쉽게 구현할 수 있는 라이브러리다. 필자는 타이머가 시작될 때 물이 보글보글 끓는 듯한 효과를 주고 싶어서 사용하게 되었다. HGCircularSlider와 마찬가지로 속성에 대한 설명이 없어서 아쉬웠다.

PanModal은 일명 BottomSheet을 쉽게 구현할 수 있는 라이브러리로, 셋 중에 제일 설명이 잘되어 있어서 사용하기 쉬웠다. 굉장히 유용한 라이브러리인 것 같다.

📌 Tuple Naming
튜플도 네이밍이 가능하다는 것을 처음 알게 되었다. 0, 1, 2로 데이터를 가져오는 것보단 네이밍 해서 가져오면 유지 보수에 더 편리할 것이다.(특히, 다른 개발자가 볼 때 이해하기 쉬울 것이다.)

Before

guard let data = notification.object as? [Int] else { return }
	let currentSec = data[0]
	let min = data[1]
	let sec = data[2]

After

guard let data = notification.object as? (current: Int, minute: Int, second: Int) else { return }
	// 튜플 네이밍으로 더 알아보기 쉽게.
	let currentSec = data.current
	let min = data.minute
	let sec = data.second

📌 components
Swift에서 split과 함께 문자열을 자를 수 있기로 유명한 components를 잊고 있었다. 그래서 "egg10" 문자열에서 뒤에 숫자(10)만 가져오기 위해서 문자열을 배열로 바꾼 후 suffix로 앞에서 3자리까지 자르고 다시 문자열로 바꾸고 다시 정수로 바꿨다..허허,, 하지만 components를 사용하면 "egg"라는 문자열을 기준으로 자른 후 마지막 원소를 가져오면 된다.

Before

// ex) image = "egg10" 
let time = Int(String(Array(image).suffix(from: 3)))

After

// ex) image = "egg10" 
let time = Int(image.components(separatedBy: "egg").last!)

📌 Background, Foreground 관련
타이머를 Background에서도 컨트롤하기 위해서 SceneDelegate의 Background, Foreground 진입 메서드를 사용해 봤다. 개념만 알고 있었는데 이번에 실제로 사용할 수 있어서 좋은 경험이었다. 그리고 실제 사용해 보면서 NotificationCenter와 찰떡궁합이라는 것도 알게 되었다.

class SceneDelegate: UIResponder, UIWindowSceneDelegate {
	...
    /// Foreground 진입 시
    func sceneWillEnterForeground(_ scene: UIScene) {
        guard let start = UserDefaults.standard.object(
            forKey: .didEnterBackground
        ) as? Date else { return }
        
        let interval = Date().timeIntervalSince(start)
        
        NotificationCenter.default.post(
            name: .sceneWillEnterForeground,
            object: interval
        )
    }

    /// Background 진입 시
    func sceneDidEnterBackground(_ scene: UIScene) {
        UserDefaults.standard.set(Date(), forKey: .didEnterBackground)
        
        NotificationCenter.default.post(
            name: .sceneDidEnterBackground,
            object: nil
        )
    }
}

📌 LaunchScreen 관련
매번 LaunchScreen을 굉장히 정적으로 만들었는데, 이번에는 동적으로 만들어보았다. LaunchScreen과 똑같이 생긴 ViewController를 만들고 진입 화면으로 설정한다. 그리고 그 ViewController에서 동적으로 컨트롤하면 된다!

아쉬운 점

개발 기간에 비해서 욕심을 너무 많이 부렸던 터라 시간 부족으로 구현하지 못한 것들이 꽤 많다. 시간날 때마다 차차 보완해서 나중에 출시까지 해보려고 한다!!! 아자👊

  • 탭 바 버튼을 클릭했을 때 UITableView가 최상단으로 스크롤 되도록 수정하기
  • UITableView을 당겨서 새로고침할 수 있게 수정하기
  • 클린 코드로 수정하기(지금보다 더 정돈된 최적의 코드로!)
  • 타이머가 진행됨에 따라 달걀 이미지가 서서히 변하도록 수정하기
  • GitHub Readme 정리하기
  • 설정 기능 추가하기(진동 모드 선택, 알림 설정)
  • Foreground 상태에서 타이머가 끝났을 때 UI 수정하기(타이머가 끝났다는 것을 알 수 있도록)
  • Background에서 타이머가 끝난 후 Foreground로 왔을 때 알림음이 울리지 않도록 수정하기
  • 타이머를 일시정지 한 후에 Background로 가도 타이머가 재생되고 있는 오류 수정하기

마무리하며

왜 그룹 스터디를 하라고 하는지 절실히 느꼈다. 혼자서 1년 동안 공부하면서 터득한 것과 3주 동안 스터디하며 얻은 것이 비교가 안된다. 각자 바쁜 일상을 보내면서 꾸준히 스터디에 참여하는 우리 멤버들이 정말 대단하고 감사하다.

각자 더 잘 아는 부분과 잘 하는 부분이 다르기 때문에 서로 알고 있는 지식을 공유하면서 부족한 부분을 채워갈 수 있고, 매주 스터디를 진행하기 때문에 혼자서 공부할 때와 다르게 전혀 늘어지지가 않는다. 늘어질 수가 없다..ㅋㅋㅋㅋ 암튼 더 좋은 개발자로 성장할 수 있는 좋은 기회인 것 같다!!!

고마워요! 우리 스터디 멤버들~!!! 😎😎😎😎

profile
iOS Developer

0개의 댓글