[꼼꼼한 개발자] 꼼코더
22. 코드로 배우는 스프링 웹 프로젝트 - [스프링 MVC의 Controller] - Controller의 파라미터 수집(3), @ModelAttribute, RedirectAttributes 본문
22. 코드로 배우는 스프링 웹 프로젝트 - [스프링 MVC의 Controller] - Controller의 파라미터 수집(3), @ModelAttribute, RedirectAttributes
꼼코더 2023. 1. 5. 01:30✍🏻 @ModelAttribute 어노테이션
웹 페이지 구조는 Request에 전달된 데이터를 가지고
필요시 추가적인 데이터를 생성하여 화면에 전달하는 방식으로 동작한다.
Model의 경우는 파라미터로 전달된 데이터를 가지고 존재하지 않지만 화면에서는 필요한 데이터를 전달하기 위해 사용.
- 게시판의 페이지 번호는 파라미터로 전달되지만, 결과 데이터를 반환하려면 Model에 담아서 전달해야 함
스프링 MVC의 Controller는 기본적으로
Java Beans 규칙에 맞는 객체는 다시 화면으로 객체를 전달한다.
다시 말해 Java Beans의 규칙은 단순히
생성자가 없거나 빈 생성자를 가져야 하며 getter/setter를 가진 클래스의 객체들을 의미한다.
앞의 예제는 파라미터로 사용된 SampleDTO의 경우
Java Bean의 규칙에 맞기 때문에 자동으로 다시 화면까지 전달된다.
반면 기본 자료형의 경우 파라미터로 선언하여도 화면까지 전달되지 않는다.
👨🏻💻 SampleController 코드 추가
ex04()는 SampleDTO 타입과 int 타입의 데이터를 파라미터로 사용한다.
결과를 확인하기 위해 ‘WEB-INF/views’ 폴더 아래 ‘sample’ 폴더 생성 후
리턴값에서 사용한 ‘ex04’에 해당하는 ex04.jsp를 작성한다.
👨🏻💻 ex04.jsp 작성
💁🏻♂️ 결과
‘http://localhost:8080/sample/ex04?name=aaa&age=11&page=9’와 같이 호출 시
화면에 SampleDTO만 전달된 것을 확인할 수 있다.
int 타입으로 선언된 page는 전달되지 않는다.
그럼 @ModelAttribute를 사용해서 pape 값도 전달 되도록 코드를 수정해 보자.
@ModelAttribute는 강제로 전달받은 파라미터를 Model에 담아서 전달할 때 사용하는 어노테이션 @ModelAttribute가 걸린 파라미터는 타입에 관계없이 무조건 Model에 담아져 전달된다.
기본 자료형에 @ModelAttribute를 적용할 경우에는 반드시 @ModelAttribute(”page”)와 같이 값(value)을 지정하도록 해야 한다.
↪️ RedirectAttributes
Model 타입 외에 스프링 MVC가 자동으로 전달해 주는 타입 중에는 RedirectAttributes가 있다.
RedirectAttributes는 일회성으로 데이터를 전달하는 용도로 사용된다.
기존 Servlet에 response.sendRedirect()와 동일한 용도로 사용된다.
// Servlet에서 redirect 방식
response.sendRedirect("/home?name=aaa&age=10");
// 스프링 MVC를 이용하는 redirect 처리
rttr.addFlashAttribute("name", "AAA");
rttr.addFlashAttribute("age", 10);
return "redirect:/";
RedirectAttribute는 Modle과 같이 파라미터로 선언해서 사용하고
addFlashAttribute(이름, 값) 메서드를 이용해서 화면에 한 번만 사용할 데이터를 전달하기 위해 사용한다.
RedirectAttribute의 용도는 이후 예제 작성 시 여러 번 사용할 예정이다.
🧹 최종 정리
- 웹 페이지 구조는 Request에 전달된 데이터를 가지고 필요시 추가적인 데이터를 생성하여 화면에 전달하는 방식으로 동작
- Model의 경우는 파라미터로 전달된 데이터를 가지고 존재하지 않지만 화면에서는 필요한 데이터를 전달하기 위해 사용.
- 스프링 MVC의 Controller는 기본적으로Java Beans 규칙에 맞는 객체는 다시 화면으로 객체를 전달한다.
- Java Beans의 규칙은 생성자가 없거나 빈 생성자를 가지고 있고 getter/setter를 가진 클래스의 객체들을 의미
- 예제의 파라미터로 사용된 SampleDTO의 경우 Java Bean의 규칙에 맞기 때문에 자동으로 다시 화면까지 전달이 가능했다.
- 반면 기본 자료형의 경우 파라미터로 선언하여도 화면까지 전달되지 않는다(@ModelAttribute 사용시 가능하다.)
- @ModelAttribute : 전달받은 파라미터를 강제로 Model에 담아서 전달
- RedirectAttributes는 일회성으로 데이터를 전달하는 용도로 사용
위 내용은 코드로 배우는 스프링 웹 프로젝트 교재를 참고하여 작성되었습니다.