본문 바로가기
Spring

MVC 아키텍처

by 매트(Mat) 2021. 5. 21.

자바 웹 개발 워크북 참고!

 

MVC 아키텍처

올인원 All-in-one 방식과 문제점

서블릿으로 클라이언트의 요청을 처리하고, 모든 것을 서블릿이 담당했습니다. 이것이 올인원 방식입니다.

캡처
  • 처음 사업할 때 한 사람이 개발과 관리를 모두다 한다면 어떤 요구사항이 들어와도 의사결정이 빠를 것이고, 유지 비용도 적게든다는 측면에서 스타트업 기업에는 매우 적합합니다.
  • 하지만 기업이 점점 커지면 일을 분할시켜야 할텐데 이 올인원 방식은 유지보수가 어려워지고, 운영 비용이 증가하게 될 것입니다.
  • 그래서 역할을 세분화해서 나온 것이 MVC 패턴입니다.

컨트롤러(Controller) 컴포넌트 역할

  • 클라이언트의 요청을 받았을 때 그 요청에 대해 실제 업무를 수행하는 모델 컴포넌트를 호출하는 일입니다. 또한, 클라이언트가 모델을 호출할 때 전달하기 쉽게 데이터를 적절히 가공하는 일을 합니다. 모델이 업무 수행을 완료하면, 그 결과를 가지고 화면을 생성하도록 뷰에게 전달합니다. 즉, 클라이언트 요청에 대해 모델과 뷰를 결정하여 전달하는 일을 합니다.

모델(Model) 컴포넌트 역할

  • 데이터베이스와 연동하여 사용자가 입력한 데이터나 사용자에게 출력할 데이터를 다루는 일을 합니다. 특히 여러 개의 데이터 변경 작업을 하나의 작업으로 묶은 트랜잭션을 다루기도 합니다.

뷰(View) 컴포넌트 역할

  • 모델이 처리한 데이터나 그 작업 결과를 가지고 사용자에게 출력할 화면을 만드는 일을 합니다. 즉, 뷰 컴포넌트는 HTML, CSS, JavaScript를 사용하여 웹 브라우저가 출력할 UI를 만듭니다.



MVC 구동 원리


캡처
  1. 먼저 웹 브라우저가 요청을 하면, 웹 서버가 그 요청을 받아서 서블릿 컨테이너(톰캣)에 넘겨줍니다. 서블릿 컨테이너는 URL을 확인하여 그 요청을 처리할 서블릿을 찾아서 실행합니다.

  1. 서블릿은 실제 업무를 처리하는 모델 자바 객체의 메소드를 호출합니다. 만약 웹 브라우저가 보낸 데이터를 저장하거나 변경해야 한다면, 그 데이터를 가공하여 값 객체(VO; Value Object)를 생성하고 모델 객체의 메소드를 호출할 때 인자값으로 넘깁니다. 모델 객체는 EJB(Enterprise JavaBeans)일 수도 있고, 일반 자바 객체(POJO: Plain Old Java Object)일 수도 있습니다.

  1. 모델 객체는 JDBC를 사용하여 매개변수로 넘어온 값 객체를 데이터베이스에 저장하거나 질의 결과를 가져와서 값 객체를 만들어 반환합니다. 이렇게 값 객체는 객체와 객체 사이에 데이터를 전달하는 용도로 사용하기 때문에 데이터 전송 객체(DTO: Data Transfer Object)라고도 합니다.

  1. 서블릿은 모델 객체로부터 받은 값을 JSP로 전달합니다.

  1. JSP는 서블릿으로부터 전달받은 값 객체를 참조하여 웹 브라우저가 출력할 결과 화면을 만듭니다. 그리고 웹 브라우저에 출력함으로써 요청 처리를 완료합니다.

  1. 웹 브라우저는 서버로부터 받은 응답 내용을 화면에 출력합니다.



값 객체(VO) = 데이터 수송 객체(DTO)

DB에서 가져온 정보를 JSP 페이지에 전달하려면 그 정보를 담을 객체가 필요합니다. 이렇게 값을 담는 용도로 사용하는 객체를 값 객체(VO)라고 합니다. 값 객체는 계층 간 또는 객체 간에 데이터를 전달하는데 이용하므로 데이터 수송 객체(DTO)라고도 부릅니다. 또한 VO는 업무영역의 데이터를 표현하기 때문에 객체지향 분석 및 설계 분야에서는 도메인 객체(Domain Object)라고 합니다.

캡처
 

 

 

'Spring' 카테고리의 다른 글

DI, IoC, root-context.xml  (0) 2021.05.31
웹 프로젝트 폴더 구조  (0) 2021.05.21
intellij에서 Spring Boot + jsp 사용하기  (0) 2021.05.12
cannot deserialize from object value 에러!  (0) 2021.05.12
Spring Boot와 MySQL 연동 (쉬움)  (0) 2021.05.12

댓글