Client <- dto -> controller(web) - service - repository(JPA) <- domain(entity) -> DB

MVC 패턴 

  • Model-View-Controller의 약자
  • 개발을 할 때 아래의 3가지 형태로 역할을 나누어 개발하는 방법
    • Model
      • 어플리케이션이 무엇을 할 것인지 정의하는 부분
        • 데이터와 비즈니스 로직을 담당
      • DB와 연동하여 사용자가 입력한 데이터나 사용자에게 출력할 데이터를 다룸
    • View
      • 사용자에게 시각적으로 보여주는 부분
        • 사용자가 보는 화면과 버튼, 폼 등을 디자인하고 구현
    • Controller
      • Model이 데이터를 어떻게 처리할지 알려주는 역할
      • 사용자에 의해 클라이언트가 보낸 데이터가 있으면 모델을 호출하기 전에 적절히 가공하고 모델을 호출함
      • 이후 모델이 업무 수행을 완료하면 그 결과를 가지고 View에게 전달하는 역할
      • Model과 View 사이의 상호작용을 조정하고 제어
      • 사용자의 입력을 받아 Model에 전달하고, Model의 결과를 바탕으로 View를 업데이트 함
  • 위의 3가지 형태로 분리해 각자의 역할에 집중할 수 있게 개발하여 유지보수성, 애플리케이션의 확작성이 증가하고 중복코딩 문제점을 해결할 수 있어 MVC 패턴을 사용

Spring MVC 

  • Spring에서 MVC 디자인 패턴을 적용하여 HTTP 요청을 효율적으로 처리하는 것
  • Spring 공식 문서에서 Spring MVC에 대한 설명으로 ‘DispatcherServlet이 중앙에서 HTTP 요청을 처리해주는데 이는 Front Controller 패턴으로 설계되어있다’라고 설명하고 있음

Servlet (서블릿) 

  • 자바를 사용하여 웹 페이지를 동적으로 생성하는 서버 측 프로그램 혹은 그 사양

- 사용자가 (HTTP) API 요청했을 때 서버 서블릿 동작

  1. 사용자가 Client(브라우저)를 통해 서버에 HTTP Request ( ⇒ API ) 요청
  2. 요청을 받은 Servlet 컨테이너는 HttpServletRequest, HttpServletResponse 객체를 생성
    1. 약속된 HTTP의 규격을 맞추면서 쉽게 HTTP에 담긴 데이터를 사용하기 위한 객체
  3. 설정된 정보를 통해 어떠한 Servlet에 대한 요청인지 찾음
  4. 해당 Servlet에서 service 메서드를 호출한 뒤 브라우저의 요청 Method에 따라 doGet 혹은 doPost 등의 메서드를 호출
  5. 호출한 메서드들의 결과를 그대로 반환하거나 동적 페이지를 생성한 뒤 HttpServletResponse 객체에 응답을 담아 Client(브라우저)에 반환
  6. 응답이 완료되면 생성한 HttpServletRequest, HttpServletResponse 객체를 소멸

Front Controller

  • 모든 API 요청을 앞서 살펴본 서블릿의 동작 방식에 맞춰 코드를 구현한다면 무수히 많은 Servlet 클래스를 구현해야함

프론트 컨트롤러 도입 전의 관계도 출처 : https://velog.io/@cjh8746/%ED%94%84%EB%A1%A0%ED%8A%B8-%EC%BB%A8%ED%8A%B8%EB%A1%A4%EB%9F%AC-%ED%8C%A8%ED%84%B4-%EC%8A%A4%ED%94%84%EB%A7%81

  • 그런 문제를 해결하기 위해 Spring은 DispatcherServlet을 사용하여 Front Controller 패턴 방식으로 API 요청을 효율적으로 처리

프론트 컨트롤러 도입 후의 관계도 출처 : https://velog.io/@cjh8746/%ED%94%84%EB%A1%A0%ED%8A%B8-%EC%BB%A8%ED%8A%B8%EB%A1%A4%EB%9F%AC-%ED%8C%A8%ED%84%B4-%EC%8A%A4%ED%94%84%EB%A7%81

Front Controller 패턴의 특징

  • 프론트 컨트롤러 서블릿 하나로 클라이언트의 모든 요청을 수행
  • 해당 요청을 수행할 컨트롤러를 찾아서 호출
  • 공통 로직을 처리 가능(코드의 중복 제거)
  • Front controller 공통 로직을 처리하고, 각 상황에 따라 해당 역할을 수행할 컨트롤러를 실행

'🗂️ Study > 🌿Spring' 카테고리의 다른 글

정적 페이지 & 동적 페이지  (0) 2024.05.21
Controller  (0) 2024.05.21
Lombok & application.properties  (0) 2024.05.21
Test Code  (0) 2024.05.21
HTTP (HyperText Transfer Protocol)  (0) 2024.05.20