스프링 MVC

2025. 6. 13. 09:24spring

반응형

1. 스프링 MVC 아키텍처 개요

스프링 MVC는 Model-View-Controller 디자인 패턴을 기반으로 한 웹 프레임워크입니다.

  • Model: 비즈니스 로직 처리, 데이터 저장 또는 조회
  • View: 사용자에게 보여질 UI (HTML, Thymeleaf, JSP 등)
  • Controller: 요청을 받아서 처리하고, 어떤 View로 응답할지 결정

 

2. DispatcherServlet 요청 처리 흐름

DispatcherServlet은 스프링 MVC의 프론트 컨트롤러 역할을 합니다. 모든 웹 요청은 DispatcherServlet이 가장 먼저 받습니다.

📌 전체 흐름

  1. 클라이언트 요청: 사용자가 웹 브라우저에서 특정 URL로 요청
  2. DispatcherServlet이 요청을 받음
  3. HandlerMapping을 통해 어떤 Controller가 처리할지 결정
  4. 해당 Controller 호출
  5. Controller가 비즈니스 로직 처리 (Service 호출 등)
  6. Controller는 Model과 View 정보를 반환
  7. ViewResolver가 View 이름에 해당하는 실제 뷰(HTML, JSP 등)를 찾음
  8. DispatcherServlet이 View에 Model을 전달하여 렌더링
  9. 렌더링된 응답을 클라이언트에 전달

 

3. Model, View, Controller 개념

✔ Model

  • 데이터 저장소 역할 (예: DB에서 조회한 데이터)
  • 컨트롤러 → 뷰로 전달할 데이터
  • 예: model.addAttribute("user", user);

✔ View

  • 사용자에게 보여질 결과 화면
  • 예: Thymeleaf, JSP, JSON 등

✔ Controller

  • 사용자의 요청을 받아서 처리하고, 결과를 응답
  • 예: @Controller 또는 @RestController로 정의된 클래스

 

 

4. @Controller vs @RestController

구분@Controller@RestController
목적 HTML, JSP 등 View 반환 JSON, XML 등 데이터 반환
반환값 View 이름(String) 데이터 객체
사용 예 웹 페이지 제공 API 서버
@Controller
public class HomeController {
    @GetMapping("/home")
    public String home(Model model) {
        model.addAttribute("msg", "Hello");
        return "home"; // templates/home.html
    }
}

@RestController
public class ApiController {
    @GetMapping("/api/user")
    public User getUser() {
        return new User("홍길동", 30);
    }
}

 

5. @RequestMapping, @GetMapping, @PostMapping

요청 URL과 HTTP 메서드에 따라 Controller 메서드를 매핑

📌 @RequestMapping

  • URL과 메서드 둘 다 지정 가능
@RequestMapping(value = "/user", method = RequestMethod.GET)
public String getUser() { ... }

📌 @GetMapping / @PostMapping

  • 위의 축약형
@GetMapping("/user")
public String getUser() { ... }

@PostMapping("/user")
public String createUser() { ... }

 

 

6. @RequestParam, @PathVariable, @ModelAttribute

✔ @RequestParam

  • 쿼리 파라미터 (?name=value) 받아오기
@GetMapping("/greet")
public String greet(@RequestParam String name) {
    return "Hello " + name;
}
// /greet?name=Tom → Hello Tom

✔ @PathVariable

  • URL 경로 변수 사용
@GetMapping("/user/{id}")
public String getUser(@PathVariable Long id) {
    return "User ID: " + id;
}
// /user/10 → User ID: 10

 

✔ @ModelAttribute

  • 폼(form) 데이터를 객체로 바인딩 (주로 GET/POST 폼)
@PostMapping("/join")
public String join(@ModelAttribute User user) {
    // User 객체에 폼 값이 자동으로 매핑됨
    return "welcome";
}

 

7. @RequestBody, @ResponseBody

✔ @RequestBody

  • 클라이언트의 JSON 데이터를 Java 객체로 변환
@PostMapping("/api/join")
public String join(@RequestBody User user) {
    return "joined: " + user.getName();
}
// JSON 요청: { "name": "Tom", "age": 20 }

✔ @ResponseBody

  • 메서드 반환값을 JSON 형식으로 응답 (View 사용 안 함)
@GetMapping("/api/user")
@ResponseBody
public User getUser() {
    return new User("Jane", 28);
}

@RestController는 내부적으로 모든 메서드에 @ResponseBody가 붙은 것과 같음.

 

✅ 요약

기능사용하는 애노테이션
HTML View 반환 @Controller
JSON 반환 (API) @RestController
URL 매핑 @GetMapping, @PostMapping
쿼리 파라미터 @RequestParam
URL 경로 변수 @PathVariable
폼 객체 바인딩 @ModelAttribute
JSON 요청 바디 받기 @RequestBody
JSON 응답 보내기 @ResponseBody
 
반응형

'spring' 카테고리의 다른 글

Spring Security  (0) 2025.06.13
Spring JDBC  (1) 2025.06.13
스프링 컨테이너  (0) 2025.06.13
AOP (관점 지향 프로그래밍)  (0) 2025.06.13
스프링 Bean 생명주기와 scope  (3) 2025.06.12