15주차 - Spring (4) Controller의 매개변수
이번의 목표
01. Contoller에서 매개변수에 대해 알아보자.
스프링에서는 컨트롤러 클래스에서 매개변수를 사용할때 일반적으로 받고자 하는 값의 name과 이름과 자료형을 같게 합니다. 스프링에서 자동으로 찾아서 정리해주기 때문입니다.
이렇게 편리한 기능 덕분에 대부분 위와같이 <form> 에서 전달하고자 하는 값의 name과 Controller에서 매개변수 이름을 일치시키는 경우가 많습니다. 하지만 경우에 따라서는 변수명을 다르게 해야하는 경우가 있을 수도 있고 또는 아예 다른 방법을 이용할 수도 있습니다.
오늘은 스프링 프레임워크의 컨트롤러 클래스에서 사용되는 매개변수에 대해 알아보겠습니다.
먼저 방법에 알아보기 전에 간단하게 아이디와 비밀번호를 입력하는 페이지의 코드를 작성하여 예시를 하나 만들겠습니다. 아래는 데이터를 입력할 페이지의 코드입니다.
<form action="register" method="post">
<input type="text" name="id" placeholder="아이디"><br>
<input type="password" name="pw" placeholder="비밀번호"><br>
<input type="text" name="name" placeholder="이름"><br>
<input type="submit" value="회원가입">
<input type="button" value="취소" onclick="javascript:location.href='index'">
</form>
01. 첫번째 방법
일반적으로 컨트롤러에서 값을 받아오는 코드는 아래와 같습니다.
@PostMapping("register")
public String register(String id, String pw, String name) {
return "register";
}
이 방법은 <form>에서 넘겨주는 파라미터의 값의 name과 매개변수에서 사용하는 변수 이름을 같게하여 스프링에서 처리하도록 하는 방법입니다.
02. 두번째 방법
매개변수의 이름과 파라미터의 이름이 다를 경우에는 @RequestParam() 어노테이션을 이용하여 변수에 값을 지정해줘야합니다. 사용 예시는 아래와 같습니다.
@PostMapping("register")
public String register(
@RequestParam(value="id") String i,
@RequestParam(value="pw") String p,
@RequestParam("name") String n
) {
return "register";
}
넘겨주는 파라미터의 이름은 각각 "id", "pw", "name"인데 컨트롤러에서 매개변수 이름은 "i","p","n" 이기 때문에 각각의 변수에 @RequestParam을 이용하여 파라미터값을 변수에 저장해주는 상황입니다.
이때 괄호 안에는 value="name" 을 사용하여도 좋지만 value는 생략 가능하기에 ("name") 만 입력하여도 무방합니다.
03. 세번째 방법
HttpServletRequest을 사용하여 파라미터값을 받을수도 있습니다.
사용 예시는 아래와 같습니다.
@PostMapping("register")
public String register(HttpServletRequest req) {
System.out.println("id :" +req.getParameter("id"));
System.out.println("pw : " + req.getParameter("pw"));
System.out.println("name : " + req.getParameter("name"));
return "register";
}
HttpServletRequest를 사용하여 이전에 배웠던 request.getParameter()를 이용할 수 있습니다.
<form>에서 넘겨주는 값을 파라미터 형식으로 전달되기 때문에 여기서 각각의 name을 찾아 변수에 따로 저장할 수도 있습니다.
04. 네번째 방법
다음으로는 DTO를 만들어서 값을 받는 방법입니다. 스프링에서는 <form>의 값들이 dto의 값들과 이름이 같을때 컨트롤러에서 dto만으로도 그 값을 불러올 수 있습니다. 사용 예시는 아래와 같습니다.
@PostMapping("register")
public String register(MemberDTO member) {
System.out.println("id : " + member.getId());
System.out.println("pw : " + member.getPw());
System.out.println("name : " + member.getName());
return "register";
}
MemberDTO에는 id, pw, name의 setter/getter들이 있습니다. 이러한 경우 자동으로 DTO로 받아지는 것을 확인할 수 있습니다. 컨트롤러에서 받고자 하는 변수가 많을 때가 있습니다. 이럴 때에는 각각의 변수를 매개변수로 모두 받는것보다는 DTO를 만들어 사용하면 보다 쉽게 코드를 작성할 수 있습니다.