안녕하세요 공공돌🧸 입니다 !!
오늘은 MVC란 무엇인지에 대해서 알아보겠습니다.
제가 알고 있던 MVC 패턴이란 Model, View, Controller로 나누어서 코딩을 한다는 정도로 알고 있었지만, 이번 3주 차 우아한테크코스 프리코스 미션 목표를 MVC 패턴으로 잡은 만큼 MVC가 무엇인지, 왜 사용하는지에 대해 깊게 생각해 보고 알아보려고 합니다.
MVC 관련 내용은 우아한테크 유튜브에 [10분 테코톡] 🧀 제리의 MVC 패턴 을 참고하였습니다.
MVC 란?
코드의 대한 유지보수를 어떻게 하면 편하게 할 수있을까? 고민하다가 탄생한 패턴 중 하나.
Model, View, Controller로 구성된 디자인 패턴
MVC 왜 필요한가?
초기 소프트웨어 개발에서 발생하는 아래와 같은 어려움을 해결하기 위한 목적으로 등장했습니다.
- 유지 보수의 어려움 : 초기에 소프트웨어 개발에서는 코드가 작고 단순했지만, 시간이 흘러감에 따라 소프트웨어의 복잡성이 증가했습니다. 초기 개발에서는 코드를 쉽게 수정하거나 유지 관리하지만, 복잡한 코드 기반에서 이러한 작업은 어려워졌습니다.
- 재사용의 부족 : 초기 소프트웨어 개발에서는 코드의 재사용을 고려하지 않았기 때문에 매번 비슷한 기능을 다시 구현해야 했습니다. 이로 인해 생산성이 저하되고 비효율적이었습니다.
- 코드의 구조화 필요 : 복잡한 소프트웨어 애플리케이션은 코드의 구조화와 구분이 필요했습니다. 코드를 관리하고 효율적으로 작동시키기 위해서는 논리적으로 구분된 부분으로 나누어야 했습니다.
- 다양한 플랫폼 및 환경 지원 : 다양한 플랫폼과 환경에서 소프트웨어를 실행하고 사용해야 하는 요구사항이 늘어났습니다. MVC 패턴은 다양한 뷰와 컨트롤러를 모델과 결합하여 동일한 모델을 기반으로 다양한 사용자 인터페이스를 지원하는데 도움을 줍니다.
- 소프트웨어 개발의 진보 : 소프트웨어 개발의 진보와 프로그래밍 언어의 발전으로 코드의 구조화와 모듈화가 더욱 중요해졌습니다. MVC 패턴은 이러한 진보에 부응하기 위해 도입되었습니다.
MVC 패턴은 이러한 요구사항을 충족시키기 위해 개발되었으며, 코드의 가독성, 유지 보수성, 재사용성을 향상 시키고 개발자들에게 코드를 보다 효율적으로 관리하고 개선할 수 있는 구조를 제공합니다. 이러한 이유로 MVC 패턴은 소프트웨어 개발에서 널리 사용되며 여전히 많은 모던 프레임워크와 플랫폼에서 사용되고 있습니다.
MVC 구조
![](https://blog.kakaocdn.net/dn/dbQRRy/btszMaVIwjL/YbiwMFC1KHdtnfekcLcPT0/img.png)
- 모델(Model) : 애플리케이션 데이터만을 포함하고, 데이터 조작하는 로직을 포함하지 않습니다.
- 뷰(View) : 모델(데이터)를 사용자에게 표시합니다.
- 컨트롤러 (Controller): 뷰와 모델 사이에 컨트롤러가 있습니다. 뷰(또는 다른 외부 소스)에 의해 변경요청된 이벤트들을 감지하고, 이러한 이벤트들에 대한 적절한 로직을 실행합니다.
MVC를 지키면서 코딩하는 5가지 방법
1. Model은 Controller와 View에 의존하지 않아야 한다.
Model 내부에 Controller와 View에 관련된 코드가 있으면 안 된다.
class User(val id: Int, var name: String)
class UserModel {
private val users = mutableListOf<User>()
fun addUser(user: User) {
users.add(user)
}
fun getUserById(id: Int): User? {
return users.find { it.id == id }
}
fun updateUser(user: User) {
val existingUser = getUserById(user.id)
existingUser?.name = user.name
}
fun getAllUsers(): List<User> {
return users.toList()
}
}
2. View는 Model에만 의존해야 하고 Controller에는 의존하면 안 된다.
View 내부에 Model의 코드만 있을 수 있고, Controller의 코드가 있으면 안 된다.
class UserProfileView(private val model: UserModel, private val userId: Int) {
fun displayUserInfo() {
val user = model.getUserById(userId)
if (user != null) {
println("User ID: ${user.id}")
println("User Name: ${user.name}")
} else {
println("User not found.")
}
}
}
3. View가 Model로부터 데이터를 받을 때는, 사용자마다 다르게 보여주어야 하는 데이터에 대해서만 받아야 한다.
![](https://blog.kakaocdn.net/dn/dQBd17/btszMddNlCT/e8EBFsguYbgo5rRhXYgPjK/img.png)
- 모델 : 사용자 마다 다르게 보여줘야 하는 부분
- UI : 모든 사용자에게 똑같이 보여줘야 하는 부분
모든 사용자한테 똑같이 보여줘야 하는 부분을 Model로 부터 받으면 안되고 View가 자체적으로 가지고 있어야 하는 정보들이다.
4. Controller는 Model과 View에 의존해도 된다.
Controller 내부에는 Model과 View의 코드가 있을 수 있다.
class UserController(private val model: UserModel, private val view: UserView) {
fun updateUserDetails(userId: Int, newName: String) {
// 사용자 입력 처리
val user = model.getUserById(userId)
if (user != null) {
// 사용자 정보 업데이트
user.name = newName
// 모델 업데이트
model.updateUser(user)
} else {
println("User not found.")
}
// 뷰 업데이트
view.displayUser(userId)
}
}
5. View가 반드시 Model로부터 데이터를 받을 때 반드시 Controller에서 받아야 한다.
class UserView(private val controller: UserController) {
fun displayUserDetails(userId: Int) {
// Controller를 통해 Model로부터 데이터를 받음
val userData = controller.getUserData(userId)
if (userData != null) {
println("User ID: ${userData.id}")
println("User Name: ${userData.name}")
} else {
println("User not found.")
}
}
}
이번에 MVC에 대해 알아보고 정리하면서 MVC 패턴이란 무엇인지, MVC 패턴을 지켰을 때 코드의 유지 보수성이 높아진다는 것과 코드를 작성하는 방법을 통해 패턴을 잘 지키고 있는지 스스로 파악하고 유지 보수성이 높은 코드를 작성할 수 있는 첫 발자국이 될 수 있었던 것 같습니다.
공부하는 공돌이, 공공돌입니다🐻
@sheep1sik
'메모장' 카테고리의 다른 글
단위 테스트(Unit Test) (1) | 2023.12.26 |
---|---|
Swift 튜플 (2) | 2023.03.29 |
Swift 집합 연산 (2) | 2023.03.28 |
Swift 집합의 동적 추가와 삭제 (3) | 2023.03.24 |
Swift 집합 순회 탐색 (2) | 2023.03.22 |