스프링 MVC는 클라이언트의 HTTP 요청을 특정 컨트롤러 메서드에 연결(매핑)하고, 요청에 포함된 데이터를 메서드 파라미터에 바인딩하는 강력한 기능을 제공한다. 서블릿 기반의 request.getParameter() 방식과 비교하여, 애노테이션 기반의 접근법이 어떻게 생산성과 코드의 가독성을 높이는지 알아본다.
요청 매핑 (Request Mapping)
요청 매핑은 특정 URL과 HTTP 메서드 조합을 처리할 핸들러(컨트롤러 메서드)를 지정하는 과정이다.
@Controller와 @RestController의 차이점
| 구분 | @Controller |
@RestController |
|---|---|---|
| 역할 | 메서드의 반환 값을 논리적인 뷰(View) 이름으로 간주한다. | @Controller + @ResponseBody. 반환 값을 HTTP 응답 Body에 직접 쓴다. |
| 주 사용처 | 서버 사이드 렌더링 (SSR) 방식의 웹 페이지 응답 | REST API의 데이터(JSON) 응답 |
HTTP 메서드별 매핑 애노테이션
@RequestMapping(method = ...) 방식보다 직관적인 다음 축약 애노테이션 사용이 권장된다.
@GetMapping@PostMapping@PutMapping@PatchMapping@DeleteMapping
URL 경로 변수: @PathVariable
RESTful API 설계에서 URL 경로의 일부를 변수로 추출할 때 사용된다.
@RestController
@RequestMapping("/api/users")
public class MappingController {
// GET /api/users/{userId}
@GetMapping("/{userId}")
public String findUser(@PathVariable String userId) {
// userId 변수에 URL 경로의 {userId} 부분이 바인딩된다.
return "get userId=" + userId;
}
}
참고: @PathVariable의 이름과 메서드 파라미터 변수명이 같다면 ("userId") 부분은 생략 가능하다.
HTTP 요청 파라미터 처리
클라이언트가 ?key=value 형식으로 보내는 요청 파라미터나 HTML Form 데이터를 처리하는 방법을 알아본다.
@RequestParam: 파라미터 개별 조회
@RequestParam은 개별 요청 파라미터를 메서드 파라미터에 바인딩하는 가장 기본적인 방법이다.
@RestController
public class RequestParamController {
@GetMapping("/api/params")
public String requestParams(
@RequestParam("username") String name,
@RequestParam("age") int age,
@RequestParam(required = false) String hobby,
@RequestParam(defaultValue = "GUEST") String role
) {
// "username" 파라미터는 name 변수에, "age"는 int 타입으로 자동 변환되어 age 변수에 바인딩된다.
return "params ok";
}
}
| 속성 | 설명 |
|---|---|
name (or value) |
바인딩할 요청 파라미터의 이름. |
required |
파라미터의 필수 여부 (기본값: true). |
defaultValue |
파라미터가 없을 때 사용할 기본값. 사용 시 required는 false로 간주. |
@ModelAttribute: 파라미터 객체 바인딩
요청 파라미터가 많을 경우, 이를 담는 객체(DTO)를 정의하고 @ModelAttribute를 사용하여 한번에 바인딩할 수 있다.
데이터 전송 객체(DTO) 정의
// Lombok 애노테이션으로 Getter, Setter 등을 자동 생성 @Data public class UserDto { private String username; private int age; }컨트롤러에서
@ModelAttribute로 바인딩@RestController public class ModelAttributeController { @PostMapping("/api/users") public String addUser(@ModelAttribute UserDto userDto) { // 요청 파라미터 ?username=test&age=25 가 userDto 객체의 필드에 자동으로 바인딩된다. // (내부적으로 userDto.setUsername("test"), userDto.setAge(25) 호출) return "user added: " + userDto.getUsername(); } }
스프링의 파라미터 처리 규칙
- 메서드 파라미터가 단순 타입(
String,int등)이면@RequestParam으로 간주한다.- 메서드 파라미터가 복합 타입(사용자 정의 객체)이면
@ModelAttribute로 간주한다.이 규칙에 따라 두 애노테이션은 조건부 생략이 가능하다.
'SpringBoot' 카테고리의 다른 글
| Spring MVC: HTTP Body 처리와 응답 제어 (1) | 2025.06.13 |
|---|---|
| Spring MVC 구조: 어댑터 패턴과 다형성은 왜 중요한가? (0) | 2025.05.20 |
| 웹 애플리케이션의 이해 (0) | 2025.05.13 |
| RequestScope로 요청별 로그 분리하기 (0) | 2025.05.07 |
| 스프링 DI: 생존자 주입을 권장하는 이유 (0) | 2025.05.05 |