iOS

[iOS] 리팩토링이라 쓰고 파일분리노가다라고 읽기

양밀루 2025. 5. 22. 21:55

뷰컨트롤러 파일에 모든것을 때려박아 개발한 어제의 나 왜그랬을까?

 

오늘의 내가 view와 viewcontroller 그리고 tableview로 분리했다..

 

처음에 생각한 순서는 뷰 → 테이블뷰 → VC 순으로 분리한다였다

단순한걸 먼저 정리하는게 나을거라고 생각했기 때문에!

뷰를 분리한 후 빌드해볼 생각은 안하고 신나게 테이블뷰까지 다 분리를 하고 빌드를 하니 !

완전히 꼬임 ^^

당연한게 뷰 분리 후에도 테이블뷰 로직이 VC에 남아 있어서 애매한 상태로 테이블뷰를 분리했었다

 

뷰 내에서 독립적으로 동작하는 테이블뷰를 먼저 분리하는 게 맞는 순서였다
테이블뷰 → 뷰 → VC 순으로 분리

테이블뷰를 먼저 분리하면 해당 뷰 컴포넌트만 띄워보기가 가능하다

 

가장 중요한건 매 단계 빌드 가능한 상태임을 항상 확인하자 ‼️

 


 

1단계) TableView 분리

TableView 관련 로직만 독립적으로 분리한다

    // TableView.swift 파일에 추가할 내용
    override func layoutSubviews() {
        super.layoutSubviews()
        tableView.frame = bounds
    }
// TableView 분리 후 남은 VC.swift 파일 수정 내용
// private let tableView = UITableView()
private let tableView: TableView

// init 함수에 추가
self.tableView = TableView(member: member)

 

 

테이블뷰로 옮긴 관련 함수들을 잘 호출해준다 !

 

 

2단계) View 분리

UI 컴포넌트들과 레이아웃 관리 함수 분리

이 친구가 TableView를 들고 있는다

그리고 뷰 안에 있던 버튼 액션은 ‘Delegate’ 프로토콜로 VC에 전달하도록 델리게이트 패턴을 적용했다

// View.swift에 추가
protocol ViewButtonDelegate: AnyObject {
    func backButtonTapped()
    func blogButtonTapped()
}

// 뷰 클래스 내부에 추가
@objc private func backButtonTapped() {
    delegate?.backButtonTapped()
}
    
@objc private func blogButtonTapped() {
    delegate?.blogButtonTapped()
}


// 뷰 클래스 내부에 추가
private let tableView: TableView   
weak var delegate: ViewButtonDelegate?

// init 내부에 추가
self.tableView = TableView(member: member)
// VC.swift에 추가
private let view: View

// init에 추가
self.view = View(member: member)

// setupView 함수에 추가
view.addSubview(view)
view.delegate = self