티스토리 뷰

반응형

클라이언트가 서비스를 이용하면 다양한 값들을 서버에 요청할 때 같이 전달하여 서버는 해당 값들을 읽고 요청을 수행한다

어노테이션 기반의 스프링 컨트롤러는 다양한 파라미터를 지원하는데

클라이언트가 요청을 보낼때 서버 쪽에서 다양한 값들을 조회하는 방법을 살펴보고자 한다

 

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

 

반응형
댓글