이 세계에선 내가 개발자?
[Scrumble] 1회차 스터디 회고록 본문
시작하기
이번에 SwiftUI가 점차 상승기류를 타고 있는 추세여서 SwiftUI를 공부해보고 싶은 마음은 한가득이었지만, 어떻게 어디서부터 시작해야할지 모르겠어서 막막했었던 때,
아는 지인분이 같이 SwiftUI 스터디를 하는 게 어떠냐고 물어봐주셨다.
너무너무 감사해서 당연히 스터디를 함께하겠다고 말씀 드렸고, 기본적인 스터디 계획을 짜고 모집글을 올려 같이 스터디할 인원들을 모으기 시작했다.
그렇게 모인 어벤져스 6명!
프렘님, 초비님, 라쿤맨님, 스티브님, 천원님, 나 이렇게 6명이 모여서 서로 자기소개를 하고 OT가 시작되었다.
모인 사람들은 SwiftUI를 사용해본 사람도 있었고, 나처럼 찍먹만 해본 사람도 있었으며, 아예 해보지 않은 사람도 있었다.
스터디를 열어 우리를 모아주신 프렘님은 모두의 의견을 통일해 SwiftUI 강의를 듣고 정리하여 발표하는 프로세스로 스터디를 진행하기로 했다.
그렇게 첫번째 OT 시간이 끝나고 그 다음 스터디까지 강의를 듣고 정리하는데, 강의를 듣고 정리하는 것 정도야 많이 해본 일이니까 어찌저찌 하겠는데.. 마크다운.. 이 마크다운.. 이 나에게 큰 문제로 다가왔다...
마크다운 문법을 거의 모르다보니까 나에게 정리란 예쁘게 아주 반짝거리게 하는 건데, 지금 내 지식으로 노션에 정리하는 것만큼 예쁘게 정리할 수 없다는 게 조금 한탄스럽게 다가왔다.
하지만 그래도.. 이왕 이렇게 된거! 마크다운까지 섭렵해보자고!! 라는 마음가짐으로 마크다운 문법이 정리되어있는 블로그를 띄워놓고 일단 강의를 들으면서 정리를 하기 시작했다.
우리가 들은 강의는 개발하는 정대리님의 SwiftUI 뽀개기 시리즈였다.
혹시 궁금한 사람들을 위해 요기서 볼 수 있다 : 링크
1회차 스터디
1회차 스터디는 위 강의를 #1 ~ #7 까지 들어오는 것이었다.
정말 기초적인 UI 만드는 부분부터 @State, @Binding 까지의 설명이 담긴 강의였는데 나는 그래도 한 번 찍먹해본 경험이 있어서 그런지 강의를 듣는데 큰 무리는 없었다.
룰루랄라 내용을 정리하고, 강의를 들으면서 알게된 내용들을 위주로 정리를 했다.
그리고 9월 13일 1회차 스터디 날이 밝았다. 모두가 강남에 미리 예약해둔 스터디룸에 모여서 발표를 시작했는데, 대망의 첫번째는 역시 우리의 스터디장님이신 프렘님이 시작하셨다.
그런데 여기서 조금 놀랐던게 프렘님이 삼항연산자와 if문 관련해서 질문을 하셨는데 나도 이게 너무 궁금해서 찾아봤던 내용이었어서 너무 신기했다. 이게 바로 데스티니?
거두절미하고 그래서 결국은 무슨 내용인데?? 라고 물으신다면 대답해드리는게 인지상정.. 이 아니고 아무튼 지금부터 설명을 해보겠다.
삼항 연산자와 if문
SwiftUI에서는 삼항연산자와 if 문을 보는 시선이 좀 다르다
삼항연산자는 표현식, if문은 구문으로 인식하기 때문에 삼항연산자를 이용하면 하나의 뷰에 속성값만 바뀌는 정도지만, if문으로 분기를 나눠 뷰를 만들면 두 뷰는 다른 id를 가지게 된다.
이 때 나온 id에 대한 설명이 view identity 이다.
코드로 자세히보자면
if isActivated {
Text("안녕하세요").background(Color.red)
} else {
Text("안녕하세요").background(Color.yellow)
}
위 두개의 Text는 background 색상만 다른 똑같은 모양이 뷰지만 다른 id를 가지고 있어서 아예 다른 사람이나 다름이 없는 것이다.
그리고 단순하게 생각하면 저렇게 간단하게 background만 바꿀거라면 굳이 if문으로 나누는 것보다는 삼항연산자로 깔끔하게 한줄 작성하는게 더 효율적이지 않나 싶다. 물론 어떤 조건에 의해 모든 뷰가 아예 바뀌어야한다면 if문을 쓰는 것이 맞을 것이다.
그러니 상황에 따라 적재적소에 어떤 걸 쓰냐가 가장 중요할 것 같다.
프렘님의 깔끔한 설명이 끝난 후 스티브님의 차례였다. 스티브님은 WWDC에 나온 이야기를 가지고 발표를 준비하셨는데 되게 신기한 것들이 많았다. 왜 ObervableObject를 사용하는지, EnvironmentObject랑 다른 점은 무엇인지에 대해 자세히 설명해주셨는데 갑자기 레벨이 한 층 올라간 느낌이었다.
다음은 내 차례였다. 나는 강의에서 들었던 내용들 중 궁금했던 점을 위주로 정리했기 때문에 그렇게 내용이 많진 않았다. 그러나 마지막에 민트주간이라는 세션을 하나 만들어서 발표를 했다.
민트 주간이란 iOS 관련된 블로그, 홈페이지, 컨퍼런스 등을 잘 정리해둔 앱이다. 궁금하다면 다운 받아보자 (광고 아님!)
나도 민트 주간을 읽기 시작한지 얼마 되지 않아서 많은 걸 보진 않았지만 최근에 본 게시글 중에 흥미로운 것들이 두 개 있어서 그 내용을 소개해드리니 다른 분들도 나처럼 신기하게 받아들이셔서 뿌듯했다.
그 날 발표한 자세한 내용은 요기서도 볼 수 있다 (별거 없지만) : 링크
그 다음으로는 초비님의 발표였다. 초비님은 UIKit과 SwiftUI를 함께 쓸 수 있는 방법에 대한 내용을 준비해오셨다고 하셨다.
SwiftUI에서 UIKit을 가져다 쓰는거야 많이들 하는 일이니까 그렇구나 싶었는데 이번에는 UIKit에서 SwiftUI를 가져다 쓴다니? 요런 내용이 너무 신기했다.
방법은 UIHostingViewController 를 이용하면 된다고 한다. 먼저 SwiftUI View를 만든 후 그 view를 hostingView에 root로 설정해준 다음에 기존 ViewController를 띄우는 present 코드를 이용해 띄우면 놀랍게도! SwiftUI View가 나타나게 된다.
let swiftUIView = SwiftUIView()
let hostingController = UIHostingController(rootView: swiftUIView)
self.present(hostingController, animated: true)
요런식으로도 쓸 수 있다는게 정말 신기하게 다가왔던 것 같다.
마지막으로 천원님의 발표였다. 천원님도 강의 기준으로 정리해오셨는데 조금 다른 부분이 있었다. 천원님은 UIKit에선 되는데? SwiftUI에서는 왜 안돼? 라는 궁금증을 가지고 세션을 준비하셨고, 천원님의 질문에 따라 우리는 모두다 토론하듯이 이야기를 나눴다.
이러한 과정이 너무나 재미있었으며, 조금 더 생각해보는 시간도 되어서 되게 좋았던 것 같았다.
천원님이 for in 왜 안되냐고 하셨을 때 뒷통수를 맞은 것 같으면서도 웃겼다. 왜냐면 나는 for in이 왜 안되는지에 대한 의문을 제기해보지 않았기 때문이다.
그저 SwiftUI에서는 ForEach 를 쓰는 것이다. 라는 것만 생각하니 for in 을 쓰면 안되는 이유에 대해서는 생각해보지 않았던 것 같다.
위 내용의 결과는 for in은 ViewBuilder 를 반환하기 때문에 body 내부에서 쓸 수 없지만 ForEach 는 View 를 반환하기 때문에 body 내부에서 쓸 수 있다는 것을 알게 되었다.
사실 2시간 스터디를 잡았지만 시간이 많이 남을 줄 알고, 남은 시간에 넷플릭스 볼까요!? 하면서 계획까지 짜놨었다 ㅋㅋㅋ 그런데 이게 왠걸 2시간이 지나간지도 모르고 신나게 스터디를 했다.
모두 다 각자 세션이 달랐던 것도 신기하고, 그걸로 인해서 알게된 점이랑 생각해볼만한 내용이 많았어서 너무 좋았다.
회고록 치고는 뭔가 말이 많이 정리되지 않은 느낌이긴하지만 스터디의 출발이 너무 좋아서 만족했던 1회차 스터디 시간이었다!
그럼 다음 스터디 시간까지 다시 열공해보자구
그 날의 멋있었던 우리로 마무으리