우리는 저번에 Spring MVC를 알아봤다.
View Model Controller로 이 세가지 구성요소를 보면 된다.
Model 객체
컨트롤러의 메서드는 Model이라는 타입의 객체를 파라미터로 받을 수 있다.
Model객체는 key와 value로 이루어져있는 HashMap이다.
@ModelAttribute와 차이점은?
둘 다 메소드의 파라미터로 바인딩할 때 사용되지만 역할과 방식에 차이가 있다.
- 파라미터 레벨
- HTTP 요청 파라미터를 객체의 속성에 자동으로 매핑해주는 역할을 한다.
즉, 클라이언트가 보낸 데이터를 서버의 객체로 변환해주는 데이터 바인딩 기능이다. - 폼 제출 데이터를 객체로 받아서 처리할 때 유용
- HTTP 요청 파라미터를 객체의 속성에 자동으로 매핑해주는 역할을 한다.
- 메소드 레벨
- RequestMapping메소드가 실행되기 전에 특정 메소드를 실행하고, 반환 값을 자동으로 Model객체에 추가한다.
- 여러 핸들러 메소드/뷰에서 공통적으로 필요한 데이터를 미리 모델에 담아두고 싶을때 사용된다.
- 리턴 레벨
- RequestMapping 메소드의 반환 값 앞에 붙어서 반환값을 뷰 이름으로 하지 않고 Model에 추가하도록 명시
즉, @ModelAttribute는 Model객체에 데이터를 담는 "방법" 또는 "과정" 중 하나라고 보면된다.
Model은 데이터를 담는 "바구니" 그 자체라고 보면 됨.
Model 객체 예시
@GetMapping("/holidayparking")
public String holidayparking(
Model model, @RequestParam(defaultValue = "1") int page,
@RequestParam(defaultValue = "") String search) {
int startpage = (page-1) / 10 *10 +1;
int endpage = startpage+9;
Pageable pageable = PageRequest.of(page-1,10);
Page<HolidayParking> p = hpr.findByInstitutionContainingOrSidoContainingOrGuContaining(
search, search, search, pageable);
model.addAttribute("totalElement",p.getTotalElements());
model.addAttribute("totalpage",p.getTotalPages());
model.addAttribute("hp",p.getContent());
model.addAttribute("startpage",startpage);
model.addAttribute("endpage",endpage);
model.addAttribute("search", search);
return "holiday_parking";
}
페이징의 예시인데 Model을 객체로 받아온다.
addAttrivute()메서드를 통해 view에 전달할 데이터를 저장할 수 있다.
Servlet의 request.setAttribute()메서드와 비슷한 역할을 한다.
model.addAttribute("totalElement",p.getTotalElements());
model.addAttribute("totalpage",p.getTotalPages());
model.addAttribute("hp",p.getContent());
model.addAttribute("startpage",startpage);
model.addAttribute("endpage",endpage);
model.addAttribute("search", search);
Model은 HasMap형태를 띄고 있으므로 key값을 통해 value로 접근이 가능하다.
첫번째 줄만 보자면 key가 totalElement이고, value가 p.getTotalElements이다.
- getTotalElements: 검색 조건에 해당하는 전체 결과의 총 개수를 반환
- getTotalPages: 검색 조건에 해당하는 데이터개수를 페이지 크기로 나눴을 때 총 페이지 수
- getContent: JPA의 Page객체가 제공하는 메소드로 현재 페이지에 해당하는 데이터 레코드들의 리스트를 반환
---> 리스트 형식의 실제 데이터 목록을 반환해준다.(리스트 안에는 객체가 담겨져있다.)
그럼 HolidParking의 Value값에는 위 목록들이 리스트 형식으로 들어간다.
View영역에서 model에 저장한 값 불러오기
그럼 우리는 이 model 객체에 저장된 값을 활용을 해야하는데
<tr th:each="h : ${hp}">
<td>[[${h.id}]]</td>
<td>[[${h.sido}]]</td>
<td th:utext = "${h.gu}"></td>
<td th:utext = "${h.institution}"></td>
<td>[[${h.manager}]]</td>
<td>[[${h.tel}]]</td>
</tr>
타임리프를 통해서 hp key값을 ${hp}로 불러올 수 있다.
each문으로 한개의 key값을 출력해준다.
- h의 id값
- h의 sido값
- h의 gu값
등등으로 이렇게 출력이 가능하다.
가능한 이유?
getContent는 List<HolidayParking>에 담겨있던 하나의 HolidayParking객체를 꺼내는 것이다.
그래서 h의 id값으로 접근이 가능한 것이다.
'Spring' 카테고리의 다른 글
[스프링부트] - Controller Advice (1) | 2025.05.07 |
---|---|
[스프링부트] - AOP에 대해서 알아보자 (0) | 2025.05.07 |
[스프링부트] - 페이징 (0) | 2025.05.05 |
[스프링부트] - JPA 연관관계 (0) | 2025.04.30 |
[스프링부트] - JPA를 알아보자 (1) | 2025.04.28 |