Spring MVC (Model-View-Controller)

leedong617·2024년 9월 13일
post-thumbnail

Spring MVC는 Spring Framework의 일부로, Model-View-Controller (MVC) 디자인 패턴을 기반으로 한 웹 애플리케이션 프레임워크임. Spring MVC는 웹 애플리케이션에서 클라이언트 요청을 처리하고, 데이터를 모델(Model)에 전달하며, 뷰(View)를 통해 결과를 사용자에게 보여주는 기능을 제공함.

MVC 패턴이란?

MVC(Model-View-Controller) 패턴은 웹 애플리케이션을 세 가지 주요 컴포넌트로 나누어 설계하는 방법임

Model

애플리케이션의 데이터나 비즈니스 로직을 담당하는 부분. 데이터베이스와 상호작용하거나 비즈니스 로직을 처리함. Model은 데이터를 저장하거나 가공하는 역할을 함.

View

사용자가 보는 프레젠테이션 계층으로, 사용자에게 데이터를 표시하는 역할을 함. HTML, JSP, Thymeleaf, JSON 등의 형식으로 데이터를 제공함.

Controller

클라이언트 요청을 받아 처리하고, 필요한 데이터를 Model로부터 가져와 View에 전달하는 역할을 하는 중간 계층. Controller는 비즈니스 로직을 처리하지 않으며, 단순히 요청을 받고 응답을 반환하는 역할을 함.

Spring MVC 아키텍처

Spring MVC는 클라이언트 요청을 처리하기 위해 다음과 같은 주요 컴포넌트로 구성됨:

DispatcherServlet

DispatcherServlet은 Spring MVC의 프론트 컨트롤러로, 모든 요청을 받아서 적절한 컨트롤러로 요청을 전달하고, 최종적으로 View를 선택해 응답을 반환하는 역할을 함. 프론트 컨트롤러 패턴은 요청을 한 곳에서 받아서 처리하는 방식으로, Spring MVC의 핵심 컴포넌트임.

클라이언트가 웹 애플리케이션에 요청을 보내면, 이 요청은 항상 DispatcherServlet에 의해 먼저 처리됨.
DispatcherServlet은 요청을 처리할 컨트롤러를 찾아서 적절한 HandlerMapping을 통해 컨트롤러로 요청을 전달함.
컨트롤러에서 로직을 처리한 후 결과를 Model에 담아 View로 전달함.

Controller

Controller는 클라이언트의 요청을 처리하고 응답을 반환하는 중간 계층임. 클라이언트가 DispatcherServlet을 통해 요청을 보내면, 해당 요청은 Controller에서 처리됨. Controller는 주로 @Controller, @RequestMapping 등의 어노테이션을 사용하여 요청을 처리하고, 비즈니스 로직에 대한 처리는 Service 레이어나 다른 컴포넌트에서 처리하도록 분리함.

@Controller
public class UserController {

    @GetMapping("/users")
    public String getAllUsers(Model model) {
        List<User> users = userService.findAll();
        model.addAttribute("users", users);  // 데이터를 모델에 추가
        return "userList";  // userList.jsp와 같은 뷰 이름 반환
    }
}

@Controller

클래스가 Spring MVC의 컨트롤러임을 나타냄.

@GetMapping, @PostMapping

HTTP 메소드(GET, POST 등)에 따라 특정 경로로 들어온 요청을 처리함.

Model

컨트롤러에서 데이터를 View에 전달할 때 사용하는 객체임. 이를 통해 데이터를 JSP, Thymeleaf 등 뷰 템플릿으로 전달할 수 있음.

Model

Model은 컨트롤러가 요청을 처리한 결과 데이터를 담아 View로 전달하는 데 사용됨. 이 데이터는 JSP, Thymeleaf와 같은 템플릿 엔진을 사용하여 사용자에게 표시됨. Model은 주로 Model, ModelAndView 객체를 통해 데이터를 뷰로 전달함.

// 컨트롤러 코드
@GetMapping("/greeting")
public String greeting(Model model) {
    model.addAttribute("message", "Hello, World!");  // 모델에 데이터 추가
    return "greeting";  // "greeting.jsp"와 같은 뷰 이름 반환
}

Model 객체는 컨트롤러에서 데이터 전달을 위해 사용되며, View에 데이터를 전달하여 사용자가 이를 확인할 수 있게 해줌.

View

View는 Model에서 받은 데이터를 사용자에게 표시하는 역할을 함. Spring MVC에서는 다양한 뷰 템플릿 엔진을 지원하며, 대표적으로 JSP, Thymeleaf, FreeMarker, Velocity 등을 사용할 수 있음. 뷰는 주로 HTML, CSS, JavaScript 등을 사용해 사용자에게 데이터를 표시함.

ViewResolver는 어떤 View(JSP, Thymeleaf 등)를 사용할 것인지 결정하는 역할을 함. Spring에서 뷰의 이름을 기반으로 실제 파일 경로를 찾고, 해당 뷰를 렌더링함.

<!-- greeting.jsp -->
<html>
<head><title>Greeting</title></head>
<body>
    <h1>${message}</h1>  <!-- Model에서 전달받은 데이터를 사용 -->
</body>
</html>

JSP에서 ${} 구문을 사용하여 Model에서 전달받은 데이터를 출력할 수 있음.

HandlerMapping

HandlerMapping은 DispatcherServlet이 요청을 받았을 때, 해당 요청을 처리할 컨트롤러를 찾는 역할을 함. 요청 URL과 컨트롤러 메소드를 매핑하는 핸들러를 결정하여, 어떤 컨트롤러가 해당 요청을 처리할지 정의함.

ViewResolver

ViewResolver는 컨트롤러가 반환한 뷰 이름을 실제 뷰 파일(JSP, Thymeleaf 등)로 매핑하는 역할을 함. Spring은 ViewResolver를 사용해 뷰의 이름을 실제 템플릿 파일로 변환하여 클라이언트에게 응답을 반환함.

@Bean
public InternalResourceViewResolver viewResolver() {
    InternalResourceViewResolver resolver = new InternalResourceViewResolver();
    resolver.setPrefix("/WEB-INF/views/");  // 뷰 파일 경로의 접두사
    resolver.setSuffix(".jsp");  // 뷰 파일의 접미사
    return resolver;
}

위 설정은 컨트롤러가 greeting이라는 뷰 이름을 반환하면, Spring이 이를 /WEB-INF/views/greeting.jsp로 변환해 해당 파일을 렌더링하도록 함.

Spring MVC의 처리 흐름

Spring MVC는 다음과 같은 흐름으로 클라이언트의 요청을 처리함

1. 클라이언트 요청

  • 사용자가 웹 브라우저에서 URL을 요청하면, 이 요청은 DispatcherServlet으로 전달됨.

2. DispatcherServlet

  • 모든 요청은 DispatcherServlet이 먼저 받음. 이 서블릿은 요청을 적절한 컨트롤러로 전달할지 결정하기 위해 HandlerMapping을 사용함.

3. 컨트롤러 처리

  • 요청이 컨트롤러에 도달하면, 컨트롤러는 비즈니스 로직을 처리하거나 데이터를 서비스 레이어에서 가져옴. 그 후 Model에 데이터를 담아 View에 전달할 준비를 함.

4. ViewResolver

  • 컨트롤러가 반환한 뷰 이름을 바탕으로, ViewResolver는 실제 뷰 파일을 찾음. 이 뷰는 주로 JSP, Thymeleaf 등의 템플릿 엔진으로 렌더링됨.

5. View 렌더링

  • View는 Model에 담긴 데이터를 사용해 HTML 페이지를 생성하고, 이를 클라이언트에게 응답으로 전달함.

4. Spring MVC 주요 어노테이션

@Controller

@Controller는 클래스가 Spring MVC 컨트롤러로 사용될 것을 명시함. 해당 클래스 내 메소드들은 클라이언트의 HTTP 요청을 처리하는 메소드로 사용됨.

@Controller
public class MyController {
    @GetMapping("/home")
    public String home() {
        return "home";  // home.jsp로 이동
    }
}

@RequestMapping

@RequestMapping은 HTTP 요청 URL을 특정 메소드와 매핑하는 데 사용됨. 이 어노테이션은 클래스와 메소드 레벨에 모두 적용할 수 있음. @GetMapping, @PostMapping 등으로 세분화할 수도 있음.

@RequestMapping("/users")
public class UserController {

    @GetMapping
    public String getAllUsers(Model model) {
        model.addAttribute("users", userService.findAll());
        return "userList";
    }

    @PostMapping
    public String createUser(User user) {
        userService.save(user);
        return "redirect:/users";
    }
}

@ModelAttribute

@ModelAttribute는 Model 객체에 데이터를 추가할 때 사용됨. 주로 폼 데이터를 처리하거나 뷰로 데이터를 전달하는 역할을 함.

@ModelAttribute("user")
public User getUser() {
    return new User();
}

@ResponseBody

@ResponseBody는 메소드에서 반환한 값을 뷰가 아닌 HTTP 응답 바디에 직접 넣도록 할 때 사용함. 주로 JSON 또는 XML 데이터를 응답할 때 사용됨.

@GetMapping("/api/users")
@ResponseBody
public List<User> getUsers() {
    return userService.findAll();
}

@RestController

@RestController는 @Controller와 @ResponseBody를 결합한 어노테이션으로, RESTful 웹 서비스를 쉽게 개발할 수 있게 해줌.

@RestController
@RequestMapping("/api/users")
public class UserRestController {

    @GetMapping
    public List<User> getUsers() {
        return userService.findAll();
    }
}

Spring MVC의 장점

유연한 아키텍처

  • Spring MVC는 MVC 패턴을 통해 비즈니스 로직과 프레젠테이션 로직을 명확히 분리함. 이를 통해 유지보수성과 가독성이 높아짐.

간결한 어노테이션 기반 구성

  • 어노테이션을 사용하여 코드가 간결하고, XML 설정 파일을 최소화하여 애플리케이션을 구성할 수 있음.

REST 지원

  • Spring MVC는 RESTful 웹 서비스 개발을 위한 강력한 지원을 제공하며, JSON 및 XML 같은 다양한 형식의 응답을 쉽게 반환할 수 있음.

다양한 뷰 템플릿 지원

  • Spring MVC는 JSP, Thymeleaf, FreeMarker, Velocity 등 다양한 뷰 템플릿 엔진을 지원하여 유연하게 사용할 수 있음.

풍부한 커뮤니티와 확장성

  • Spring MVC는 널리 사용되며, 방대한 커뮤니티 지원과 다양한 확장 기능을 제공함.

결론

Spring MVC는 Model-View-Controller 패턴을 구현하여 웹 애플리케이션의 유연성, 확장성, 유지보수성을 크게 향상시키는 프레임워크임. DispatcherServlet을 중심으로 클라이언트의 요청을 처리하고, Controller, Model, View 간의 명확한 분리로 개발자는 비즈니스 로직과 사용자 인터페이스를 효율적으로 관리할 수 있음. Spring MVC는 RESTful 웹 서비스와의 호환성도 뛰어나므로, 대규모 웹 애플리케이션부터 간단한 웹 서비스까지 폭넓게 활용될 수 있음.

profile
웹개발자 취업 준비생

0개의 댓글