MVC 모델은 '프로그램의 처리 역할을 나누어서 프로그램을 작성하는 방법'으로 웹 시스템 개발에 자주 사용되고 있습니다.
역할은 모델(M, Model), 뷰(V, View), 컨트롤러(C, Controller)의 세 종류로 분류합니다.
모델은 시스템에서 비즈니스 로직(Business Logic)을 담당합니다. '비즈니스 로직'이라는 단어는 '시스템의 코어 부분' 혹은 '시스템의 목적을 처리하는 부분' 등을 나타냅니다.
비즈니스 로직을 회원 가입할 때의 상황에 비유하면 사용자가 입력한 아이디의 중복 확인, 본인 인증, 비밀번호 규칙 확인 등이 필요할 것입니다. 이 중에서 아이디 중복 확인의 로직을 생각해보면 우선 사용자가 입력한 아이디 값을 메모리에 저장하고 회원 데이터베이스에서 동일한 아이디가 있는지 확인하고 중복 여부를 화면에 표시할 수 있게 전달하는 것까지가 비즈니스 로직이 됩니다.
뷰는 사용자 입력과 출력 결과 등 시스템에서 표현 부분을 담당하며 웹 어플리케이션에서는 주로 화면을 담당합니다.
컨트롤러는 서비스 처리 담당하는 모델과 화면 표시를 담당하는 뷰를 제어(Controller)하는 역할입니다. 사용자가 입력한 내용을 뷰에서 받고, 받은 데이터를 기준으로 모델에 내용을 전달합니다. 또 모델에서 받은 데이터를 뷰에 전달해서 화면에 표시하는 역할을 합니다.
서비스 처리 모델(M, Model), 뷰(V, View), 컨트롤러(C, Controller)로 분류함으로써 프로그램의 독립성이 높아질 수 있습니다.
스프링 MVC를 간단히 설명하면 '웹 어플리케이션을 간단하게 만들 수 있는 기능을 제공하는 프레임워크'입니다.
스프링 MVC(Spring MVC) 프레임워크는 프런트 컨트롤러 패턴(Front Controller Pattern)을 기반으로 동작합니다. 프런트 컨트롤러 패턴은 웹 애플리케이션에서 들어오는 모든 요청을 하나의 진입점, 즉 프런트 컨트롤러(Front Controller)가 처리하도록 하는 디자인 패턴입니다.
스프링 MVC에서는 DispatcherServlet
이 프런트 컨트롤러 역할을 합니다. 클라이언트의 요청이 들어오면 DispatcherServlet
이 해당 요청을 처리하고, 적절한 핸들러(컨트롤러)에게 전달하여 처리를 진행합니다. 이 패턴을 통해 애플리케이션의 흐름을 중앙 집중화하고, 요청과 응답의 처리를 효과적으로 관리할 수 있습니다.
스프링 MVC의 구성 요소
객체 | 기능 개요 |
---|---|
DispatcherServlet | 모든 요청을 수신하는 프런트 컨트롤러입니다. |
Model | 컨트롤러에서 뷰에 넘겨주는 표시용 데이터 등을 저장하는 객체입니다. ( HttpServeltRequest 혹은 HttpSession 과 같은 기능을 제공합니다.) |
컨트롤러 | 요청에 대해서 처리할 내용이 있는 곳입니다. |
서비스 처리 | 데이터베이스에 접속해서 데이터를 취득 혹은 가공하는 등 여러 가지 작업을 실행합니다. 개발자가 설계하고 구현합니다.(스프링 MVC와 관계는 없습니다.) |
뷰 | 화면 표시 처리를 수행합니다. (구체적으로 JSP 등의 처리를 수행합니다.) |
요청을 받고 응답을 보낼 때까지의 흐름
덧붙여 스프링 MVC는 내부에서 앞에서 언급한 클래스 외에도 다양한 클래스의 처리가 내부에서 발생하지만, DispatcherServlet과 모델에 주목하기 위해 생략했습니다. 번거로운 처리는 스프링 MVC가 담당하기 때문에 실제로 우리가 작성하는 부분은 컨트롤러, 비즈니스 로직 처리, 뷰의 세가지뿐인 것을 알 수 있습니다.
컨트롤러는 POJO 클래스로 작성합니다. POJO(Plain Old Java Ojbect)는 특정한 기술에 종속되지 않고, 특정한 규약을 따르지 않은 간단하고 순수한 자바 객체를 의미합니다.
@Controller
@RequestMapping("hello")
public class HelloViewController {
@GetMapping("view")
public String helloView() {
// 반환값으로 뷰의 이름을 반환
return "hello";
}
}
@Controler
@RequestMapping
value
/
생략이 가능value
생략이 가능 method
RequestMethod.GET
을 사용RequestMethod.POST
를 사용@RequestMapping
을 부여하는 경우에 method
속성 사용이 불가능// value 속성에 처리 대상의 URL 경로를 매핑
@RequestMapping(value = "hello")
// value 속성만 지정하는 경우 생략 가능
@RequestMapping("hello")
// URL 경로를 여러 개 지정 가능
@RequestMapping(value = { "hello", "hellospring"})
// method에서 HTTP 메서드 'GET'을 지정
@RequsetMapping(value = "hello", method = RequestMethod.GET)
// 메서드 여러 개 지정이 가능
@RequestMapping(value = "hello", method = { RequestMethod.GET, ReqeustMethod.POST })
@GetMapping
은 @RequestMapping
의 GET 요청용 어노테이션입니다.
@RequestMapping
의 value
속성과 동일하지만, method
속성은 없습니다.
// value 속성만이라면 생략 가능합니다.
@GetMapping("hello")
// URL을 여러 개 지정할 수 있습니다.
@GetMapping(value = { "hello", "hellospring "})
@GetMapping
은 스프링 프레임워크에서 사용되는 어노테이션 중 하나로, 특정 메서드가 HTTP GET 요청을 처리하는 핸들러 메서드임을 나타냅니다. 이 어노테이션은 보다 간편하고 명시적인 방법으로 GET 요청을 처리하는 메서드를 정의할 수 있게 해줍니다.
기존에는 @RequestMapping
어노테이션을 사용하여 메서드가 어떤 HTTP 메서드를 처리하는지 지정했었습니다. 예를 들면 다음과 같이 사용할 수 있습니다:
@Controller
@RequestMapping("/example")
public class ExampleController {
@RequestMapping(method = RequestMethod.GET)
public String handleGetRequest() {
// GET 요청을 처리하는 로직
return "viewName";
}
}
위 코드에서는 /example
경로에 대한 GET 요청을 처리하는 메서드를 정의하고 있습니다. 그러나 @RequestMapping
은 모든 HTTP 메서드에 대한 처리를 지원하기 때문에 조금 더 간결한 방법이 필요하다는 요구가 있었습니다.
이에 따라 등장한 것이 @GetMapping
어노테이션입니다. 위 코드를 @GetMapping
을 사용하여 다시 작성하면 다음과 같습니다:
javaCopy code@Controller
@RequestMapping("/example")
public class ExampleController {
@GetMapping
public String handleGetRequest() {
// GET 요청을 처리하는 로직
return "viewName";
}
}
@GetMapping
은 기본적으로 @RequestMapping
을 상속받아서 GET 메서드에 특화된 단축 표현으로 볼 수 있습니다. 따라서 더 간결하고 가독성이 좋아집니다. 위의 예제에서는 /example
경로에 대한 GET 요청을 처리하는 메서드를 정의하고 있습니다.
@RequestMapping
의 POST 요청용 어노테이션이 @PostMapping
입니다.
속성은 @RequestMapping
의 value
속성과 동일하지만, method
속성은 없습니다.
// value 속성만이라면 생략 가능합니다.
@PostMapping("hello")
// URL을 여러 개 지정할 수 있습니다.
@PostMapping(value = { "hello", "hellospring "})
@PostMapping
은 스프링 프레임워크에서 사용되는 어노테이션 중 하나로, 특정 메서드가 HTTP POST 요청을 처리하는 핸들러 메서드임을 나타냅니다. @GetMapping
과 유사하게, 이 어노테이션을 사용하여 간편하게 POST 요청을 처리하는 메서드를 정의할 수 있습니다.
예를 들어, 다음은 @PostMapping
을 사용하여 POST 요청을 처리하는 메서드를 정의한 예제입니다:
@Controller
@RequestMapping("/example")
public class ExampleController {
@PostMapping
public String handlePostRequest() {
// POST 요청을 처리하는 로직
return "viewName";
}
}
위 코드에서는 /example
경로에 대한 POST 요청을 처리하는 메서드를 정의하고 있습니다. 이 메서드는 handlePostRequest
라는 메서드명을 가지며, 이 메서드에 @PostMapping
어노테이션이 부여되어 POST 요청을 처리한다는 것을 나타냅니다.
@PostMapping
은 기본적으로 @RequestMapping
을 상속받아서 POST 메서드에 특화된 단축 표현으로 볼 수 있습니다.
따라서 @RequestMapping(method = RequestMethod.POST)
와 같은 의미를 갖습니다.
HelloViewController 클래스는 클래스에 @RequestMapping("hello")
어노테이션을 부여하고 요청 핸들러 메서드에 @GetMapping("view")
어노테이션을 부여 했습니다. 이것으로 클라이언트가 URL(http://locahost:8080/hello/view
)로 GET 메서드를 보내면 HelloViewController 클래스의 helloView 메서드가 호출됩니다.
<!-- html 기본 템플릿 -->
<html>
<head>
<title>View Sample</title>
</head>
<body>
<h1>Hello View!!!</h1>
</body>
</html>
비즈니스 로직을 처리하는 부분은 아직 완성하지 않았지만, 컨트롤러와 뷰만 생성하여 클라이언트가 요청한 URL에 대응해서 요청 핸들러 메서드가 반환값으로 뷰 이름을 돌려주고, 대응하는 뷰를 표시하는 스프링 MVC의 흐름을 조금 이해할 수 있습니다.