JSP

Spring MVC에서 @RequestParam과 @ModelAttribute의 차이점

초코너무조코 2025. 2. 19. 12:51
728x90

Spring MVC에서는 클라이언트가 보낸 데이터를 컨트롤러에서 받을 때 여러 가지 방법을 제공합니다. 그중에서도 @RequestParam과 @ModelAttribute는 자주 사용되는 어노테이션입니다. 이번 글에서는 두 어노테이션의 차이점과 사용법을 자세히 살펴보겠습니다.

 

1. @RequestParam

개념

@RequestParam은 HTTP 요청의 파라미터를 개별적으로 받아올 때 사용하는 어노테이션입니다. 주로 GET 또는 POST 요청에서 쿼리 파라미터나 폼 데이터를 받을 때 사용됩니다.

사용법

@RestController
@RequestMapping("/api")
public class ExampleController {
    @GetMapping("/greet")
    public String greet(@RequestParam String name) {
        return "Hello, " + name;
    }
}

 

위 코드에서 /api/greet?name=John으로 요청하면 "Hello, John"이 반환됩니다.

옵션 설정

  • required = true (기본값) : 해당 파라미터가 필수
  • required = false : 해당 파라미터가 없어도 에러 발생하지 않음
  • defaultValue : 파라미터가 없을 경우 기본값 지정 가능
@GetMapping("/welcome")
public String welcome(@RequestParam(name = "user", defaultValue = "Guest") String user) {
    return "Welcome, " + user;
}

/api/welcome → Welcome, Guest

/api/welcome?user=John → Welcome, John

 

2. @ModelAttribute

개념

@ModelAttribute는 요청 파라미터를 객체로 매핑할 때 사용됩니다. 주로 POST 요청에서 폼 데이터를 받아와서 객체로 변환할 때 유용합니다.

사용법

@Controller
@RequestMapping("/user")
public class UserController {
    @PostMapping("/create")
    public String createUser(@ModelAttribute User user) {
        System.out.println(user);
        return "userCreated";
    }
}
public class User {
    private String name;
    private int age;
    
    // Getters and Setters
}

동작 방식

  1. 클라이언트가 name=John&age=25와 같은 데이터를 전송합니다.
  2. Spring이 자동으로 User 객체의 필드에 매핑합니다.
  3. 컨트롤러 메서드에서 User 객체를 사용할 수 있습니다.

특징

  • @RequestParam과 다르게 객체 단위로 값을 바인딩함
  • HTML 폼에서 입력받은 데이터를 객체로 변환할 때 유용함
  • GET 요청에서도 사용할 수 있으며, 모델 속성으로 자동 추가됨
@GetMapping("/form")
public String showForm(Model model) {
    model.addAttribute("user", new User());
    return "userForm";
}

 

3. @RequestParam vs @ModelAttribute

 

  @RequestParam @ModelAttribute
데이터 처리 방식 개별 변수에 바인딩 객체 단위로 바인딩
주로 사용하는 HTTP 요청 GET, POST GET, POST
필드가 많을 때 비효율적 효율적
DTO/VO 활용 직접 매핑 필요 자동 매핑 지원

 

4. 정리

  • 간단한 파라미터 처리 → @RequestParam
  • 객체로 바인딩하고 싶을 때 → @ModelAttribute
728x90