@ModelAttribute는 스프링 MVC에서 모델 데이터를 바인딩하고 처리하는 데 사용되는 어노테이션입니다. 이는 컨트롤러 메소드의 파라미터나 메소드 레벨에서 사용될 수 있습니다.
기본적인 사용 방법은 다음과 같습니다:
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.stereotype.Controller;
@Controller
public class UserController {
@PostMapping("/users")
public String createUser(@ModelAttribute User user) {
// user 객체는 이미 요청 파라미터로 채워진 상태
userService.createUser(user);
return "userCreated";
}
@ModelAttribute("countries")
public List<String> getCountries() {
return Arrays.asList("USA", "UK", "France", "Germany");
}
}
@PostMapping("/users")
public String createUser(@ModelAttribute("newUser") User user) {
// 모델에 'newUser'라는 이름으로 추가됨
return "userCreated";
}
@ModelAttribute("globalAttr")
public String globalAttribute() {
return "This is a global attribute";
}
@ModelAttribute 메소드@ModelAttribute
public void populateModel(@RequestParam String username, Model model) {
model.addAttribute("username", username);
model.addAttribute("userType", determineUserType(username));
}
public class User {
private String name;
private Address address;
// getters and setters
}
@PostMapping("/users")
public String createUser(@ModelAttribute User user) {
// 중첩된 address 객체도 자동으로 바인딩됨
return "userCreated";
}
@ModelAttribute와 @RequestBody의 차이@ModelAttribute: 주로 폼 제출 처리에 사용되며, 개별 필드를 바인딩합니다.@RequestBody: JSON/XML 등의 요청 본문을 객체로 변환할 때 사용됩니다.@ModelAttribute와 @Valid를 함께 사용하여 모델 객체의 유효성을 검사할 수 있습니다:
@PostMapping("/users")
public String createUser(@Valid @ModelAttribute User user, BindingResult result) {
if (result.hasErrors()) {
return "userForm";
}
userService.createUser(user);
return "userCreated";
}
@ModelAttribute가 적용된 컨트롤러를 테스트할 때:
@WebMvcTest(UserController.class)
class UserControllerTest {
@Autowired
private MockMvc mockMvc;
@Test
void testCreateUser() throws Exception {
mockMvc.perform(post("/users")
.param("name", "John Doe")
.param("email", "john@example.com"))
.andExpect(status().isOk())
.andExpect(model().attributeExists("newUser"));
}
}
@InitBinder를 사용하여 허용할 필드를 명시적으로 지정하세요.@Valid와 함께 사용하여 입력 데이터의 유효성을 검사하세요.@ModelAttribute로 처리하세요.@ModelAttribute는 스프링 MVC에서 모델 데이터를 효과적으로 처리할 수 있게 해주는 강력한 도구입니다. 이를 통해 HTTP 요청 데이터를 자바 객체로 쉽게 변환하고, 공통 데이터를 여러 뷰에 제공할 수 있습니다. 폼 처리, 데이터 준비, 모델 채우기 등 다양한 시나리오에서 유용하게 사용될 수 있습니다. 다만, 보안과 성능 측면에서 주의가 필요하며, 적절한 검증과 함께 사용해야 합니다.