MVC (Model-View-Controller)
소프트웨어 디자인 패턴 중 하나이다. MVC 패턴은 소프트웨어를 구성하는 요소들을 Model, View, Controller로 구분하여 각각의 역할을 분리한다.
디자인 패턴: 객체 지향 프로그래밍 설계 시 특정 문맥에서 공통적으로 발생하는 문제에 대해 재사용 가능한 해결책으로 사용되는 서술이나 템플릿
- Model: 데이터와 비즈니스 로직을 담당한다. 데이터베이스와 연동하여 데이터를 저장하고 불러오는 등의 작업을 수행한다.
- View: 사용자 인터페이스를 담당한다. 사용자가 보는 화면과 버튼, form 등을 디자인하고 구현한다.
- Controller: Model과 View 사이의 상호작용을 조정하고 제어한다. 사용자의 입력을 받아 Model에 전달하고, Model의 결과를 바탕으로 View를 업데이트한다.
MVC 패턴을 사용함으로써 소프트웨어의 비즈니스 로직과 화면을 구분하는데 중점을 두고 있으며, 코드의 재사용성과 유지보수성을 높이고, 개발자들 간의 협업을 용이하게 할 수 있다.
Spring의 MVC
1. Servlet
Servlet은 Java 언어로 작성된 서버 사이드 웹 애플리케이션 컴포넌트이다.
- 클라이언트로부터 요청 받아서 처리하고, 응답을 생성하여 클라이언트에게 전송한다.
- HTTP 요청과 응답에 대한 처리를 담당하며, Java EE(Enterprise Edition) 플랫폼의 일부로 제공된다.
- 웹 애플리케이션에서 동적인 컨텐츠를 생성하거나, 데이터베이스와 연동하여 데이터를 처리하는 등의 작업을 수행할 수 있다.
- 일반적으로 웹 애플리케이션 서버에서 실행되며, 템플릿 엔진과 함께 웹 애플리케이션을 개발하는 경우가 많다.
- 템플릿 엔진: 웹을 동적으로 처리하기 위해 만들어진 것으로 JSP, Thymeleaf등이 있다.
2. Tomcat
Tomcat은 Servlet 컨테이너이다. Servlet은 Java 언어를 기반으로 웹 애플리케이션을 개발할 수 있는 기술이다.
- Servlet을 실행하고 관리하기 위한 환경을 제공한다. 따라서, Servlet을 사용하는 웹 애플리케이션을 개발하려면 Tomcat과 같은 Servlet 컨테이너가 필요하다.
- Tomcat은 HTTP 요청을 처리하기 위해 HTTP 서버와 연결된 방식으로 동작한다.
- 클라이언트의 요청을 받아서 적절한 Servlet을 실행하고, Servlet에서 생성된 응답을 클라이언트에게 전송한다.
- 클라이언트에서 요청이 들어오면, Tomcat은 HTTP 서버에서 요청을 받아들이고, 해당 요청을 처리할 적절한 Servlet을 찾는다.
- Servlet이 요청을 처리하고 생성한 응답을 다시 HTTP 서버로 전송한다. HTTP 서버는 응답을 클라이언트로 전송하고, 연결을 종료한다.
- Tomcat은 Servlet을 실행하기 위해 Java Virtual Machine(JVM)을 사용한다.
- JVM의 인스턴스를 생성하고 Servlet을 로드한다. JVM은 Servlet 코드를 실행하고, Servlet이 요청을 처리하고 생성한 응답을 Tomcat에게 반환한다.
3. Servlet과 MVC
Servlet을 이용하면 Model과 View 사이의 상호작용을 조정하고 제어하는 Controller 역할을 수행할 수 있다.
- Servlet을 이용하면 클라이언트의 요청을 처리하고, 요청에 따른 적절한 데이터를 Model에서 가져와서 View에게 전달하는 역할을 할 수 있다.
- ex.) 사용자가 로그인 요청을 보냄 -> Servlet은 요청을 처리하고 -> 입력한 id와 password를 model에서 확인 -> 인증이 되면 로그인 성공 페이지를 보여줌
- MVC 패턴을 이용하면 Servlet을 이용하여 Controller 역할을 수행하고, 템플릿 엔진을 이용하여 View 역할을 수행할 수 있다.
- 템플릿 엔진은 HTML과 Java 코드가 결합된 형태로 웹 페이지를 생성할 수 있는 기술이다. 템플릿 엔진은 Model에서 가져온 데이터를 HTML 형식으로 출력하는 역할을 수행한다.
- 즉, Servlet과 MVC 패턴을 함께 사용하면, 웹 애플리케이션의 구조를 명확하게 설계할 수 있고, 각각의 역할을 분리하여 개발 및 유지보수를 보다 쉽게 할 수 있다.