네이버 커넥트재단 부스트캠프/그룹프로젝트

[WeTri] 하나의 뷰컨에 여러가지 역할을 가져도 될까?

Joahnee 2023. 11. 19. 22:03

해당 게시글은 네이버부스트캠프에서 그룹 프로젝트를 진행하며 기록하는 내용입니다.

틀린 내용이 있을 수 있습니다. 
저희 프로젝트는 WeTri입니다.

많이 구경하러 와주세요!

https://github.com/boostcampwm2023/iOS08-WeTri

 

고민의 시작은 하나의 뷰컨이 여러가지 책임을 갖게되는 것이 과연 올바른가에 대해서 시작했습니다.

 

저희팀은 뷰를 처리하는 로직에는 MVVM-C 아키텍처를 사용하고 있는데요.

왼쪽은 기록하기 전, 오른쪽은 기록한 후 입니다.

 

여기서 문제는 Custom Calendar와 아래 기록 목록을 표시해주는 부분이 서로 다른 역할을 하는것 같았습니다 🤔

 

Calendar만 하더라도 다양한 로직이 들어가야 하기 때문에, ViewModel과 ViewController에 들어가는 Code의 양이 많아지고 비대해질것 같다고 생각했습니다.

 

또한, 하나의 ViewController에 역할이 2가지로 나뉠 수 있다고 생각했습니다.

 

그래서 아래처럼 구조를 짜볼 수 있겠다고 생각하게 됐습니다.

 

그래서 ContainerViewController를 하나 만들고 해당 Container에 두개의 ViewController를 추가하여 처리하였습니다.

 

우선 해당 뷰컨트롤러들의 View를 AutoLayout을 통해 처리하기 위해 아래와 같이 처리해줬습니다.

 

    let recordCalendarViewController = RecordCalendarViewController()
    guard let calendarView = recordCalendarViewController.view else { return }
    calendarView.translatesAutoresizingMaskIntoConstraints = false
    add(child: recordCalendarViewController)
    NSLayoutConstraint.activate([
		/// 오토레이아웃 처리
    ])

    let recordListViewController = RecordListViewController()
    guard let listView = recordListViewController.view else { return }
    listView.translatesAutoresizingMaskIntoConstraints = false
    add(child: recordListViewController)
    NSLayoutConstraint.activate([
        /// 오토레이아웃 처리
    ])

 

아래는 Container ViewController에 child ViewController를 추가해주는 로직입니다.

 

  func add(child viewController: UIViewController) {
    addChild(viewController)
    view.addSubview(viewController.view)
    viewController.didMove(toParent: viewController)
  }

 

정리해보자면, 1개의 ContainerViewController를 두고 그 안에 2개의 뷰컨트롤러를 둬서 역할을 분리해줬는데요!

 

이렇게 분리하면 각 ViewController간의 역할과 책임도 명확해지고 많은 양의 코드로 인해 비대해지는 ViewModel이나 ViewController를 분리할 수 있으니 좋았던 것 같아요!

 

잘 돌아가는게 보이시죠?

 

뷰만 짜서 데이터는 대충넣었습니다 😂

 

앞으로 애용해야할 것 같네요 🤩

 

혹시 더 자세한 코드가 궁금하시다면 저희 프로젝트에 놀러오세요~

 

[WeTri]