▼ Why ?
스프링 패키지의 구조에 대해 공부하려고 찾아보다가, MVC 패턴이라는 Architecture를 알게 되었고 이 Architecture를 먼저 이해해야 할 필요성을 느껴서 MVC 패턴을 먼저 공부해보려고 한다.
▼ 웹 애플리케이션 개발 패턴
Model 1 (실제로 쓰일 일 X)
- JSP에서 출력(View)과 로직을 전부 처리하는 방식
➜ Controller 영역에 View 영역을 같이 구현해주고, 사용자의 요청을 모두 JSP가 처리한다 - 빠르고 쉽게 개발 가능
- 구조가 비교적 간단하고 코드가 짧을수록 직관적이다
➜ 길어질수록 가독성이 떨어지고, 유지보수가 불편해진다
Model 2 (MVC 패턴)
- JSP에서 출력만 처리, Controller에서 모든 요청을 처리하는 중앙화 방식
➜ 이 모델이 MVC 패턴을 적용한 것 ! - 사용자의 요청(http 요청)을 ' Servlet ' 이 받고, ' Servlet ' 이 해당 요청에 따라 View로 보여줄 것인지 Model로 보낼 것인지 판단하여 전송한다
- 비즈니스 로직(Controller), 프레젠테이션 뷰(View), 데이터(Model)를 분리할 수 있다
➜ 코드의 유지보수에 유리 ! - 오랫동안 널리 사용해온 개발 패턴인 만큼 단순하다는 장점이 있지만,
View와 Model 사이의 의존성이 높은 패턴이기 때문에 프로젝트의 규모가 커질수록 복잡해져 유지보수를 어렵게 만들 수 있다.
➜ 'MVP', 'MVVM' 같은 패턴들이 이 단점들은 보완하기 위해 나온 패턴들이다 !
▼ Servlet
Java Servlet ?
- 서버에서 정적인 자료(html, 사진, 글 등) 말고도 사용자 요구에 맞춘 동적인 웹 페이지를 주고 받기 위해 만들어진 것
➜ 클라이언트의 요청에 맞춰 동적인 결과를 만들어 주는 웹 어플리케이션 컴포넌트 ! - 웹 서버의 성능을 향상시키기 위한 일종의 class
- WAS(Web Application Servlet)의 Servlet Container 안에서 동작
➜ 요청(Request)을 받으면 요청에 맞는 로직을 실행하고 클라이언트에게 HTTP 형식으로응답(Response)하게 된다 - Servlet Container
- Servlet class에 맞춰 Servlet을 관리하며 클라이언트의 요청을 받으면 HttpServletRequest와 HttpServletResponse 객체를 생성하여 post, get 여부에 따라 동적인 페이지를 생성하며 응답한다
- Servlet의 생명 주기를 관리
(Servlet class의 인스턴스화(Instantiate), 초기화 메서드 호출, 요청에 따른 메서드 탐색, Gerbage Collection을 통해 메모리에서 제거) - 클라이언트와의 통신을 위한 웹서버와 소켓 생성 및 필요한 API 제공
- 멀티쓰레드 지원 및 관리 ➜ 요청을 받을 때마다 새로운 Java 쓰레드 생성
- 보안 관련 기능 지원 (보안 관련 메서드 구현할 필요 X)
- Servlet의 생명 주기를 관리
- Servlet의 특징
- html을 사용하여 응답
- Java의 쓰레드를 이용
- MVC 패턴에서 Controller의 역할
- HTTP 프로토콜 서비스를 지원하는 javax.servlet.http.HttpServlet class를 상속
- html 변경 시 Servlet을 다시 컴파일을 해줘야 한다
▼ MVC 패턴
- Model + View + Controller ➜ MVC
- 프로젝트를 구성할 때 그 구성요소를 세 가지 역할로 구분한 패턴
➜ 이 패턴을 웹(Web)에 적용한다면 ?
- 사용자가 웹사이트에 접속 (User)
- ' Controller ' 는 사용자가 요청한 웹페이지를 서비스하기 위해 ' Model ' 을 호출 (Manipulates)
- ' Model ' 은 DB나 파일과 같은 데이터 소스를 제어한 후 그 결과를 Return
- ' Controller ' 는 ' Model ' 로부터 반환받은 결과를 ' View ' 에 반영 (Updates)
- 반영한 데이터를 바탕으로 ' View ' 를 통해 화면을 보여준다
Model
- 데이터를 가진 객체 ➜ Model
- Model의 상태에 변화가 있을 때 ' Controller ' 와 ' View ' 에 이를 통보
- Model의 규칙
- 사용자가 편집하기를 원하는 모든 데이터를 가지고 있어야 한다
- ' View ' 나 ' Controller ' 에 대해서 어떠한 정보도 알지 말아야 한다
- 데이터 변경에 대한 처리방법이 있어야 한다
- 재사용 가능해야 한다
- 사용자가 편집하기를 원하는 모든 데이터를 가지고 있어야 한다
- 스프링에선 Service, DTO, Repository, Domain에 해당된다.
View
- 데이터 및 객체의 입출력 담당
➜ 사용자가 볼 결과물을 생성하기 위해 ' Model ' 로부터 정보를 얻어온다 - View의 규칙
- ' Model ' 이 가지고 있는 정보를 따로 저장 X
- ' Model ' 이나 ' Controller ' 와 같이 다른 구성 요소를 몰라야 한다
- ' Model ' 이 가지고 있는 정보를 따로 저장 X
- 스프링에선 프론트엔드(Front-end)에 해당한다.
Controller
- 사용자가 접근한 URL에 따라 사용자의 요청사항을 파악한 후에 그에 맞는 데이터를 ' Model ' 에 요청하고, 가져온 데이터를 ' View ' 에 반영해서 사용자에게 알려준다
➜ MVC 패턴에서 ' Model ' 과 ' View ' 를 이어주는 다리 역할라고 할 수 있다 - Controller의 규칙
- ' Model ' 과 ' View ' 에 대해 알고 있어야 한다
➜ ' Model ' 과 ' View ' 가 Controller에 의존하게 되는 단점 존재 - ' Model ' 과 ' View ' 의 변경을 모니터링 해야 한다
- ' Model ' 과 ' View ' 에 대해 알고 있어야 한다
- 스프링에선 Controller에 해당된다.