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

 

@GetMapping

@PostMapping

@RequestMapping 

 

등을 사용하여 url 매핑

 

 

굳이 

GetMapping, PostMapping 쓰는 이유?

 

가독성, 명확성

하나의 url 에 대해 GET, POST 모두 매핑 가능

 

@GetMapping("/page")
public String getPage(){

	...
}

@PostMapping("/page")
public String editPage(){

	...
}

이처럼 동일한 url에 대해 GET, POST 각각 나눠서 매핑이 가능

 

 

 

요청 파라미터 접근

 

 

HttpServletRequest

@PostMapping("/test/step1"){
public String handleStep1(HttpServletRequest request){
	String agreeParam = request.getParam("agree");
    	 ...
 }

 

@RequestParam

@PostMapping("/test/step1"){
public String handleStep1(@RequestParam(value = "agree", defaultValue = 
"false")Boolean agreeVal){
	if(!agreeVal){
    return "test/step1";
    }
    return "test/step2";
 }

 

 

리다이렉트 처리

 

@GetMapping("test/step1")
public String handleStep2Get(){
	return "redirect:/test/step2";
}

 

 

커맨드 객체를 이용해서 요청 파라미터 사용하기

 

 

HttpServletRequest 방식으로 여러 파라미터를 받으면

 

@PostMapping("/test/step3")
public String handleStep3(HttpServletRequest request) {
	String email = request.getParameter("email");
    String name = request.getParameter("name");
	String password = request.getParameter("password");
	String confirmPassword = request.getParameter("confirmPassword");
    
    RegisterRequest regReq = new RegisterRequest();
    regReq.setEmail(email);
    regReq.setName(name);
    ...
}

와 같이 파라미터 하나하나 다 HttpServletRequest 에서 추출해야 함

 

but

커맨드 객체를 사용하면

 

 

public class RegisterRequest(){

	private String name;
    private String email;
    ...
    
    
    public void setName(name){
    	name = this.name;
    }
    
    public String getName(){
    
   		return name;
    }
    
    ...
}
@PostMapping("/test/step3")
public String handleStep3(RegisterRequest reqReq){
	...
}

 

와 같이 객체 안의 필드와 파라미터를 매핑해줌

 

그냥 우리가 흔히 쓰는 dto 라고 보면 됨

 

 

뷰 JSP 코드에서 커맨드 객체 사용하기

<p><strong>${registerRequest.name}님</strong></p>

와 같이 jsp 에서 커맨드 객체 사용 가능

 

 

@ModelAttribute 어노테이션으로 커맨드 객체 속성 이름 변경

커맨드 객체에 접근할 때 속성 이름을 변경하고 싶으면 

public String handleStep3(@ModelAttribute("formData") RegisterRequest regReq){

	...
}

와 같이 사용

 

주요 에러 발생 상황

요청 매핑 애노테이션과 관련된 주요 익셉션

  • 404 에러: 요청 경로를 처리할 컨트롤러가 존재하지 않거나, WebMvcConfigurer를 이용한 설정이 없거나 뷰 이름에 해당하는 JSP 파일이 존재하지 않는다면 발생하는 에러.
  • 405 에러: 지원하지 않는 전송 방식을 사용한 경우 발생하는 에러.
    ex) POST 방식만 처리하는 요청 경로를 GET방식으로 연결하면 발생

@RequestParam이나 커맨드 객체와 관련된 주요 익셉션

  • 400에러:
    -요청 파라미터의 값을 @RequestParam이 적용된 파라미터 타입으로 변환할 수 없는 경우 발생
    -요청 파라미터 값을 커맨드 객체에 복사하는 과정에서도 발생. 만약 커맨드 객체의 프로퍼티가 int 타입인데 요청 파라미터의 값이 "abc"라면, "abc"를 int 타입으로 변환할 수 없기에 에러 발생

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

컨트롤러는 뷰가 응답 화면을 구성하는데 필요한 데이터를 생성해서 전달해야하는데 이때 사용하는 것이 Model이다.
뷰에 데이터를 전달하는 컨트롤러는 다음 두가지를 하면 된다.

  • 요청 매핑 애노테이션이 적용된 메서드의 파라미터로 Model을 추가
  • Model 파라미터의 addAttribute()메서드로 뷰에서 사용할 데이터 전달
@Controller
public class HaewonController{
	@RequestMapping("/test")
    public String test(Model model, @RequestParam(value = "name",
    required = false)String name){
		model.addAttribute("greeting","안녕하세요"+name);
        return "test";
     }
}

addAttribute()메서드의 첫번째 파라미터는 속성 이름이다. 뷰 코드는 이 이름을 사용해서 데이터에 접근한다.
위 코드에서는 greeting을 사용해 데이터에 접근하고 있다.
JSP에선 ${greeting}을 사용해서 속성값에 접근한다.

지금까지 구현한 컨트롤러는 두가지 특징이 있었다.

  • Model을 이용해서 뷰에 전달할 데이터 설정
  • 결과를 보여줄 뷰 이름을 리턴

지금까진 이 둘을 따로 처리한 예시들을 봤으나 ModelAndView는 모델과 뷰 이름을 함께 제공하기에 이를 사용하면 이 두 가지를 한번에 처리할 수 있다.

 

 

커맨드객체 : 중첩, 콜렉션 프로퍼티

 

jsp 에서 체크박스처럼 같은 속성이름으로 여러 데이터가 들어올 때

커맨드 객체에 

	private List<String> checkBoxValues;

와 같이 선언해주면 리스트에 해당 데이터가 들어옴

이거뭐 다아는거라 설명할 필요성이 없네

 

 

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

 

model.addAttribute("data", data);

처럼 사용하면

jsp에서 

${data}

로 사용 가능

 

 

+ Recent posts