인프런 커뮤니티 질문&답변

Xerath님의 프로필 이미지
Xerath

작성한 질문수

앨런 iOS 앱 개발 (15개의 앱을 만들면서 근본원리부터 배우는 UIKit) - MVVM까지

활용-4 앱 (BMI앱) / MVC패턴 적용하기 1 (활용 앱41강)

Model에서의 UIKit import

작성

·

233

0

안녕하세요. 강의 정말 잘 듣고 있습니다.

코드 import와 관련하여 궁금한 점이 생겨서 질문을 남깁니다.

MVC 패턴과 관련하여 공부하다보니 Model에서는 UIKit을 import 하지 않도록 구현을 해야한다고 들었습니다. 혹시 현재 BMI 리팩토링한 코드와 같이 UIKit을 Model에서 import 하는건 문제가 없는지 알고 싶습니다. 감사합니다.

답변 1

1

앨런(Allen)님의 프로필 이미지
앨런(Allen)
지식공유자

네 안녕하세요 Xerath님!

MVC이던 MVVM 아키텍처 패턴이던 간에 Model을 만들때,
일반적인 상황에서 굳이 UIKit을 import할 필요가 없는 것이 맞긴합니다.
(데이터 모델(Model)을 설계할때 화면을 그리는 요소와 관련된 프레임워크(UIKit 등)을 import할 필요가 굳이 없다는 뜻이겠죠.)

그리고 Model에 "반드시(?)" UIKit을 import 하지 않도록 구현하는 것이 맞다고
설명하시는 분(외국 유튜버 등)들도 있는 것을 본 적은 있으나,

(1) 왜 MVC라는 패턴을 만드는 것인지 (아키텍처 패턴이라는 것이 무언인지)
(2) 왜 Model 계층(Layer)을 나누려고 하는 건인지
(3) 왜 UIKit을 굳이 import하지 말라고 하는 것인지(말의 의도와 목적)
등을
한번 생각해보시면 좋을 것 같습니다.

예를 들어 헬스장에서 회원 관리 회원 프로그램을 만든다면,
뷰컨트롤러 안에 아래와 같은 속성을

var memberId: Int = 0
var name: String = "홍길동"
var age: Int = 20
var address: String = "서울시"

이렇게 선언하고 만드셔도 됩니다. (틀린 것이 아니죠.)
이렇게 4개의 데이터가
각자 변수에 각자의 데이터를 담고 있겠죠.


그런데 (1) 유지보수와 (2) 데이터 관리 (3) 논리적인 계층으로 나누었을때 얻는 이점 등...
이런 것들을 고려해서 아래와 같은 식으로 4개의 데이터를 묶어서 관리하려는 것이 훨씬 낫다는 것이죠.
(일반적으로 이런 데이터 모델을 DTO(Data Transfer Object)라고 부릅니다. 쉽게 말하자면 Model을 더 자세하게 부르는 말이라고 보시면 됩니다.)

struct Member {         // (일단 알아보기 쉽게 기본값을 할당해서)
    var memberId: Int = 0
    var name: String = "홍길동"
    var age: Int = 20
    var address: String = "서울시"
}


그래서, 일반적인 모델을 설계할때, 위와 같은 상황에서는 UIKit을 import할 필요가 없습니다. 데이터를 다루는 것이 목적이고, 데이터를 의미 단위로 잘 묶어서 위와 같이 설계하는 것이 누가봐도 논리적일 것이기 때문이고, 일반적으로 UI를 그리는 요소와 관련이 없는 것이 맞습니다.


다만, 말씀하신 BMI 프로젝트에서 BMI모델에서 생각해보시면..
의미 단위 데이터 안에 색상(UIColor)이 들어 있습니다.

struct BMI {
    let value: Double
    let advice: String
    let matchColor: UIColor
}


색상 정보는 "데이터" 일까요? 아니면 UIKit에서 화면을 그리는 요소에 가까워서, 반드시 떼어놓고 생각해야 하는 요소(UIViewController / UIView / UIButton 등)와 비슷한 녀석일까요?

제 생각엔 여기서는 UIKit을 import해서 사용하고 있지만, 단순히 그것은 UIKit에서 사용하는 데이터 색상을 정의하는 "데이터의 형식"일뿐이라고 생각합니다. 데이터의 한 요소고, 그래서 의미 단위로 묶었을때 의미가 생기기 때문에 UIKit을 import해서 사용할 뿐,
실제.. 어떤 로직 / UI 등을 포함하기 위해 UIKit을 import해서 사용하고 있는 것은 아닙니다.
(물론, 굳이 UIKit을 import안 하려면, 조금 다른 방식으로 설계(열거형 등을 사용하거나)해서.. 비슷하게 풀어낼 수는 있을 것 같긴합니다.)


따라서, 제가 바라보는 기준은.. 반드시 Model에 UIKit을 import 하지 않는 것이 맞냐? 라면.. 전 아니라고 생각하는 부분이 있습니다. 데이터의 의미 단위가 중요하고, 즉 Model을 설계하는 목적과 쓰임새가 더 중요하다고 생각하고, 여기서는 단순히 데이터를 묶기 위한 목적인데 데이터의 형식이 UIKit에서 정의되어 있을 뿐이라고 생각합니다.


감사합니다. :)

Xerath님의 프로필 이미지
Xerath
질문자

앨런님~~좋은 말씀 감사합니다!

UIKit이 이름처럼 UI를 다루는 부분이지만 사실 여기서 쓰이는 UIColor는 어떤 BMI와 관련된, 포함된 데이터라는 점에서 모델에서 억지로 빼내는 것은 의미가 없지 않을까 생각을 하고 있었습니다. 그런 점에서 앨런님께서 주신 답변을 통해 import 하는, 하지 말아야 하는 이유를 생각해봤을 때는 이런 건 의미상에서라도 예외적으로 import해도 괜찮다고 생각이 드네요!

 

연휴기간임에도 빠른 답변주셔서 감사합니다!

즐거운 연휴되시기 바랍니다!

앨런(Allen)님의 프로필 이미지
앨런(Allen)
지식공유자

네 감사해요! 좋은 연휴 되세요 :)

Xerath님의 프로필 이미지
Xerath

작성한 질문수

질문하기