Spring Request Parameter (@RequestParam, @ModelAttribute, @PathVariable, redirect)

2021. 11. 26. 10:55Spring

728x90

 

스프링에서 request parameter를 받는 다양한 방법에 대해 정리했다. 

1️⃣ request parameter 처리 

2️⃣ GET 방식/ POST 방식 

3️⃣ @RequestParam

4️⃣ 커맨드 객체 (Bean 객체)

5️⃣ @ModelAttribute

6️⃣ @PathVariable

7️⃣ redirect 

 

 

1. HttpServletRequest 매개변수 

Controller

핸들러 메서드에서 파라미터로 HttpServletRequest를 받을 수 있다. 

HttpServletRequest에는 parameter 또는 request 관련 정보들이 담겨있다. 

member/delete.jsp

 파라미터로 id 값 설정 

결과 

 

 

 

2. GET, POST 방식으로 request 받기 

기본적으로 @RequestMapping은 GET방식에서 동작하기 때문에 생략이 가능하다. 

POST 방식과 GET방식으로 핸들러 메서드를 따로 작성하고 결과를 확인했다. 

Controller
Controller
Controller
member/regist.jsp

form의 method을 POST로 지정하고 등록 버튼을 누르면 

post 방식으로 지정한 핸들러 메서드가 동작했다. 

 

이번에는 get 방식으로 name을 url에 작성을 했더니 

GET방식으로 지정한 핸들러 메서드가 동작했다. 

 

Controller

그리고 GET과 POST를 둘다 받을 수도 있다. 

@RequestMapping method에 POST와 GET을 모두 지정해준다. 

-> POST 방식 결과 

-> GET 방식 결과 

 

 

3. 매개변수로 request parameter 받기 

handler에 request parameter의 name 값과 같은 이름의 매개변수가 있으면 그 매개변수가 request parameter 값을 받아온다. 

Controller
member/find.jsp
결과 

 

 

4. @RequestParam

앞에서 request parameter와 같은이름의 매개변수일 때만 가져올 수 있었는데 상황에 따라 handler 메서드의 매개변수 이름을 request parameter와 일치시켜주기 어려울 때가 있다.

이럴 때 @RequestParam 어노테이션을 사용해서 request parameter와 다른 이름의 매개변수를 받을 수 있다. 

 

Controller

매개변수 userid는 "id"라는 request parameter를 받아오고, username 매개변수는 "name"이라는 request parameter를 받아온다.

결과

 

 

5. 커맨드 객체 

앞에 예시처럼 request parameter가 2개 정도면 큰 문제는 없지만 request parameter가 점점 많아지면 잔코딩도 많아지고 유지보수도 까다롭다는 단점이 있다. 

따라서 스프링에서는 커멘드 객체 (Command Object)를 통해 여러 request parameter를 한번에 받아올 수 있다. 

 

커맨드 객체 (Command Object)

: form 으로부터 넘어오는 parameter들을 담은 Bean 객체를 의미한다. 

 

WriteDTO라는 빈 객체 생성 (viewcnt, regdate, uid 는 나중에 사용될 것으로 지금은 굳이 작성 안해도 되긴함)

package com.lec.spring.beans;

public class WriteDTO {
	
	private int uid;
	private String subject;
	private String name;
	private int viewcnt;
	private String regdate;
	private String content;
	
	public WriteDTO() {
		super();
	}

	public WriteDTO(int uid, String subject, String name, int viewcnt, String regdate, String content) {
		super();
		this.uid = uid;
		this.subject = subject;
		this.name = name;
		this.viewcnt = viewcnt;
		this.regdate = regdate;
		this.content=content;
	}

	public int getUid() {
		return uid;
	}

	public void setUid(int uid) {
		this.uid = uid;
	}

	public String getSubject() {
		return subject;
	}

	public void setSubject(String subject) {
		this.subject = subject;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getViewcnt() {
		return viewcnt;
	}

	public void setViewcnt(int viewcnt) {
		this.viewcnt = viewcnt;
	}

	public String getRegdate() {
		return regdate;
	}

	public void setRegdate(String regdate) {
		this.regdate = regdate;
	}

	public String getContent() {
		return content;
	}

	public void setContent(String content) {
		this.content = content;
	}
	
	
	
}

Controller
write.jsp

 

Controller
writeOk.jsp
결과

 

 

6. @ModelAttribute

커맨드 객체의 model의 attribute 이름을 바꿔주기 위해서는 @ModelAttribute 를 사용한다. 

Controller
wrtieOk.jsp
결과

 

 

 

7. @PathVariable

request parameter를 GET방식의 query String 이 아닌 'url 경로'로 담아서 전달할 수 도 있다. 

Controller
writepath.jsp

 

결과 

 

 

8. redirect

handler 메서드의 뷰 리턴값을 적을 때 "redirect:OOO"으로 작성하면 해당 url로 redirect 된다. 

 

redirect란?

: 웹 브라우저가 어떤 url로 웹 서버를 요청했을 때 다른 url로 넘겨주는 것을 말한다. 

 

- 예제

나이를 입력했을 때 성인이면 성인임을 알려주는 페이지로, 미성년자라면 미성년자임을 알려주는 페이지로 redirect하는 흐름으로 작성한다. 

Controller
Controller

 

adult.jsp
underAge.jsp

 

결과1

 

결과2

 

RedirectAttributes 

그리고 RedirectAttributes를 사용하면 리다이렉트로 url parameter 값을 넘겨줄 수있다. 

Controller
adult.jsp
ageUnder.jsp
결과

 

 

 

 

728x90