
DispatcherServlet
스프링 MVC의 프론트 컨트롤러로 작동합니다. 모든 웹 요청을 처음 받아들이고, 요청을 적절한 핸들러(컨트롤러)에게 전달하기 위해 핸들러 매핑을 조회합니다. 그 후 응답이 반환될 때까지 요청의 생명주기를 관리합니다.
Handler Mapping
웹 요청(URL과 HTTP 메서드 등)을 처리할 수 있는 핸들러(컨트롤러)를 찾아내는 역할을 합니다. Dispatcher Servlet은 Handler Mapping에게 현재 요청을 처리할 수 있는 핸들러를 조회하도록 요청합니다.
Handler Adapter
Dispatcher Servlet이 선택한 핸들러(컨트롤러)를 실행할 수 있도록 중간에서 매개하는 역할을 합니다. Handler Adapter는 컨트롤러의 메서드를 호출하고, 컨트롤러가 반환하는 값을 Dispatcher Servlet이 이해할 수 있는 형태로 변환합니다. 다양한 타입의 컨트롤러를 지원하기 위해 존재합니다.
Controller ( Handler )
실제 웹 요청을 처리하는 컴포넌트입니다. 사용자의 요청에 따라 비즈니스 로직을 수행하고, 결과 데이터를 모델에 담아 뷰에 전달하거나, 다른 컨트롤러로 리다이렉트하는 등의 작업을 합니다.
View Resolver
컨트롤러가 반환하는 뷰 이름(String)을 실제 뷰 객체(예: JSP, Thymeleaf 템플릿)로 변환하는 역할을 합니다. 이를 통해 Dispatcher Servlet은 뷰 이름에 해당하는 실제 뷰를 찾아 클라이언트에게 응답을 전달할 수 있습니다.
View
최종적으로 사용자에게 보여질 UI를 생성합니다. 모델 데이터를 사용하여 렌더링 과정을 거치고, 결과적으로 클라이언트에게 HTML, JSON, XML 등의 형태로 응답을 제공한다.
MVC(Model-View-Controller) 아키텍처에서 모델은 애플리케이션의 데이터와 비즈니스 로직을 나타낸다.
애플리케이션이 작동하는 데이터에 대한 액세스 및 관리, 상태에 대한 정보 요청(일반적으로 컨트롤러의) 및 상태 변경 지침(또한 컨트롤러의)에 응답하는 일을 담당한다.
User Model
@Getter
@Setter
public class User {
private String id;
private String name;
private String email;
public User(String id, String name, String email) {
this.id = id;
this.name = name;
this.email = email;
}
}
컨트롤러는 애플리케이션의 데이터와 비즈니스 로직을 나타내는 모델과 해당 데이터를 사용자에게 표시하는 뷰 사이의 중개자 역할을 합니다.
컨트롤러는 사용자로부터 들어오는 요청을 처리하고 이를 해석하며(종종 사용자 입력 또는 작업을 통해) 모델과 상호 작용하여 해당 요청을 기반으로 데이터를 검색하거나 작업을 수행합니다.
그런 다음 컨트롤러는 새 데이터나 업데이트된 데이터를 표시하기 위해 View를 선택하거나, 또는 JSON 데이터를 반환하기도 한다.
View를 선택하는 Controller
@Controller
public class UserController {
@GetMapping("/home")
public String homePage() {
return "home";
}
@GetMapping("/doit")
public String doitPage() {
return "doit";
}
@GetMapping("/user")
public String userPage(@RequestParam("name") String name, Model model) {
model.addAttribute("name", name);
return "user";
}
}
그 외 데이터를 반환하는 RestController
RestController는 스프링 MVC에서 RESTful 웹 서비스를 만들기 위한 특수한 컨트롤러입니다. RestController 어노테이션은 클래스 레벨에 적용되며, **@Controller**와 **@ResponseBody**를 결합한 것으로, 모든 핸들러 메서드의 리턴값을 HTTP 응답 본문으로 사용한다는 것을 의미한다.
JSON
@RestController
public class UserRestController {
private Map<String, User> users = new HashMap<>();
@GetMapping("/hello")
public String hello() {
return "hello";
}
@PostMapping("/user")
public User createUser(@RequestBody User user) {
// 유저를 생성하고 리턴
users.put(user.getId(), user);
return user;
}
@GetMapping("/user")
public Collection<User> getAllUser() {
// 전체 유저를 리턴
return users.values();
}
@GetMapping("/user/{id}")
public User getUser(@PathVariable String id) {
// id에 해당하는 유저를 리턴
return users.get(id);
}
@PostMapping("/user/{id}")
public User updateUser(@PathVariable String id, @RequestBody User user) {
// id에 해당하는 유저를 업데이트하고 리턴
users.put(id, user);
return user;
}
}