Spring

@ModelAttribute 는 언제 어떻게 왜 쓰는가

김관현 2024. 6. 29. 20:40

@ModelAttribute

메소드 파라미터 혹은 메소드 리턴 값을 명명된 model attribute에 바인딩 한다.

 

1. 지정한 객체를 생성하고, 요청 파라미터의 값을 프로퍼티 접근법으로 입력해준다.

(객체 생성, setter 이용하여 주입)

 

2. Model 에 @ModelAttribute 로 지정한 객체를 자동으로 넣어준다.

ex) moel.addAttribute("temp", temp); 자동 추가

 

 

@GetMapping 에서는 왜 @ModelAttribute 를 사용하나요?

BeanValidation 을 활용할 수 있다.

이러한 방법은 사용자가 입력할 수 있는 빈 객체를 모델에 사전에 추가하여, 템플릿 엔진이 해당 객체를 참조할 수 있게 한다.

-> 에러 발생 시, 입력 값과 에러 메시지를 폼에 유지시켜줄 수 있다.

ex) 로그인 요청 시 @GetMapping 에서도 LoginForm 을 @ModelAttribute 로 받아서 로그인 실패 시 입력 값을 유지 시킨다.

 

 

사용자가 입력할 수 있는 빈 객체를 모델에 사전에 추가하여, 템플릿 엔진이 해당 객체를 참조!!

 

어떻게 사용하나요?

@Get("/")
public String practice(@ModelAttribute Member member) {
    System.out.println("멤버 이름 = ", member.getName());
    //model.addAttribute("member", member); 자동 추가
    return "home";
}

 

단순 데이터 타입을 복합 데이터 타입의 객체로 받아오거나 해당 객체를 새로 생성한다.

 

 

@RequestParam , @PathVariable 과의 차이는 뭔가요?

 

@RequestParam 의 경우

@Get("/")
public String practice(@RequestParam Long id, @RequestParam String name, Model model) {
    System.out.println("멤버 아이디 = ", id);
    System.out.println("멤버 이름 = ", name);
    
    model.addAttribute("memberId", id); 
    return "home";
}

 

단순 데이터 타입들이 많은 경우 번거로워진다.

model 도 직접 입력해줘야 하며 단순 데이터 타입들을 전부 따로 입력받아야한다.

@RequestParam 의 경우 필수로 입력받아야 하는게 기본 설정이기 때문에 required = false 를 해주지 않는 이상 필수로 해당 값을 받아야 한다.

 

아래 설명할 @PathVariable과 비교를 하자면 @RequestParam은 주로 쿼리스트링으로 데이터를 받는 경우에 사용한다. 

 

@PathVariable 의 경우

@Get("/member/{id}")
public String practice(@PathVariable Long id, Model model) {
    System.out.println("멤버 아이디 = ", id);
    model.addAttribute("member", member); 
    return "home";
}

 

쿼리스트링으로 데이터를 받지 않으며 uri에 전달되는 데이터를 받아올 때 사용한다.

@RequestParam 과 달리 딱 하나만 사용 가능하다 ( X )

 

@PathVariable 도 여러개 사용 가능하다.

 

ex)

@Get("/member/{id}/article/{name}")
public String practice(@PathVariable Long id, @PathVariable String name, Model model) {
    System.out.println("멤버 아이디 = ", id);
    model.addAttribute("member", member); 
    return "home";
}

 

 

반드시 값을 가져야 한다.

 

헷갈렸던 부분

GET 매핑으로 로그인 폼 화면을 보여주는 코드에서 @ModelAttribute 를 사용하는 것이 이해가 가지 않아서 여러 자료를 찾아보다가 알게된 내용을 블로그에 정리하게 되었다.

 

앞에서 설명하였듯이 로그인 화면에서 입력받을 빈 객체를 미리 만들어서 모델에 올리고 유효성 검증을 실패 할 시 해당 객체를 이용하여 입력된 데이터를 유지하며 오류를 보여줄 수 있다. 이를 여러 방면으로 활용할 수 있을 것이라 생각한다.(고객 정보 자동완성 등등)

 

사용자가 입력할 수 있는 빈 객체를 모델에 사전에 추가하여, 템플릿 엔진이 해당 객체를 참조 한다.

템플릿 엔진이 클라이언트가 입력한 값을 참조하여 화면을 렌더링한다.

-> 유효성 검증을 실패해도 입력된 데이터를 유지할 수 있다.