MVC 패턴에 대해서 설명해주세요.
MVC는 Model-View-Controller의 약자로, 소프트웨어 디자인 패턴 중 하나입니다. MVC 패턴은 소프트웨어를 모델, 뷰, 컨트롤러라는 세 가지 구조로 나누어 개발하는 방법으로 코드의 모듈화를 통해 유지보수를 편리하게 하는데 목적이 있습니다. 각 부분의 역할은 다음과 같습니다.
1.
모델(Model):
•
어플리케이션의 데이터와 비즈니스 로직을 담당합니다.
•
데이터의 상태를 관리하고, 상태가 변경될 때 알림을 통해 뷰 및 컨트롤러에 변경을 알려줍니다.
•
데이터 베이스와 가장 가까운 영역입니다.
2.
뷰(View):
•
사용자에게 데이터를 시각적으로 표현하고 사용자 입력을 받는 부분입니다.
•
모델의 데이터를 표시하고, 사용자가 입력한 정보를 컨트롤러로 전달합니다.
•
클라이언트와 가장 가까운 영역입니다.
3.
컨트롤러(Controller):
•
사용자의 입력을 받아 모델 또는 뷰에 전달하고, 각 요소 간의 상호 작용을 관리합니다.
•
모델의 데이터가 변경되었을 때, 이를 감지하고 뷰에 알리는 역할을 수행합니다.
•
모델과 뷰를 연결시켜주는 중간 역할을 합니다.
추가질문
장점과 단점을 간략히 알려주세요
MVC 패턴으로 구조별 모듈화, 독립성을 가지게 되므로 코드의 재사용성, 유연성과 확장성, 테스트 용이성을 증가 시킬 수 있습니다. 또한 여러 개발자들이 동시에 개발 할 수 있는 병렬 개발이 가능해집니다. 현재 서비스들이 복잡해지면서 특히 점점 비지니스 로직이 복잡해지고 거대해지고있습니다. 비지니스 로직을 모델 부분으로 분리함으로써 개발자로부터 보다 비지니스 로직에 집중하여 개발 할 수 있는 장점도 있습니다.
단점으로는 작은 규모의 프로젝트에서는 이러한 구조화가 오히려 프로젝트를 복잡하게 만들 수도 있습니다. 복잡성이 증가하면서 파일 및 클래스가 과도하게 늘어 날 수도 있습니다. 또한 처음에는 구조와 상호작용 흐름 등을 파악해야 구현할 수 있는 러닝 커브가 있습니다.
추가질문
데이터와 관련되서 DAO, VO, DTO, Entity, Domain 등 용어가 혼용되기도합니다. 간략하게 각각 어떤것인지 설명이 가능할까요?
Servlet,Jsp를 학습 할 때 처음 DAO, DTO, VO 를 접했었습니다. 그때 당시만 해도 정확한 이해도가 없이 이렇게 구현하면 데이터를 읽고 수정하여 데이터베이스에 반영되는구나 정도로 이해했습니다. 이후 스프링부트를 학습하면서 Entity 클래스를 정의하고 사용하면서 혼동되기도 해서 다시 정리해보았습니다.
우선 VO는 데이터의 값을 나타내기 위한 기본 값들을 가진 데이터로, 불변(immutable)하게 설계되어 주로 읽기 전용으로 사용됩니다. 특히 엔티티와 유사한 용어로 사용되기도 합니다.
DTO는 Data Transfer Object로 데이터의 전송을 위해 사용되는 객체로, 주로 계층 간의 데이터 전달을 위해 사용되는 객체입니다. 클라이언트-컨트롤러-서비스-레포지토리와 같이 계층간의 이동에서 DTO 형태로 이동합니다.
Entity는 데이터베이스에서 영속적으로 저장되는 객체를 나타냅니다. 특히 ORM(Object-Relational Mapping) 기술을 사용하는 경우, 엔티티 클래스는 데이터베이스의 테이블과 매핑되어 데이터베이스의 행(row)을 나타냅니다. VO와 혼용되기도 하며, DAO의 역할을 할 수도 있습니다.
DAO는 Data Access Object로 실제로 DB에 접근하는 객체입니다. CRUD 쿼리가 실행될 때 직접 들어가게 됩니다.
도메인 객체는 Domain Object로 개발하고자 하는 영역을 분석하고, 그 분석의 결과로 도출된 객체를 말합니다. 이 말은 웹 도서관 서비스에서 유저플로우를 분석해보면, 도서등록, 도서조회, 도서대출, 도서반납 과 같은 과정이 들어갈 때, 가장먼저 온라인 도서관이란 상위 도메인이 정의되고, 그 안에는 회원, 도서, 대출, 반납 과 같이 사물이나 기능을 객체화 시키는데 이 결과들을 도메인이라 할 수 있습니다. 이러한 과정에 따라서 각 엔티티는 해당 도메인의 특성을 나타내기 위한 필드와 메서로 구성하고 개발하는 과정은 객체지향적인 설계 원칙을 따르면서 도메인 주도 설계(Domain-Driven Design, DDD)를 지향하는 것이라고 생각합니다. 제가 진행했던 스프링부트 프로젝트에서는 기획 단계에서 유저플로우를 먼저 작성하고 분석하여 기능으로부터 각 사물들과 기능들을 객체처럼 구분하고 테이블로 구성하여 DB를 설계했습니다.
프로젝트의 규모를 작게 MVP로 시작하게 되어 VO를 별도로 구분하지 않고 엔티티가 VO역할을 동시에 하게 설계되었습니다. 따라서 엔티티에서 정의된 데이터들은 DTO를 통해서 여러 비지니스로직에서 활용되고 변형되고 다시 엔티티로 쿼리를 통해 DB에 접근하여 CRUD를 실행하여 DAO의 역할까지 하게 되었습니다. 이렇게 코드의 단순화와 유연성을 위해 엔티티가 여러 역할을 동시에 수행하도록 개발이 진행되었습니다.