인프런 커뮤니티 질문&답변

taeu kim님의 프로필 이미지
taeu kim

작성한 질문수

실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발

주문 목록 검색, 취소

orderForm Post

작성

·

273

1

질문

1.orderForm을 Post로 보냈는데 왜 content type이 text/html 인가요?? application/x-www-form-urlencoded 아닌가요? 그리고 Form 데이터는 어디있나요 보이지 않습니다.

2.@RequestParam은 form형식의 데이터나 url형식으로 받아야하는데 어떻게 "memberId"처럼 필드값을 바로 받을 수 있나요?? 구글링을 해봐도 잘 안나옵니다. 혹시 키워드 가르쳐주시면 직접 찾아보겠습니다.

Controller

@PostMapping("/order")
public String order(@RequestParam("memberId") Long memberId,
                    @RequestParam("itemId") Long itemId,
                    @RequestParam("count") int count){

    orderService.order(memberId, itemId, count);
    return "redirect:/orders";
}

답변 2

1

안녕하세요. taeu kim님, 공식 서포터즈 David입니다.

  1. Response Header가 아닌 Request Header를 봐주세요.

  2. 스프링 MVC 1편 https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-1/unit/71220 을 참고해주세요.

감사합니다.

taeu kim님의 프로필 이미지
taeu kim
질문자

답변 감사합니다. 2번의 경우 강의가 없다고 가정하고 스스로 해결해보고 싶었습니다. 이러한 경우 구글링은 어떤 키워드로 해야하는지요?.

정말 많은 키워드로 삽질을 했지만 원하는 결과를 얻을 수 없었습니다.

추가적으로 링크를 통해 동영상을 보았지만 제 질문과는 다른 내용이었습니다. 직접 option의 값인 member.id가 아닌 select의 이름 memberId를 매개로 어떻게 Long memberId를 가져올 수 있는지 궁금합니다.

'어떻게 "memberId"처럼 필드값을 바로 받을 수 있나요??'

이 말씀이 어떤 것을 말씀하시는지 코드나 더 자세히 말씀해주실 수 있으실까요?

taeu kim님의 프로필 이미지
taeu kim
질문자

직접 option의 값인 member.id가 아닌 상위의 select의 이름 memberId를 매개로 어떻게 Long memberId를 가져올 수 있는지 궁금합니다.

기존에 RequestParam을 사용할 때

예를 들어

class A{

String name;

} 의 필드값을 받을 때

@RequestParam("name", name) 이런식으로 필드를 직접 참조해 값을 받아왔습니다.

하지만 위의 select 예제에서는

select option의 value인 member.id를 직접 참조하는 것이 아니라 select의 이름 memberId를 참조해

필드값을 받아오기때문에 이해가 되지 않습니다.

===추가===
<select name="memberId" id="member" class="form-control">

<option value="">회원선택</option>

<option th:each="member : ${members}"

th:value="${member.id}"

th:text="${member.name}" />

</select>

코드가 위처럼 되어있을 때 value의 member.id값을 가져오기위해서

@RequestParam("memberId" Long memberId) 가 맞나요

@RequestParam("member.id" Long memberId)가 맞나요?

질문 핵심은 폼(질문 내용에서는 select에서 선택된 값)에서 제출한 데이터를 RequestParam으로 어떻게 받느냐를 물으시는 것 같은데 맞을까요?

아니라면 다시 말씀해주세요.

 

먼저, 아래 강의를 봐주세요.

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-1/unit/71219

 

  1. 폼에서 제출할 때 요청과 함께 폼에서 제출한 데이터가 어떻게 가는지 아셔야 합니다.

    1. urlencoded 방식과 post로 제출된다면 데이터는 다음과 같이 제출됩니다.

      1. memberId="선택된 항목의 값"&memberName="david"

  2. @RequestParam("memberId")는 1-i-a에서 memberId에 해당하는 값을 가져오게 됩니다.

 

즉, 폼에서 제출한 데이터를 RequestParam으로 받으려면 input 태그의 name 속성을 RequestParam의 name 속성의 값으로 입력해야 합니다.

<select name="memberId"> => RequestParam("memberId")

 

0

taeu kim님의 프로필 이미지
taeu kim
질문자

제 질문을 이해하신것같습니다. 답변이 되었습니다. 하지만 위의 링크 강의에는 관련 내용(Form 데이터가 넘겨지는 방식)이 나오지 않습니다. 2번 복습하고 동영상 보라고하셔서 오늘까지 총 3번이나 봤는걸요 ㅠㅠㅠ

select 태그에서는 key가 name이고 value가 memberId니까 @RequestParam("memberId")는 됩니다. 하지만 위의 예제에선 @RequestParam("memberName")으로 값을 가져올 수 없습니다. 이건 이유가 뭔가요? 답변자님께서 설명해주신걸로는 해결이 안됩니다.

 

== 결론 ==

form post로 보낼 때

name : value &name2: value2 이런식으로 보내지는 데 위 코드의 예제에선 아래와 같이 보내지네요.

image

따라서 memberName을 바로 가져올 순 없고 memberId를 키로 1이라는 value를 받아, member.getName()으로 찾아오면 되는 것같습니다.

상세한 답변 감사드립니다.

memberName은 예시였습니다. 오히려 이해하시는데 방해를 했네요.

FormData 오른쪽에 view souce를 선택하시면 memberId=1&itemId=2&count=1 이 나올겁니다.

 

위에 언급한 강의 내 @RequestParam과 Form Post 전송 둘 모두를 들으시면 더 잘 이해하실 수 있을 것 같습니다.

@RequestParam은 url 뒤에 오는 쿼리스트링과 body 내 데이터(여기서는 key=value 형태)를 모두 처리할 수 있습니다.

taeu kim님의 프로필 이미지
taeu kim

작성한 질문수

질문하기