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

임현강님의 프로필 이미지

작성한 질문수

스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술

MVC와 템플릿 엔진

@RequestParam()질문

해결된 질문

작성

·

1.5K

4

안녕하세요 강사님, @RequestParam의 사용법에 대해 질문드립니다.

hello()에서는 model객체에 key, value를 직접적으로 넣어줬습니다.

helloMvc()에서는 value값을 직접 입력하지 않고 파라미터로 넘어온 값을 사용하기 위해 매개변수로 받아서 사용하였습니다.

의도에 대해서는 이해했지만 왜 굳이 @RequestParam이 쓰인 것인지를 이해하지 못했습니다.

그냥 String name으로 받아서 name을 value로 넘겨줄 수는 없는 것인가요?

혹시 localhost:8080/hello-mvc?name=asdf 처럼 쿼리스트링 형태로 파라미터를 전달하기 위해선 만드시 @RequestParam을 사용해야 하는 건가요?

만약 그렇다면 localhost:8080/hello-mvc?name=asdf 에서 name은 model에 넘겨줄 key값으로서의 name이 아니라 @RequestParam(" ")의 쌍따옴표 안에 name이 왔기 때문에 name=asdf로 받은 것인가요? 

@RequestParam("name")과 model의 key가 똑같이 name을 사용하다 보니 좀 헷갈리는 부분이 있네요.

답변 5

12

임현강님의 프로필 이미지
임현강
질문자

영한님의 추가 답변과 약간의 구글링으로 확실하게 이해하고 넘어갑니다. 감사합니다.

같은 궁금증을 갖고 계신 분이 있을까 싶어 이해한 내용을 정리하여 남겨둡니다.

혹시라도 제가 남긴 내용이 잘못되었다면 말씀 부탁드립니다.

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

1. @RequestParam을 쓰지 않아도 쿼리스트링으로 받은 값을 사용할 수 있다.
-> 쿼리스트링 : ~~?name=asdf,   public String helloMvc(String name)  이 경우 String name에 asdf이 전달됨.
-> 단, 쿼리스트링의 key값이 String name과 다를 경우(name이 아닐 경우) String name에는 null이 전달됨.
->ex,       ~~?nme=asdf,  public String helloMvc(String name) -> String name == null

2. 영한님의 두번째 답변처럼 @RequestParam 뒤에 오는 String name은 컴파일 이후 변수명이 변경되어 혼동을 초래할 수 있음. 이를 방지하기 위해 @RequestParam("name")으로 쿼리스트링의 key값은 name이라는 것을 명확하게 표현.
-> @RequestParam("name")을 사용했을 경우 쿼리스트링에서는 반드시 ~~?name=asdf으로 사용하여야 함.-> 만약 @RequestParam("name") String nme 이 상황에서 ~~~?nme=asdf으로 받으면 에러 발생. RequstParam을 썼으면 반드시 RequestParam과 key값을 맞춰야 함.
-> RequestParam없이 그냥 String name만 했을 때는 이름을 다르게 받으면 그냥 null값이 전달되었으나 RequestParam을 사용했을때 이름을 다르게 받으면 null전달이 아니라 에러가 뜨는 이유?
-> 이건 본인의 추측인데 아마 RequestParam은 key값을 명확하게 하기 위한 용도로 명시된 key값을 반드시 사용해야만 한다는 강제성을 부여하는듯. 반드시 사용해야하는 key값을 사용하지 않았기 때문에 null전달이 아니라 에러 발생한 것.
(추측이 아니라 팩트 맞네요. @RequestParam의 required 변수의 기본값이 true였네요.)

3. @RequestParam 안에 다른 매개변수들이 들어올 수도 있음. 
-> @RequestParam(name, defaultValue, required, value)
-> name : 강의에서 사용한 파라미터
-> defaultValue : name이 전달되지 않을 경우 전달해줄 기본값
-> required : name 값의 강제성 여부 (디폴트는 true)
-> value : name과 같은 역할을 하는 name의 alias. 단, name과 value를 동시에 쓸 수 없음. (value는 굳이 왜 만들어 놓은 것인지..?)

@RequestParam에 대한 추가 정보를 얻은 '뉴렉쳐'님의 유튜브 영상 링크를 공유합니다.

https://www.youtube.com/watch?v=aBTbtFLScC0&list=RDCMUC5-ixpj8DioZqmrasj6Ihpw&index=9&ab_channel=%EB%89%B4%EB%A0%89%EC%B2%98

https://www.youtube.com/watch?v=NlUvvtCe-6I&list=RDCMUC5-ixpj8DioZqmrasj6Ihpw&index=1&ab_channel=%EB%89%B4%EB%A0%89%EC%B2%98

3

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. 현강님

@RequestParam을 생략해도 됩니다^^

String name 만으로도 받을 수 있습니다. 그런데 시스템에 따라서 자바 컴파일러 최적화 옵션을 적용할 수 있는데요. 그렇게 되면 컴파일 시점에 name이라는 변수가 사라지기 때문에, 이 경우 받을 수가 없습니다.

그래서 다음과 같이 되어버릴 수 있습니다.

@RequestParam("name") String name ->컴파일 후 @RequestParam("name") String x01

이런 문제 때문에 명시적으로 다음과 같이 작성해줍니다. @RequestParam("name")

추가로 이렇게 작성하면 @RequestParam("name") String username HTTP 요청 파라미터 정보와 실제 변수 명을 다르게 가져갈 수 도 있습니다.

model에 넣어준 것은 HTML 응답을 만들 때 사용한 것이고, 방금 설명드린 것은 요청에 대한 부분입니다^^

감사합니다.

2

김영한님의 프로필 이미지
김영한
지식공유자

이렇게 설명을 드릴께요.

localhost:8080/hello-mvc?name=asdf

컴파일 전

@GetMapping("hello-mvc")
public String helloMvc(@RequestParam("name") String name=asdf, Model model) {
model.addAttribute("name", name=asdf);
return "hello-template";
}

컴파일 후

@GetMapping("hello-mvc")
public String helloMvc(@RequestParam("name") String x01=asdf, Model model) {
model.addAttribute("name", x01=asdf);
return "hello-template";
}

도움이 되셨길 바래요.

0

좋은 질문과 답변들 감사합니다

0

임현강님의 프로필 이미지
임현강
질문자

그럼 @RequestParam("name") String name이 아닌 @RequestParam("name")으로만 받는 것이 더 적절한 방법이란 말씀이신가요?

그럼 왜 강의에서는 @RequestParam("name") String name으로 받으셨던 것인지요?

이해가 잘 안 되네요 ㅠㅠ;

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

아, String name으로만 받았을때 String x01이 되어버릴 수 있으니 @RequestParam("name") String name으로 받는단 말이군요.

그럼 model에 value로 넘겨줄 때는 @RequestParam("name") String x01으로 변하는 상황이 발생해도 

RequestParam에 있는 name을 통해 model.addAttribute(key, name)이렇게 넘겨받은 파라미터를 value로 전달할 수 있게 된다.

이런 맥락이 맞을까요?!