열심히 하다보니 정신없이 지나갔던 것 같다. 하지만 그래도 할말이 있는 걸 보니 좀 더 열심히 뛰어야 하나 싶기도 하다.
SwiftUI 를 최근 사용하면서 가장 난감한 상황이 있는데 바로 뷰 내부에서만 뷰 전환이 가능하다는 것이다.
SwiftUI 의 뷰는 값 타입인 구조체이다. 뭔가 뷰의 상태 자체가 바뀌면 뷰가 다시 그려지기 때문에 대부분 내가 원하는 상태로 화면에 나타나지 않는 경우가 많다. 차라리 처음 화면에 나올 때 새로 그려지는 편이 나은 경우가 많았다.
거기다가 가장 중요한 문제는 스택으로 쌓인 뷰의 많은 수를 줄이고 다른 화면을 띄우거나, 탭 바를 이동해버리는 등의 화면을 구현하려면 정말 쉽지 않았다.
그 이유는? 뷰 내부에서만 뷰 전환이 가능하기 때문이다. 탭 바를 이동하기 위해서는 탭 바를 정의한 뷰 내부의 @State 등을 컨트롤 해야 한다. 자식 뷰가 부모 뷰로 접근하기 위해서는 환경변수(@Environment, @EnvironmentObject) 등을 고려해야 하지만 유지보수 비용이 올라가게 된다.
즉, 예외적인 화면 이동에 대해서는 각각의 솔루션이 각각 필요하다.
해결할 방법이 필요하다. 여기서 하나 굉장한 라이브러리를 발견했다.
https://github.com/johnpatrickmorgan/TCACoordinators
이건 루트 뷰 역할을 하는 TCA 의 한 Unit 을 정의하여 화면전환을 담당하는 것인데 이렇게 되면 사실 상 스택으로 화면이 쌓인다는 생각을 하지 않아도 된다.
그런데 개인적으론 두 개의 문제가 마음에 걸렸다.
예전에 독이 든 성배 라는 표현을 들은 적이 있었다. 빛나는 성배이지만 안에 든 음료가 독이 들어있다면 마시면 안된다. 하지만 똑같은 음료인데 이상한 잔과 성배라면 성배를 들어 마시지 않을까? 보이기에 좋다고 정말 그렇다고 생각하는 마음을 주의하라는 얘기라고 생각한다.
신중해야 한다. 나중에 열심히 코드를 뜯어고친다고 하더라도 지금 이걸 적용하는 건 위험하다고 생각했다.
하지만 문제는 해결해야 한다. 위처럼 예외적인 화면 전환을 할 때 Coordinator Pattern 을 사용할 수는 없을까?
https://labs.brandi.co.kr//2022/12/12/leehs81.html
브랜디 라는 회사는 많이 들어보았다. 여기서는 NavigationView 와 NavigationLink 만을 사용해서 직접 예외적인 화면전환을 해결하는 방법을 채택했다.
그렇지만 이것도 결국 적용하지 않기로 했다.
여러가지 상황을 고려해 보았을 때 결국 나의 답은 이거였다.
Coordinator 패턴은 나의 문제를 "전부" 해결해 줄 수 없었다.
그럼 어떤 상황에서 Coordinator 패턴을 써야 할까?
나는 트리 형태의 뷰가 생각났다.
A
|
B
|---ㄱ
C D
| |
E F
그림은 예쁘게 봐주셨으면 좋겠다.
만약 이런 경우 F 에서 작업이 끝나고 바로 B 로 넘어가야 된다면 어떻게 해야 할까? 나는 B 에 Coordinator 를 추가하는 방법이 생각났다.
A
|
B(+Coordinator)
|---ㄱ
C D
| |
E F
C, D, E, F 에만 추가되는 환경변수를 적용하고 Coordinator 를 통해 화면 전환을 유동적으로 실행하는 것이다.
다음주(약 12시간 후) 이와 관련된 코드를 짤 일이 있으니 오랜만에 코딩 관련 게시물을 올릴 수 있게 되었다.
이건 어쨋든 결론을 냈고 또 하나 고민이 개인공부인데 우직하게 한 과목만 열심히 하고 나중에는 정리하는 방식을 취하고 있다.
나는 뭔가 계획을 세워보라고 하는 것보다 그냥 하라고 해야 하는 성격인 것 같다. 그렇다면 가장 좋은 건 계획을 최소화 하는 것이니 별 생각없이 하나만 죽어라 판다.
요즘 네트워크 강의를 듣고 있다. 네트워크 강의를 그냥 외우는 방식으로 가르치는 것인데, 개인적으로 상당히 많은 공부가 되고 있다. 정말 대단한 일이다. 공부가 된다.
이걸 마무리 한 뒤 나만의 정리 노트를 만들 생각이다. 이 강의는 기초편이 있고 심화편이 있는데 다음주면 기초편 정리를 시작할 수 있을 것이다.
뭔가 점점 나에 대해 알아가는 느낌이 든다. 사실 계속 뭔가 바꾸면서 일을 진행하는 것 같아서 정말 잘못 하고 있다는 생각을 많이 했는데 생각을 하지 않는 것이 답이었나 보다.