본문 바로가기
Spring/spring mvc

HTTP 요청 파라미터 - 쿼리 파라미터, HTML FORM + @RequestParam, @ModelAttribute

by 킹차니 2021. 6. 28.
김영한님의 인프런 강의와 PDF를 바탕으로 정리하였습니다.
https://www.inflearn.com/courses?s=%EA%B9%80%EC%98%81%ED%95%9C

 

HTTP 요청 파라미터 - 쿼리 파라미터, HTML Form HTTP

요청 데이터 조회 - 개요

스프링이 제공하는 HTTP 요청 데이터를 조회 하는 방법을 알아보겠습니다.

 

 

HTTP 요청 메시지를 통해 클라이언트에서 서버로 데이터를 전달하는 방법을 알아보겠습니다.

클라이언트에서 서버로 요청 데이터를 전달할 때는 주로 다음 3가지 방법을 사용합니다.

 

GET - 쿼리 파라미터

  /url?username=hello&age=20
  메시지 바디 없이, URL의 쿼리 파라미터에 데이터를 포함해서 전달 예) 검색, 필터, 페이징등에서 많이 사용하는 방식

 

POST - HTML Form

  content-type: application/x-www-form-urlencoded
  메시지 바디에 쿼리 파리미터 형식으로 전달 username=hello&age=20 ) 회원 가입, 상품 주문, HTML Form 사용

 

 HTTP message body에 데이터를 직접 담아서 요청

 HTTP API에서 주로 사용, JSON, XML, TEXT

 데이터 형식은 주로 JSON 사용
 POST, PUT, PATCH

 


 

요청 파라미터 - 쿼리 파라미터, HTML Form
HttpServletRequest request.getParameter() 를 사용하면 다음 두가지 요청 파라미터를 조회할 수 있습니다.

 

GET, 쿼리 파라미터 전송
예시 ) http://localhost:8080/request-param?username=hello&age=20

 

POST, HTML Form 전송

예시)

POST /request-param ...
content-type: application/x-www-form-urlencoded
username=hello&age=20

 

GET 쿼리 파리미터 전송 방식이든, POST HTML Form 전송 방식이든 둘다 형식이 같으므로 구분없이 조회할 수 있습니다.
이것을 간단히 요청 파라미터(request parameter) 조회라 합니다.

 

지금부터 스프링으로 요청 파라미터를 조회하는 방법을 단계적으로 알아보겠습니다.

 

 

RequestParamController

postman으로 GET, POST 둘다로 보내보고, HTML Form으로도 POST를 날려보겠습니다.

 

 

1. postman GET으로 보내기

 

2.postman post로 보내기

 

3.html form의 post로 보내기

 

 

 

로그 확인

 

 

 

 

++  html파일 경로

리소스는 /resources/static 아래에 두면 스프링 부트가 알아서 자동으로 인식합니다.

(프로젝트를 jar로 만들면 webapp경로를 사용할 수 없습니다. 이제부터 정적 리소스도 클래스 경로에 함께 포함해야합니다.)

 

 


@RequestParam

@RequestParam으로 요청 파라미터를 받는 방법들을 보겠습니다.

 

1. @RequestParam("요청 파라미터 변수명") String 변수명

 

 

2. @RequestParam String 요청 파라미터 변수명.   ---제일 권장되는 방법

 

 

3. @RequestParam마저 생략하는 방법

 

4. required 조건을 추하여 필수 값을 정할 수 있습니다.

디폴트는 required=true 입니다. 

required=false 이면  age는 요청파라미터로 안넘겨도 ok입니다.

주의할 점은 username을 입력하지 않고 넘기면 빈문자열로 통과된다는 것입니다.

 

 

주의
@RequestParam 애노테이션을 생략하면 스프링 MVC는 내부에서 required=false 를 적용한다.

 

 

 

아래에서 username 없이 날려보겠습니다.

이렇게 빈문자열로 처리된다...

그리하여 default값을 지정할 수 있는 방법이 있습니다.

 

5. 디폴트 지정하기

만약 

http://localhost:8080/request-param-default 처럼 쿼리 스트링을 아예 넘겨주지 않았거나

http://localhost:8080/request-param-default?username=&age=20 

처럼 빈문자열로 넘겨주면 디폴트로 지정한 값이 적용됩니다.

 

username만 빈 문자열로 보내기

위의 결과:

 

 

username, age둘 다 빈 문자열로 보내기

위의 결과:

 

 

7. Map으로 요청 파라미터 조회하기

위의 결과:

 

@RequestParam Map ,

  Map(key=value)

 @RequestParam MultiValueMap

  MultiValueMap(key=[value1, value2, ...] ex) (key=userIds, value=[id1, id2])

파라미터의 값이 1개가 확실하다면 Map 을 사용해도 되지만, 그렇지 않다면 MultiValueMap 을 사용하는 것이 좋습니다.

 

 

 


 

 

 

@ModelAttribute

 

요청 파라미터를 modelAttribute로 받아보겠습니다.

요청 파라미터 값을 받고 그 값으로 아래와 같은 HelloData객체를 만듭니다.

( 롬복의 @Data = @Getter + @Setter + @ToString + @RequiredArgsConstructor )

 

우리는 날라온 요청 파라미터를 값으로 객체를 생성해야 합니다, 일단 제일 기본적인 방법은 다음과 같이 @RequestParam을 사용하는 방법입니다.

 

1. @ReqestParam으로 값을 받고 직접 객체 만들기

결과:

 

 

이제 @ModelAttribute를 사용해보겠습니다.

 

2. @ModelAttribute 사용하기

결과:

 

HelloData 객체가 생성되고, 요청 파라미터의 값도 모두 들어가 있습니다.

스프링MVC@ModelAttribute 가 있으면 다음을 실행합니다.

1. HelloData 객체를 생성한다.

2. 요청 파라미터의 이름으로 HelloData 객체의 프로퍼티를 찾는다. 그리고 해당 프로퍼티의 setter를 호출해서 파라미터의 값을 입력(바인딩) 한다.
) 파라미터 이름이 username 이면 setUsername() 메서드를 찾아서 호출하면서 값을 입력한다.

 

프로퍼티

객체에 getUsername() , setUsername() 메서드가 있으면, 이 객체는 username 이라는 프로퍼티를 가지고 있습니다.
username 프로퍼티의 값을 변경하면 setUsername() 이 호출되고, 조회하면 getUsername() 이 호출됩니다.

 

 

 

 

심지어 @ModelAttribute도 생략할 수 있습니다.

3. @ModelAttribute생략하기

결과:

생략해도 잘됩니다...

 

@ModelAttribute 는 생략할 수 있다. 그런데 @RequestParam 도 생략할 수 있습니다.

스프링은 해당 생략시 다음과 같은 규칙을 적용합니다.
String , int , Integer 같은 단순 타입 = @RequestParam

나머지 = @ModelAttribute (argument resolver 로 지정해둔 타입 외)

 

위의 경우는 단순 타입이 아닌 객체가 파라미터에 들어가 있으므로 @ModelAttribute가 작동되는 것입니다.