📚 2022년 정리했던 글을 옮겨둔 포스팅입니다. Spring, Mybatis, Oracle을 기준으로 작성되었으며 프로젝트 경로, 프로젝트 명은 가려두었습니다. MVC 패턴 이해를 위해 코드를 뜯어보며 정리했던 글이라 틀린 내용이 있을 수 있습니다.
MVC(Model, View, Controller)
- 사용자 인터페이스, 데이터 및 논리 제어를 구현하는데 널리 사용되는 소프트웨어 디자인 패턴이다.
- 소프트웨어의 비즈니스 로직과 화면을 구분하는데 중점을 두고 있으며, 로직을 분리해 두어 유지보수에 유용하다.
디자인패턴이란?
객체 지향 프로그래밍 설계 시 특정 문맥에서 공통적으로 발생하는 '문제'에 대해 재사용 가능한 해결책으로 사용되는 서술이나 템플릿
Model
정의
애플리케이션의 정보, 데이터를 나타낸다.
Model의 규칙
1. 사용자가 편집하길 원하는 모든 데이터를 가지고 있어야 한다.
2. 뷰나 컨트롤러에 대해 어떠한 정보도 알면 안된다.
👉🏼 데이터 변경이 일어났을 때, 모델에서 화면 UI (View)를 직접 조정해 수정할 수 있도록 뷰를 참조하는 내부 속성값을 가지면 안 된다.
3. 변경이 일어나면, 변경 통지에 대한 처리 방법을 구현해야 한다.
👉🏼 모델의 정보가 변경되면 이벤트를 발생시켜 전달할 수 있도록 해야 하며, 모델의 변경 요청 이벤트를 보냈을 때 이를 수신할 수 있는 처리 방법을 구현해야 한다. (모델이 변경되는 방법을 다른 구성요소들에게 알림)
View
정의
화면에 표시되는 글자, 체크박스와 같은 UI(시각적 요소)를 지칭한다.
View의 규칙
1. 모델이 가지고 있는 정보를 따로 저장해서는 안 된다.
👉🏼 전달받은 모델 정보를 유지하기 위해 임의로 뷰 내부에 저장하면 안 된다.
2. 모델이나 컨트롤러와 같이 다른 구성 요소를 알면 안된다.
👉🏼 모델과 같이 자기 자신을 제외하고 다른 요소를 참조하거나 어떻게 동작하는지 알아서는 안된다.
3. 변경이 일어나면, 변경 통지에 대한 처리 방법을 구현해야 한다.
👉🏼 모델과 같이 변경이 일어났을 때 변경을 통지하는 방법을 구현해야 한다.
Controller
정의
모델과 뷰를 연결해 주는 역할을 하며, 주로 비즈니스 로직이 구현되어 있다.
Controller의 규칙
1. 모델이나 뷰에 대해 알고 있어야 한다.
👉🏼 모델이나 뷰는 서로의 존재를 모른 채 변경이 일어나면 통지하고 수신하는 방법만 가지고 있는데, 컨트롤러가 이를 중재하는 역할을 하므로 모델과 뷰에 대해 알고 있어야 한다.
2. 모델이나 뷰의 변경을 모니터링해야 한다.
👉🏼 모델이나 뷰의 변경을 통지받으면, 이를 해석하여 각각의 구성 요소에게 통지해야 한다.
MVC 패턴 코드로 다시 보기
1. DispatcherServlet
HTTP 프로토콜로 들어오는 모든 요청을 가장 먼저 받아 적합한 컨트롤러에 위임해 주는 프론트 컨트롤러이다.
2. HandlerMapping
요청 정보를 기준으로 어떤 컨트롤러를 사용할 것인지를 결정하는 인터페이스로, 위와 같이 패키지를 지정해 주면
3. Controller
Controller에서 @RequestMapping을 통해 url과 메서드를 매핑시킬 수 있다.
4. Service
DB에 접속하며, 컨트롤러에서 동작을 요청받으면 그 동작을 수행하는 메서드를 호출 및 DAO를 요청한다.
✨ Service와 ServiceImpl
부모인 Service는 Service의 역할을 수행하고, 자식인 ServiceImpl이 이를 상속받아 상세한 구현(implement)을 해낸다. 이때, Service에 모든 작업을 하지 않고 인터페이스(interface)로 생성한 뒤 자식인 Impl이 세부 작업을 수행하는데, 왜 이렇게 나누어둔 걸까?
👉🏼 인터페이스란 객체를 어떻게 구성할지 정리한 설계도이다. 따라서 그 설계도에 따른 세부 객체 (여기서의 ServiceImpl)를 각각 만들어 기증에 일부 수정사항이 있을 경우 모든 코드를 수정하지 않고 객체에서 일부분만 수정할 수 있도록 하는 것이다.
👉🏼 이는 객체지향의 3가지 특성 중 하나인 다형성과도 연관 지을 수 있다. 다형성의 특징은 다음과 같다.
- 하나의 클래스나 메서드가 다양한 방식으로 동작할 수 있음
- 부모 클래스가 자식 클래스의 값으로 대체되는 오버라이딩
- 같은 메서드의 매개변수(parameter)에 따라 다르게 동작하는 오버로딩
오버라이딩과 오버로딩
- 오버라이딩 : 부모 클래스의 함수를 다시 정의하여 사용하는 것
- 오버로딩 : 클래스 내에 같은 이름의 메서드를 여러 개 선언할 수 있으나 입력받은 매개변수의 타입과 개수에 따라 다르게 출력하도록 하는 것
❗ 따라서 하나의 부모인 Service를 인터페이스라는 설계도로 만들어 두면, 여러 자식인 ServiceImpl들이 부모를 오버라이딩해와 설계도와 구상에 따른 기능을 구현, 입/출력, 전달하고 후에 기술할 내용이지만 그 값을 다시 부모인 Service가 받아와 데이터를 넘겨주는 것이다.
5~6. DAO
SQL문을 실행한 뒤 실행 결과를 리턴한다.
7. 다시 Service
DAO로부터 결괏값을 받아 리턴한다.
8~9. 다시 Controller
Service로부터 결과값을 받아 리턴하는데, 이때 결과를 출력할 View명과 그 화면에 전달할 데이터를 model에 담아 넘긴다.
10~11. 다시 DispatcherServlet
컨트롤러에서 전달된 View명을 이용해 prefix, suffix값을 붙여 View를 검색하고 해당 View를 리턴해 클라이언트의 요청에 응답한다.
[참고 자료]
https://bsnippet.tistory.com/13
모델-뷰-컨트롤러(Model-View-Controller MVC)
컴퓨터 프로그램을 개발하면 흔히 MVC 구조, MVC 패턴, MVC 아키텍처라는 단어를 많이 듣게 된다. 그리고 그 뒤에 간단한 설명이 뒤 따른다. MVC에서 모델은 애플리케이션의 정보(데이터)를 나타내며
bsnippet.tistory.com