2023년 08월 1주차 회고

백상휘·2023년 8월 6일
0

열심히 하다보니 정신없이 지나갔던 것 같다. 하지만 그래도 할말이 있는 걸 보니 좀 더 열심히 뛰어야 하나 싶기도 하다.

Coordinator Pattern??!

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 에 의해 관리되는 화면은 NavigationLink 를 통해 NavigationView 에서 스택에 쌓여 이동한 화면이기 때문에 메모리에 남아있게 된다.
  • 만약 어떤 뷰가 이미지를 추가하였다고 가정해보자. 이 상태에서 다른 뷰로 넘어가는 과정에서 이미지가 추가된 뷰가 메모리에 계속 남아있게 된다.
  • 추가적인 처리가 필요한데, 만약 다시 화면에 돌아왔을 때 해당 화면의 상태값이 남아있어야 한다면?

여러가지 상황을 고려해 보았을 때 결국 나의 답은 이거였다.

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시간 후) 이와 관련된 코드를 짤 일이 있으니 오랜만에 코딩 관련 게시물을 올릴 수 있게 되었다.

한놈만 팬다

이건 어쨋든 결론을 냈고 또 하나 고민이 개인공부인데 우직하게 한 과목만 열심히 하고 나중에는 정리하는 방식을 취하고 있다.

나는 뭔가 계획을 세워보라고 하는 것보다 그냥 하라고 해야 하는 성격인 것 같다. 그렇다면 가장 좋은 건 계획을 최소화 하는 것이니 별 생각없이 하나만 죽어라 판다.

요즘 네트워크 강의를 듣고 있다. 네트워크 강의를 그냥 외우는 방식으로 가르치는 것인데, 개인적으로 상당히 많은 공부가 되고 있다. 정말 대단한 일이다. 공부가 된다.

이걸 마무리 한 뒤 나만의 정리 노트를 만들 생각이다. 이 강의는 기초편이 있고 심화편이 있는데 다음주면 기초편 정리를 시작할 수 있을 것이다.

뭔가 점점 나에 대해 알아가는 느낌이 든다. 사실 계속 뭔가 바꾸면서 일을 진행하는 것 같아서 정말 잘못 하고 있다는 생각을 많이 했는데 생각을 하지 않는 것이 답이었나 보다.

profile
plug-compatible programming unit

0개의 댓글