스터디 발표 내용

11. 요청 매핑 , 커맨드 객체 , 리다이렉트 , 폼 태그 , 모델

비뀨_ 2021. 11. 21. 04:49
  • @RequestMapping 설정
  • 요청 파라미터 접근
  • 리다이렉트
  • 개발 환경 구축
  • 스프링 폼 태그
  • 모델 처리

요청 매핑 어노테이션을 이용한 경로 매핑

웹 어플리케이션을 개발 할 때는

  • URL 을 처리하는 코드.  ( 예 : naver.com에서 naver.com/Webtoon/list?webtoon=naeggeo 로 이동하려 할 때. )
  • 처리 결과를 HTML 형식으로 응답하는 코드. ( 예 : 화면에 대한 정보를 뿌려 주는 것. 위의 주소의 만화 보여주기.)

요청하는 어노테이션 

  • @RequestMapping  - 설정한 주소와 일치하는 요청이 들어오면 처리.
  • @GetMapping -  설정한 주소와 일치하는 Get 요청이 들어오면 처리. ( 호출하는데 주로 사용.)
  • @PostMapping - Post 요청이 들어오면 처리. ( 새로운 정보 등록할 때 주로 사용.)
  • @PutMapping - Put 요청이 들어오면 처리. ( 수정에 사용. )
  • @PatchMapping - Put과 동일하지만 수정할 정보가 일부분일 때 주로 사용.
  • @DeleteMapping - Delete요청이 들어오면 처리. ( 삭제에 사용)

 

더보기

그러면 @RequestMapping 과 다른 어노테이션 간에 무슨 차이가 있을까??

차이가 없으면 그냥 @RequestMapping을 쓰는게 낫지 않을까??

@Get (Mapping 생략) , @Post , @Put , @Patch , @Delete 은 스프링 4.3에 나왔다.

차이점은 짧게 쓸 수 있다는 점 정도..?

@RequestMapping( value = "/register/step1" , method = {RequestMethod.Post})
//를 줄여서
@PostMapping("/register/step1") // 로 쓸 수 있다.

예시- 회원가입 컨트롤러. 기능은 별로 중요한게 아니라 좀 많이 지움.

어떻게 썼는지만 보는 용도.

@Controller //컨트롤러 빈 객체라고 알려줘서 관리되게 
public class RegisterController {
 		//중간
 		// ...
 		//생략
	@RequestMapping("/register/step1") //  /register/step1요청을 처리
	public String handleStep1() {
		return "register/step1";	// 	WEB-INF/view/register/step1.jsp 호출
	}

	@PostMapping("/register/step2") //  Post 방식으로 온 step2 요청일 때 호출
	public String handleStep2(
			@RequestParam(value = "agree", defaultValue = "false") Boolean agree,
			Model model) {
		if (!agree) {
			return "register/step1";
		}
         //ModelAndView 객체에 registerRequest의 이름으로 RegisterRequest 객체 담음.
		model.addAttribute("registerRequest", new RegisterRequest()); 
		return "register/step2";
	}

	@GetMapping("/register/step2") //  Get 방식으로 온 step2 요청일 때 호출
	public String handleStep2Get() {
		return "redirect:/register/step1";
	}
}

 

/register/step2 는  Get과 Post로  같은 주소를 쓰고 있지만 , 해당 요청 방식일 때만 동작한다.

 

요청 파라미터 사용하기

약관동의 페이지 예시.

전송 버튼을 누르면 form이 전송 됨. 

전송하면 전송된 데이터를 사용해서 요청을 처리해야 된다.  처리하는 방법은 두가지 이다.

  • HttpServletRequest
  • @RequestParam
value : String  - HTTP 요청 파라미터의 이름 지정.
required : boolean -필수 여부 지정. true면 이 값 없으면 Exception 발생.
defaultValue : String - 요청 파라미터 값 없을 때 사용할 문자열 정함. 기본값은 없음!

// HttpServletRequest 사용
@PostMapping("/register/step3")
public String handleStep22(HttpServletRequest request ) {
	String agree = request.getParameter("agree");
	if(agree == null || !agree.equals("true")) {
		return "register/step1";
	}
	return "register/step2";
}

// RequestParam 사용.
@PostMapping("/register/step2")
public String handleStep2(
	@RequestParam(value = "agree", defaultValue = "false") Boolean agree,
		Model model) {
	if (!agree) {
		return "register/step1";
	}
	model.addAttribute("registerRequest", new RegisterRequest());
	return "register/step2";
}

 

공통된걸 하나로 하고 싶으면
@Controller
@RequestMapping("/register/step2") //어노테이션에 value를 정하면 됨.
public class Register{
	
    // () 없어도 됨.
    @PostMapping
	//중략 ...

	
    @GetMapping
	//중략 ...


}

리다이렉트

Post로만 받는 코드를 썼는데 Get으로 오면 에러가 난다.

당연한 얘기다.  나는 Post로만 받을건데 입력해서 Get으로 오면 에러가 나야되지만,

그래도  HTTP Status 405 ~~~~ 이런 딱딱한 페이지보다.

좀 센스있게 그 전 화면으로 돌아가게 만들고 싶다.

이게 Redirect 다 .  

redirect 사용법.

위 이미지 처럼 그냥 redirect: 를 쓴 다음 갈 주소를 쓰면 된다.

 

커맨드 객체

회원가입 jsp 에서 데이터를 이메일 , 이름 , 성별 , 전화번호 , 주소 등을 보낸다고 가정해보면

 

request.getParameter로 위의 항목들을 다 받아 와서 , 정보를 회원 등록하는 클래스에 세팅을 해줘야한다.

이게 엄청 귀찮고 관리하기 힘든 일인데 스프링에서는 매개변수에 setter(세터)가 있는 데이터 설정 객체를 담으면 알아서 해준다.

 

@PostMapping("/register/step3")
	// RegisterRequest라는 객체에 jsp에서 넘어온 변수이름이 똑같은 것이 알아서 쇽쇽 들어감.
	public String handleStep3(RegisterRequest regReq) {
		try {
			memberRegisterService.regist(regReq);
			return "register/step3";
		} catch (DuplicateMemberException ex) {
			return "register/step2";
		}
	}

 커맨드 객체를 뷰(Jsp 코드)에서 사용할 수 있다. 

RegisterRequest 를 Jsp에서 첫글자를 소문자로 바꾸고 -> ${registerRequest.name } 처럼 사용할 속성을 쓰면 된다.

 

스프링 폼 태그

Spring MVC는 <form:form> , <form:input> 등 JSP 태그 라이브러리를 제공한다.

HTML 폼과 커맨드 객체를 연동하기 위해서 사용한다.

 

<form:form> 태그

더보기

<form>태그를  생성할 때 사용한다.

 

<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>

<form:form>

내용

</form:form>

---커맨드 객체의 이름이 기본값인 command가 아니면 modelAttribute로 이름 설정해야 됨.

<form:form modelAttribute="설정할 이름"> </form:form>

 

<form:form> 커스텀 태그의 속성

  • action : 폼 데이터를 전송할 URL 입력 (HTML <form> 태그 속성)
  • enctype : 인코딩 타입.
  • method : 전송 방식.

<form:input> 태그

더보기
  • <form : input>
  • <form : password>
  • <form : hidden>

input은 path 속성으로 커맨드 객체의 연결할 프로퍼티 지정 가능.

<form:input path ="email" />

<select> 관련 커스텀 태그 

더보기
  • <form:select>   : path 속성 : 프로퍼티 이름.
  • <form:options> : items 속성 : 옵션 태그 생성할 때 사용할 콜렉션 객체 지정.
  • <form:option>  : option 태그 직접 지정할 때 사용. value로 값 지정.

체크박스 관련 커스텀 태그 : <form:checkboxes> , <form:checkbox> 

더보기

한개 이상 값을 커맨드 객체의 특정 프로퍼티에 저장하고 싶다면.

배열 또는 List 형태로 값 저장.

Model을 통해 컨트롤러에서 뷰에 데이터 전하기

컨트롤러는 뷰에 전달할 데이터를 보내기 위해 Model을 사용한다.

  1.  해당 컨트롤러에 Model 객체 매개변수로 보냄
  2. Model 파라미터의 addAttribute() 메서드로 뷰에서 사용할 데이터 전달.
@Controller
@RequestMapping("/hello")
public class RegisterController {

	@GetMapping
	public String handleStep2(
    	@RequestParam(value = "name", required = "false") String name,
        Model model) { //Model 객체를 매개변수에 넣음.

		model.addAttribute("hello", "안녕!?" + name);
		return "hello";
	}

}

위는 localhost:8080/프로젝트명/hello?name=hihihi라는 주소로 들어갔을 때,

hello라는 jsp를 호출하고 ModelAndView에  hello라는 키로  "안녕 hihihi"라는 값을 넣어준다.

 

넣은 값은 jsp 에서 ${hello} (Model에 넣은 키값을 적음) 을 사용하면 해당 키의 값을 가져올 수 있다.