티스토리 뷰
클라이언트가 서비스를 이용하면 다양한 값들을 서버에 요청할 때 같이 전달하여 서버는 해당 값들을 읽고 요청을 수행한다
어노테이션 기반의 스프링 컨트롤러는 다양한 파라미터를 지원하는데
클라이언트가 요청을 보낼때 서버 쪽에서 다양한 값들을 조회하는 방법을 살펴보고자 한다
required & default value
스프링 어노테이션으로 하나의 값을 조회하는 경우 대부분 필수 값이라 null값이 들어오게 되면 에러가 발생한다
이때 required를 false값(default가 true)으로 주게 되면 해결이 된다
더 나아가서는 default value를 정의하여 해당 값이 없을 때
default값을 줄 수 있다 (이렇게 되면 항상 값이 존재하니 required는 생략해도 무방)
//예시
public void headerCookie(@CookiValue(value = "customCookie", required = false) String cookie) {}
public void requestParam(@RequestParam(required = true, defaultValue = "name") String username) {}
Request Header (요청 헤더)
HTTP의 요청 헤더 정보를 조회 하는 방법은 아래와 같다
• HttpMethod : HTTP 메서드 조회
@RequestMapping("/headers")
public void headers(HttpMethod httpMethod) {
System.out.println(httpMethod);
}
//GET으로 요청 시에 "GET" 출력
• Locale : Locale 정보 조회
@RequestMapping("/headers")
public void headers(Locale locale) {
System.out.println(locale);
}
//한국어 설정인 ko_KR로 출력
• @RequestHeader MultiValueMap (요청의 모든 헤더 조회)
@RequestMapping("/headers")
public void headers(@RequestHeader MultiValueMap<String, String> headerMap) {
System.out.println(headerMap);
}
// 아래와 같이 모든 요청 헤더 정보가 Map형식으로 출력
{mode=[debug],
content-type=[application/json],
user-agent=[PostmanRuntime/7.28.4],
accept=[*/*],
postman-token=[4faf31c8-6d31-48ea-a8bf-05cde88b9279],
host=[localhost:8080],
accept-encoding=[gzip, deflate, br],
connection=[keep-alive],
content-length=[28]}
• @RequestHeader (특정 헤더 조회)
@RequestMapping("/headers")
public void headers(@RequestHeader("host") String host) {
System.out.println(host);
}
//특정 헤더로 조회한 host에 대한 정보 출력 localhost:8080
• @CookieValue (쿠키 조회)
@RequestMapping("/headers")
public void headers(@CookieValue(value = "customCookie") String cookie) {
System.out.println(cookie);
}
Request Data (요청 데이터)
클라이언트가 서버쪽에 요청 데이터를 보낼 때
쿼리 파라미터, Form, HTTP Body와 같이 이 세 가지 방식이면 거의 모든 데이터를 보낼 수 있다
이들의 데이터를 조회하는 방법은 아래와 같다
• @RequestParam (쿼리 파라미터, Form 조회)
key=value형식으로 오는 쿼리 파라미터나 Form의 값을 조회할 수 있다
또한 자료형을 지정해주기 때문에 스프링이 알아서 해당 자료형으로 변환하여 가져온다
//key 값 지정
public void requestParam(@RequestParam ("username") String username {
String name = username;
}
//변수명과 key값이 같으면 생략 가능
public void requestParam(@RequestParam String username) {
String name = username;
}
//변수명이 같으면 심지어 @RequestParam도 생략 가능 (합의하에서만 사용)
public void requestParam(String username) {
String name = username;
}
• @RequestParam Map (쿼리 파라미터, Form 맵 형식으로 전체 조회)
// 맵형식으로 requestParam 조회
public void requestParamMap(@RequestParam Map<String, Object> paramMap) {
String name = paramMap.get("username")
int age = paramMap.get("age")
}
• @ModelAttribute (객체로 조회)
DTO같이 어떠한 형식이 이미 정의되어 있는 객체를 만들어 값을 가지고 오는 경우
ModelAttribute를 사용하면 바로 객체에 값을 넣어 조회가 가능하다
//form에서 넘어오는 값
username = kim
age = 20
//memberDTO
public class MemberDTO {
private String username;
private int age;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
//modelAttribute로 객체 조회
public void requetModel (@ModelAttribute MemberDTO memberDTO) {
String name = memberDTO.getUsername();
int age = memberDTO.getAge();
}
작동원리는 getUsername의 메서드에서 볼 수 있듯이
객체에 있는 setter와 getter를 활용하여 작동한다
또한 가져오는 값들이 객체의 변수명과 같으면 ModelAttribute 또한 생략이 가능하다 (합의하에서만 사용)
• @RequestBody (HTTP Body 조회)
이름에서부터 알 수 있듯이 Request Http Body 즉 HTTP 바디를 조회할 때 사용한다
public void requestBody(@RequestBody String httpBody) {
String body = httpBody
}
@RequestBody가 유용하게 사용 될 때는 JSON을 조회할 때 매우 편리하게 조회할 수 있다는 것인데
@ModelAttribute처럼 객체로 JSON을 조회할 수 있다
//memberDTO
public class MemberDTO {
private String username;
private int age;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
//requestBody로 객체 조회
public void requetModel (@RequestBody MemberDTO memberDTO) {
String name = memberDTO.getUsername();
int age = memberDTO.getAge();
}
주의할 점은 HTTP바디를 직접 조회하는 @RequestBody는 파라미터를 조회하는 @RequestParam이나 @ModelAttribute와는 전혀 관계가 없다는 것이다
핵심정리
클라이언트가 서버에 요청할때 값들이 같이 넘어간다
이 값을 다양한 방법을 조회할 수 있다
• 헤더 조회
HttpMethod : HTTP의 Method조회
Locale : 언어설정 조회
@RequestHeader : HTTP의 특정 헤더 조회
@RequestHeader MultiValueMap : HTTP의 모든 헤더 조회
@CookieValue : 특정 쿠키 조회
• 데이터 조회
@RequestParam : 특정 key=value 조회
@RequestParam Map : 모든 key=value 맵 형식으로 조회
@ModelAttribute : key=value 객체로 조회
@RequestBody : HTTP 바디 조회, JSON 같은 key=value형식은 객체로도 조회 가능
•required & default value
어노테이션으로 단수값을 받아오는 경우 필수 값인 경우가 있음 (required=true가 기본값) 이때 값이 없으면 에러가 발생
이때 required=false로 주면 해결이 가능함
더 나아가서는 default value 즉 기본값을 설정하여 값이 들어오지 않는 상황을 방지할 수 있음
개인 학습을 위해 작성되는 글입니다.
제가 잘못 알고 있는 점에 대한 지적 / 더 나은 방향에 대한 댓글을 환영합니다.
참조 링크:
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-1/dashboard
'Spring > Spring MVC' 카테고리의 다른 글
[Spring MVC] PRG (Post/Redirect/Get) 패턴 (0) | 2021.08.31 |
---|---|
[Spring MVC] HTTP Response (HTTP 응답) (0) | 2021.08.30 |
[Spring MVC] HTTP Message Converters (HTTP 메시지 컨버터) (0) | 2021.08.28 |
[Spring MVC] Argument Resolver와 ReturnValue Handler (0) | 2021.08.27 |
[Spring MVC] Request Mapping 과 REST API 설계 (0) | 2021.08.24 |
- Total
- Today
- Yesterday
- @ExceptionHandlere
- 제이쿼리 직접 선택자
- ExceptionHandlerExceptionResolver
- 쿠키
- application/x-www-form-urlencoded
- @ResponseStatus
- Session
- jQuery 직접 선택자
- ResponseStatusExeceptionResolver
- 제이쿼리 위치탐색선택자
- Spring TypeConverter
- 제이쿼리 인접 관계 선택자
- uri
- 제이쿼리 기본 선택자
- Spring MVC
- cookie
- 제이쿼리란
- Cache
- maenco
- OOP
- http
- 캐시
- 제이쿼리 탐색선택자
- DTO와 VO의 차이
- Spring Container
- Spring API Error
- 세션
- DefaultHandlerExceptionResolver
- 맨코
- spring
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |