책 검색 앱 리팩토링 + 카카오 API 연동

호씨·어제
0

도서 검색 앱 리팩토링 - MVVM 패턴 적용기 🚀

개요 📌

도서 검색 앱을 MVVM 패턴으로 리팩토링한 과정을 정리하였다. 기존의 MVC 패턴으로 구현된 코드를 MVVM으로 전환하면서 코드의 구조를 개선하고 유지보수성을 높이는 데 중점을 두었다.

주요 변경사항 🔄

1. 파일 구조 변경

기존의 단일 파일 구조에서 다음과 같이 역할별로 파일을 분리하였다:

BookDataApp/
├── Models.swift        // 데이터 모델
├── ViewModels.swift    // 비즈니스 로직
└── Views.swift         // UI 요소

2. 카카오 API 연동

카카오 도서 검색 API를 연동하여 실제 도서 데이터를 가져오도록 구현하였다:

struct BookSearchResponse: Codable {
    let documents: [Book]
    let meta: Meta
}

struct Book: Codable {
    let authors: [String]
    let contents: String
    let datetime: String
    let isbn: String
    let price: Int
    let publisher: String
    let sale_price: Int
    let status: String
    let thumbnail: String
    let title: String
    let translators: [String]
    let url: String
}

3. MVVM 패턴 적용 💡

각 화면별로 ViewModel을 구현하여 비즈니스 로직을 분리하였다:

class BookSearchViewModel {
    private let apiKey = "YOUR_API_KEY"
    private(set) var books: [Book] = []
    var onBooksUpdated: (() -> Void)?
    
    func searchBooks(query: String) {
        // API 호출 및 데이터 처리
    }
}

class BookDetailViewModel {
    let book: Book
    
    var title: String {
        return book.title
    }
    
    var priceText: String {
        return "\(book.price)원"
    }
    
    func loadImage(completion: @escaping (UIImage?) -> Void) {
        // 이미지 로딩 로직
    }
}

주요 개선사항 ✨

1. 코드 구조 개선

  • 비즈니스 로직과 UI 로직의 명확한 분리
  • 각 컴포넌트의 책임과 역할 명확화
  • 테스트 용이성 향상

2. 기능 개선

  • 실제 도서 데이터 연동 구현
  • 이미지 로딩 기능 구현
  • 북마크 기능 구현을 위한 구조 마련

3. 확장성 강화

  • 새로운 기능 추가가 용이한 구조 확보
  • UI/UX 변경에 유연하게 대응 가능

변경된 주요 코드 💻

기존 코드 (MVC)

class BookSearchViewController: UIViewController {
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "BookSearchCell", for: indexPath) as! BookSearchCell
        cell.configure(title: "세이노의 가르침", price: "14,000원")
        return cell
    }
}

변경된 코드 (MVVM)

class BookSearchViewController: UIViewController {
    private let viewModel = BookSearchViewModel()
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "BookSearchCell", for: indexPath) as! BookSearchCell
        let book = viewModel.books[indexPath.row]
        cell.configure(title: book.title, price: "\(book.price)원")
        return cell
    }
}

결론 🎯

MVVM 패턴을 적용하면서 다음과 같은 개선을 이루었다:

  1. 코드의 가독성과 유지보수성 향상
  2. 비즈니스 로직과 UI 로직의 명확한 분리
  3. 테스트 가능한 구조로의 개선
  4. 실제 데이터를 활용한 완성도 있는 앱으로 발전

참고자료 📚

profile
이것저것 많이 해보고싶은 사람

0개의 댓글