@Requestparam의 쓰임에 대해 헷갈리는 부분이 있었습니다. 따라서 이번 포스팅에서는 @RequestParam에서 select tag의 필드를 직접 가져올 수 있는 이유에 대해 예시 코드를 바탕으로 이해해보는 시간을 가져보도록 하겠습니다.
thymeleaf.html
<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>
Controller.class
@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";
}
문제상황
위의 코드 예제에서
@RequestParam에서 필드값인 member.id이 아니라 select 태그의 memberId를 인자로 했는데 option value 값(필드)인 member.id를 직접 가져올 수 있는가??에 대한 궁금증이 생겼습니다. 왜냐하면 Requestparam은 필드의 이름(member.id)을 직접 적어줘야 참조할 수 있다고 배웠기 때문입니다.
예를들어
class A{
String name;
}
의 필드값을 받을 때 @RequestParam("name", name) 이런식으로 필드를 직접 참조해 값을 받아왔습니다.
하지만 위의 select 예제에서는 select option의 value인 member.id를 직접 참조하는 것이 아니라 select의 이름 memberId를 참조해 필드값을 받아오기때문에 이해가 되지 않았습니다.
해결
select는 전송될때 name 속성인 memberId라는 key로 전송되고 그것의 value는 member.id값입니다. 따라서 RequestParam에서 키값인 memberId로 value인 member.id 즉 Long memberId를 가져올 수 있었던 것입니다.
추가 의문 해결
그렇다면 value가 아닌
th:text="${member.name}"
는 어떻게 참조할 수 있을까요? 받은 id를 바탕으로 아래의 코드처럼 name을 구할 수 있습니다.
member = findMemeber(memberId);
member.getName();
'IT > 디버깅' 카테고리의 다른 글
[Spring] 윈도우 터미널에서 gradlew test 에러 해결 (0) | 2022.10.31 |
---|---|
[디버깅] h2 콘솔에 테이블이 안보이는 원인 해결 (1) | 2022.09.26 |
Failed to load ApplicationContext 에러 해결 (22) | 2022.08.23 |
@GeneratedValue() 테이블 생성 이슈 및 Insert 쿼리 안나가는 이슈 해결하기 (0) | 2022.08.09 |
스프링 @ModelAttribute 데이터 매핑안됨 (0) | 2022.07.29 |