스프링 MVC
2025. 6. 13. 09:24ㆍspring
반응형
1. 스프링 MVC 아키텍처 개요
스프링 MVC는 Model-View-Controller 디자인 패턴을 기반으로 한 웹 프레임워크입니다.
- Model: 비즈니스 로직 처리, 데이터 저장 또는 조회
- View: 사용자에게 보여질 UI (HTML, Thymeleaf, JSP 등)
- Controller: 요청을 받아서 처리하고, 어떤 View로 응답할지 결정
2. DispatcherServlet 요청 처리 흐름
DispatcherServlet은 스프링 MVC의 프론트 컨트롤러 역할을 합니다. 모든 웹 요청은 DispatcherServlet이 가장 먼저 받습니다.
📌 전체 흐름
- 클라이언트 요청: 사용자가 웹 브라우저에서 특정 URL로 요청
- DispatcherServlet이 요청을 받음
- HandlerMapping을 통해 어떤 Controller가 처리할지 결정
- 해당 Controller 호출
- Controller가 비즈니스 로직 처리 (Service 호출 등)
- Controller는 Model과 View 정보를 반환
- ViewResolver가 View 이름에 해당하는 실제 뷰(HTML, JSP 등)를 찾음
- DispatcherServlet이 View에 Model을 전달하여 렌더링
- 렌더링된 응답을 클라이언트에 전달
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 |