- 스프링 MVC2024년 12월 26일
- imaginaring
- 작성자
- 2024.12.26.:43
스프링 프레임워크는 웹 어플리케이션 개발에 필요한 기능들을 모두 담은 spring-webmvc 모듈을 제공하는데,
이걸 스프링 웹 프레임워크라고 한다
MVC패턴
- 앱 구조를 크게 세분활 (모델, 뷰, 컨트롤러)하여 각 역활을 수행하도록 패턴으로 만든 것
구성요소
- DispatcherServlet : 스프링 MVC의 핵심 역활을 하는 프론트 컨트롤러
- 모든 HTTP 요청을 받아서 처리, 컨트롤러와 뷰를 연결
- 서블릿 : HTTP 요청과 응답을 처리하는 자바 클래스
- HandlerMapping : 요청 URL과 적절한 컨트롤러를 매핑
- ex) /users 요청이 오면 UserController 를 호출하도록 설정
- Controller - 사용자 요청을 처리, 모델 데이터를 뷰에 전달
- 주로 @Controller, @RestController를 사용
- Model : 뷰에 데이터를 전달하기 위해 사용
- Model, ModelMap, ModelAndView 객체를 통해 데이터 설정 가능
- View : 사용자에게 데이터를 렌더링하여 응답
- JSP, Thymeleaf, Freemaker 등 다양한 템플릿 엔진을 지원
- View Resolver : 컨트롤러가 반환한 뷰 이름을 실제 뷰로 변환
- ex) return "home" => /WEB-INF/view/home.jsp 로 매핑
MVC 아키텍처 동작순서
- 클라에서 전송된 모든 HTTP요청 메시지는 가장 먼저 디스패처 서블릿이 받아 처리
- 디스패처 서블릿은 HTTP 요청 메시지의 요청 라인과 헤더를 파악한 후 어떤 컨트롤러 클래스의 메소드로 전달할지 HanderMapping을 사용하여 확인한다
- 디스패처 서블릿은 사용자 요청을 처리하기에 적합한 컨트롤러에 HTTP 요청 메시지를 전달하기 위해 전달역활을 하는 핸들러어댑터에 전달한다
- 핸들러어댑터는 해당 컨트롤러에 클라이언트 요청을 전달
- 컨트롤러는 서비스 기능을 구현한 @Service, @Component, @Repository 스프링 빈들의 메소드를 호출하여 비즈니스 로직을 수행 => 결과는 다시 컨트롤러에게 전달되고, 컨트롤러는 이 데이터를 어떤 뷰로 전달할지 결정
- 핸들러어댑터는 처리할 뷰와 뷰에 매핑할 데이터를 ModelAndView 객체에 포함하여 디스패처서블릿에 전달
- 디스패처서블릿은 처리할 뷰 정보를 ViewResolver에서 확인
- ViewResolver은 View에 데이터를 전달하고 View는 데이터를 HTML 등 적합한 포맷으로 변환 => 변환한 데이터를 디스패처 서블릿으로 전달
- 디스패처 서블릿은 최종적으로 변환된 데이터를 클라이언트에 전달
처리과정 요약 ..- 클라이언트가 HTTP 요청을 보냄.
- DispatcherServlet이 요청을 가로챔.
- HandlerMapping이 URL을 기반으로 적절한 컨트롤러를 찾음.
- 컨트롤러가 요청을 처리하고, 필요한 데이터를 생성.
- 컨트롤러가 Model과 함께 뷰 이름을 반환.
- ViewResolver가 뷰 이름에 해당하는 템플릿을 찾아 렌더링.
- 최종 HTML 응답을 클라이언트에게 반환.
주요 어노테이션
- @Controller
- 클래스를 컨트롤러로 지정.
- HTTP 요청을 처리하고 뷰를 반환.
- @RestController
- @Controller와 @ResponseBody가 결합된 형태.
- JSON이나 XML 형태의 데이터를 직접 반환.
- @RequestMapping
- URL 요청을 메서드나 클래스에 매핑.
- HTTP 메서드(GET, POST 등)를 지정하여 다양한 요청 처리.
- @GetMapping / @PostMapping / @PutMapping / @DeleteMapping
- HTTP 메서드별로 요청을 처리하는 매핑.
- @PathVariable
- URL 경로에서 값을 추출하여 메서드 파라미터로 전달.
- @RequestParam
- 요청 파라미터를 메서드 파라미터로 전달.
- @ModelAttribute
- 폼 데이터를 객체로 바인딩.
- @ResponseBody
- 데이터를 직접 HTTP 응답으로 반환.
예시. 컨트롤러 정의
@Controller @RequestMapping("/users") public class UserController { @GetMapping("/{id}") public String getUser(@PathVariable("id") Long id, Model model) { // 비즈니스 로직 처리 (예: DB에서 사용자 정보 가져오기) User user = userService.getUserById(id); model.addAttribute("user", user); // 모델에 데이터 추가 return "userDetail"; // 뷰 이름 반환 } }
동기식 요청 처리 모델에 기반, 실시간 데이터 스트리밍 같은 비동식 처리에 한계
=> 비동기 처리와 리액티브 프로그래밍이 필요한 경우 WebFlux 사용
etc. 서블릿
import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @WebServlet("/hello") // URL 매핑 public class HelloServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); response.getWriter().println("<h1>Hello, Servlet!</h1>"); } }
서블릿과 JSP
- 서블릿
- 자바 코드로 직접 요청과 응답 처리
- 복잡한 HTML 생성 코드 포함 시 가독성 떨어짐
- 논리 처리가 중심
- JSP (Java Server Pages)
- HTML 내 자바 코드 삽입, 동적 페이지 생성
- 내부적으로 서블릿으로 변환되어 실행됨
- 화면 렌더링이 중심
'프로그래밍 > 스프링, JPA, MyBatis' 카테고리의 다른 글
레이어드 아키텍처 (0) 2024.12.26 MyBatis vs JPA (2) 2024.12.26 Bean 스코프 (1) 2024.12.26 Mock (0) 2024.12.24 AOP 관계지향 (0) 2024.12.24 다음글이전글이전 글이 없습니다.댓글
스킨 업데이트 안내
현재 이용하고 계신 스킨의 버전보다 더 높은 최신 버전이 감지 되었습니다. 최신버전 스킨 파일을 다운로드 받을 수 있는 페이지로 이동하시겠습니까?
("아니오" 를 선택할 시 30일 동안 최신 버전이 감지되어도 모달 창이 표시되지 않습니다.)