
Spring MVC는 Model-View-Controller 패턴을 기반으로 하는 프레임워크
이를 통해 클라이언트의 요청을 적절히 처리하고 응답을 반환하는 구조를 가짐.
클라이언트(웹 브라우저)가 요청을 보냄
DispatcherServlet (Front Controller)이 요청을 받음
HandlerMapping을 이용하여 적절한 Controller를 찾음
HandlerAdapter를 이용하여 해당 Controller를 실행
Controller가 로직을 수행하고 Model(데이터)을 View에 전달
ViewResolver가 적절한 View를 선택하고 렌더링
최종적으로 클라이언트에게 HTML 응답을 반환
Spring MVC에서 DispatcherServlet은 "Front Controller" 역할
Front Controller: 모든 요청을 단일 진입점(DispatcherServlet)으로 받아 적절한 컨트롤러에게 위임하는 패턴
DispatcherServlet은 요청을 어떤 컨트롤러가 처리할지 찾는 과정이 필요
이를 돕는 것이 HandlerMapping과 HandlerAdapter
@RequestMapping이 달린 컨트롤러 메서드를 찾아줌HandlerMapping이 찾은 컨트롤러를 실행하는 역할
다양한 방식의 컨트롤러 호출을 지원하기 위해 존재 (예: @RequestMapping, HttpRequestHandler 등)
protected HandlerAdapter getHandlerAdapter(Object handler) throws ServletException {
if (this.handlerAdapters != null) {
for (HandlerAdapter adapter : this.handlerAdapters) {
if (adapter.supports(handler)) {
return adapter;
}
}
}
throw new ServletException("No adapter for handler [" + handler + "]");
}
Spring MVC에서 가장 많이 사용하는 RequestMappingHandlerAdapter를 통해 @RequestMapping이 있는 컨트롤러가 실행됨
Controller는 클라이언트 요청을 받아 비즈니스 로직을 수행하고, 응답을 반환하는 역할을 합니다.
@Controller
@RequestMapping("/users")
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/{id}")
public ResponseEntity<User> getUser(@PathVariable Long id) {
User user = userService.getUserById(id);
return ResponseEntity.ok(user);
}
}
@Controller : 해당 클래스가 Spring MVC 컨트롤러임을 의미@RequestMapping("/users") : "/users"로 시작하는 요청을 처리@GetMapping("/{id}") : "/users/{id}" 요청을 처리@Autowired : Spring이 자동으로 UserService를 주입Spring MVC에서는 컨트롤러가 데이터를 처리한 후, View를 통해 사용자에게 응답을 반환
Spring에서는 개발자가 new를 사용하지 않아도 객체가 자동으로 생성
이것은 Spring Container(스프링 컨테이너)가 Bean(빈)을 관리하기 때문
@Component, @Service, @Repository, @Controller 사용@Configuration + @Bean 사용Spring에서는 의존성 주입(DI, Dependency Injection)을 통해 객체를 관리합니다.
@Controller
@RequestMapping("/users")
@RequiredArgsConstructor
public class UserController {
private final UserService userService;
}
final 키워드를 사용해 불변성 유지 가능@Controller
@RequestMapping("/users")
public class UserController {
@Autowired
private UserService userService;
}
@Controller
@RequestMapping("/users")
public class UserController {
private UserService userService;
@Autowired
public void setUserService(UserService userService) {
this.userService = userService;
}
}