[스프링부트] - Model 객체

2025. 5. 6. 15:56·Spring
728x90
반응형
SMALL

우리는 저번에 Spring MVC를 알아봤다.

View Model Controller로 이 세가지 구성요소를 보면 된다.

MVC의 간단한 다이어그램

 

Model 객체

컨트롤러의 메서드는 Model이라는 타입의 객체를 파라미터로 받을 수 있다.

Model객체는 key와 value로 이루어져있는 HashMap이다.

 

@ModelAttribute와 차이점은?

둘 다 메소드의 파라미터로 바인딩할 때 사용되지만 역할과 방식에 차이가 있다.

 

  • 파라미터 레벨
    • 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값으로 접근이 가능한 것이다.

 

728x90
반응형
LIST

'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
'Spring' 카테고리의 다른 글
  • [스프링부트] - Controller Advice
  • [스프링부트] - AOP에 대해서 알아보자
  • [스프링부트] - 페이징
  • [스프링부트] - JPA 연관관계
코린이 파닥거리기
코린이 파닥거리기
    반응형
    250x250
  • 코린이 파닥거리기
    코린이 파닥거리기의 블로그
    코린이 파닥거리기
  • 전체
    오늘
    어제
    • 분류 전체보기 (126) N
      • 백준[파이썬] (55) N
      • Spring (31)
      • CS (1)
      • 자바 (4)
      • 백준[자바] (20)
      • 프로그래머스 (5)
      • 토이프로젝트 (1)
      • SWEA (2)
      • MSA (6)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    JPA
    SWEA
    누적합
    MSA
    코딩테스트
    spring
    자바
    스프링
    Java
    테스트코드
    스프링 부트와 AWS로 혼자 구현하는 웹 서비스
    재귀
    스프링부트
    파이썬
    JWT
    SpringBoot
    백준
    프로그래머스
    스프링 클라우드
    컨테이너
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
코린이 파닥거리기
[스프링부트] - Model 객체
상단으로

티스토리툴바