일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 테스트코드
- 백준
- 인터페이스
- HttpServletResponse
- 티스토리챌린지
- 다형성
- 오블완
- 서블릿
- java
- equals()
- 스프링
- http 메시지 컨버터
- 프록시
- 스프링컨테이너
- DI
- 김영한
- ocp
- 참조변수
- JSON
- objecterror
- fielderror
- html form
- 오버라이딩
- 추상클래스
- 코딩테스트
- 의존관계
- @configuration
- 코드트리
- 코드트리조별과제
- 싱글톤
- Today
- Total
minOS
스프링 MVC 기본 기능 - @RequestParam,@ModelAttribute 본문
스프링 MVC 기본 기능 - @RequestParam,@ModelAttribute
minOE 2024. 7. 28. 15:41@RequestParam
스프링이 제공하는 `@RequestParam` 을 사용하면 요청 파라미터를 매우 편리하게 사용할 수 있다.
1) @RequestParam 어노테이션을 사용한 요청 파라미터 처리 예제
@ResponseBody @RequestMapping("/request-param-v2") public String requestParamV2( @RequestParam("username") String myName, @RequestParam("age") int myAge) { // 로그로 myName과 myAge 출력 log.info("username = {} , age = {}", myName, myAge); return "ok"; }
@RequestParam : 파라미터 이름으로 바인딩
@ResponseBody : View 조회를 무시하고, HTTP message body에 직접 해당 내용 입력
2) @RequestParam 어노테이션 사용시 파라미터 이름을 생략한 예제 , 변수명과 요청 파라미터 네임이 같아야 함
@ResponseBody @RequestMapping("/request-param-v3") public String requestParamV3( @RequestParam String username, @RequestParam int age) { // 로그로 username과 age 출력 log.info("username = {} , age = {}", username, age); return "ok"; }
3)@RequestParam 어노테이션 없이 요청 파라미터 처리 예제@ResponseBody @RequestMapping("/request-param-v4") public String requestParamV4(String username, int age) { // 변수명이 요청 파라미터 이름과 동일해야 한다 // 로그로 username과 age 출력 log.info("username = {} , age = {}", username, age); return "ok"; }
`String` , `int` , `Integer` 등의 단순 타입이면 `@RequestParam` 도 생략 가능
4) 필수 요청 파라미터 처리 예제@ResponseBody @RequestMapping("/request-param-required") public String requestParamRequired( @RequestParam(required = true) String username, @RequestParam(required = false) Integer age) { // age는 요청 파라미터에서 빠질 수 있음 // 빠질 경우 null 값이 들어가야 하기 때문에 Integer로 선언 log.info("username = {} , age = {}", username, age); return "ok"; }
필수 파라미터인 username이 빠진 경우
@RequestParam.required
- 파라미터 필수 여부
- 기본값이 파라미터 필수( `true` )이다.주의! - 파라미터 이름만 사용
/request-param-required?username=`파라미터 이름만 있고 값이 없는 경우 빈문자로 통과
5) 요청 파라미터 기본 값 설정 예제@ResponseBody @RequestMapping("/request-param-default") public String requestParamDefault( @RequestParam(required = true, defaultValue = "guest") String username, @RequestParam(required = false, defaultValue = "-1") Integer age) { // 기본 값이 설정된 경우 파라미터가 없을 때 기본 값을 사용 log.info("username = {} , age = {}", username, age); return "ok"; }
- 파라미터에 값이 없는 경우 `defaultValue` 를 사용하면 기본 값을 적용할 수 있다. 이미 기본 값이 있기 때문에 `required` 는 의미가 없다.
-`defaultValue` 는 빈 문자의 경우에도 설정한 기본 값이 적용된다.
6) 요청 파라미터를 Map으로 처리하는 예제@ResponseBody @RequestMapping("/request-param-map") public String requestParamMap(@RequestParam Map<String, Object> paramMap) { // 요청 파라미터를 Map으로 받아서 처리 log.info("username = {} , age = {}", paramMap.get("username"), paramMap.get("age")); return "ok"; }
파라미터를 Map, MultiValueMap으로 조회할 수 있다.
`@RequestParam Map` ,
` Map(key=value)`
`
@RequestParam MultiValueMap`
` MultiValueMap(key=[value1, value2, ...]
ex) (key=userIds, value=[id1, id2])`
- 파라미터의 값이 1개가 확실하다면 `Map` 을 사용해도 되지만, 그렇지 않다면 `MultiValueMap` 을 사용하자.
@ModelAttribute
개발을 하면 요청 파라미터를 받아서 필요한 객체를 만들고 그 객체에 값을 넣어주어야 한다. 보통 다음과 같이 코드를 작성할 것이다.
import lombok.Data; @Data //`@Getter` , `@Setter` , `@ToString` , `@EqualsAndHashCode` , `@RequiredArgsConstructor`를 자동으로 적용해준다. public class HelloData { private String username; private int age; }
@ModelAttribute 사용하지 않는 경우
//@ModelAttribute 사용x @ResponseBody @RequestMapping("/model-attribute-v0") public String modelAttributeV1(@RequestParam String username, @RequestParam int age){ HelloData helloData =new HelloData(); helloData.setUsername(username); helloData.setAge(age); log.info("username = {} , age = {}", helloData.getUsername(),helloData.getAge()); return "ok"; }
@ModelAttribute 사용하는경우
마치 마법처럼 `HelloData` 객체가 생성되고, 요청 파라미터의 값도 모두 들어가 있다.@ResponseBody @RequestMapping("/model-attribute-v1") public String modelAttributeV2(@ModelAttribute HelloData helloData){ log.info("username = {} , age = {}", helloData.getUsername(),helloData.getAge()); return "ok"; }
스프링MVC는 `@ModelAttribute` 가 있으면 다음을 실행한다. `HelloData` 객체를 생성한다. 요청 파라미터의 이름으로 `HelloData` 객체의 프로퍼티를 찾는다. 그리고 해당 프로퍼티의 setter를 호출해서 파라미터의 값을 입력(바인딩) 한다.
예) 파라미터 이름이 `username` 이면 `setUsername()` 메서드를 찾아서 호출하면서 값을 입력한다.
프로퍼티
객체에 `getUsername()` , `setUsername()` 메서드가 있으면, 이 객체는 `username` 이라는 프로퍼티를 가지고 있다.
username 프로퍼티의 값을 변경하면 `setUsername()` 이 호출되고, 조회하면 `getUsername()` 이 호출된다.
@ModelAttribute 생략하는 경우
@ResponseBody @RequestMapping("/model-attribute-v2") public String modelAttributeV3( HelloData helloData){ log.info("username = {} , age = {}", helloData.getUsername(),helloData.getAge()); return "ok"; }
스프링은 해당 생략시 다음과 같은 규칙을 적용한다.
`String` , `int` , `Integer` 같은 단순 타입 = `@RequestParam`
나머지 = `@ModelAttribute` (argument resolver 로 지정해둔 타입 외)
'TIL > 김영한의 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술' 카테고리의 다른 글
스프링 MVC 기본 기능 - HTTP 요청 메시지(2) (0) | 2024.07.30 |
---|---|
스프링 MVC 기본 기능 - HTTP 요청 메시지(1) (0) | 2024.07.29 |
스프링 MVC 기본 기능 - HTTP 요청 파라미터 (0) | 2024.07.28 |
스프링 MVC 기본 기능 - HTTP 요청 (0) | 2024.07.28 |
스프링 MVC 기본 기능 - 요청 매핑 API 예시 (0) | 2024.07.28 |