요청매핑-GetMapping,PostMapping사용법

인생한접시·2022년 11월 12일
post-thumbnail


(Post-HTML Form 예시)
Get

Post

Get 과 Post.
1. 주소창에 직접 요청 파라미터(=값)를 입력해주거나 = 단순입력
(직접 주소창에 타다닥 타이핑)
2. 요청 파라미터를 간접적으로 보낼때 사용
(코딩해서 URL에 파라미터 입력 (주로 .html을 통해서 보냄))

로그인 클릭 후
1. Get 방식으로 데이터를 전송한 경우
URL에 데이터가 보인다.

2. Post 방식으로 데이터를 전송한 경우
URL에 데이터가 안보인다.


지금은 Get과 Post의 차이가 URL에 데이터를 보여주냐 안보여주냐 차이만 있는걸로 알고있자. 지금부터 Get(Post여도 됨)으로 설명을 하겠다.
작성 코드

Controller

@Controller
public class MyController{

@GetMapping("/ex01")
public String ex01() {
	return "ex01";
}
@GetMapping("/ex01/Answer")
public String ex01Answer(Model model,String id,String pw) {
	model.addAttribute("id", id);
	model.addAttribute("pw",pw);
	return "ex01Answer";
}

ex01.html

<!DOCTYPE html><html>
<head>
<meta charset="UTF-8">
<title>보내는 쪽</title>
</head>
<body style="background-color:yellow">
<form method="get" action="/ex01/Answer">
아이디:<input type ="text" name=id>
비밀번호:<input type="password" name=pw>
<p>
<input type="submit" value="로그인">

</form>
</body>
</html>

ex01Answer.html

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.com">
<head>
<meta charset="UTF-8">
<title>받는쪽</title>
</head>
<body style="background-color:aqua">

나는<strong th:text="${id}"></strong>의 비번을 알고 있다.
<strong th:text="${pw}"></strong>맞지?
</body>
</html>

1. 단순 요청인 경우

@GetMapping이 되기까지

1.@RequestMapping(value="/ex01",method= ReqeustMethod.GET)

2.@GetMapping(value="/ex01")

3.@GetMapping("/ex01")

다 같은 의미다. 점점 생략되어 가는 Get 활용방법을 눈으로 확인 가능하다.

@PathVariable 사용1

주소창에 직접 id와 pw를 입력해주었다. 이때 @PathVariable을 사용하면,

/**
PathVariable 사용 , 많이 씀
    * 변수명이 같으면 생략 가능
    * @PathVariable("userId") String userId ->@PathVariable userId
    * ex) /ex01/userA
    */
   @GetMapping("/ex01/id/{userId}/pw/{userPw}")
   public String AnynameV3(@PathVariable("userId") String id,
   							@PathVariable("userPw") String pw){
		//{userId}를 템플릿 형식으로 가져올 수 있음
      
  	 
   }

이렇게 작성할 수 있다.

@PathVariable 사용2

그런데 @PathVariable도 생략가능한 버전이 있다.

  • 템플릿매핑명과 변수명이 같으면 @PathVariable 지정변수 생략가능
    @PathaVariable 자체를 생략하면 안됨

생략 전, 생략 후

1. 생략 전
  @GetMapping("/ex01/id/{userId}/pw/{userPw}")
   public String AnynameV3(@PathVariable("userId") String id,
   							@PathVariable("userPw") String pw){ 
   }
   
   
   
   
 
  생략 후
2.@GetMapping("/ex01/id/{userId}/pw/{userPw}")
   public String AnynameV3(@PathVariable String userId,
   							@PathVariable String userPw){ 
   }
 
 둘 다 같은 의미이다.

조건을 충족할때만 호출

// param의 값이 있어야만 메서드 호출됨.
  // param뿐만 아니라 Content-Type, headers 등 여러가지 가능
@GetMapping("/ex01/Answer", params ="mode=debug")
public String ex01Answer() {
	
	
}

params의 값이 mode=debug 일때만 메소드가 호출된다.

2. 복잡한 요청인 경우(String,int,Integer)

맨 처음

@GetMapping("/ex01/Answer")
public String ex01Answer(Model model,HttpServletRequest request,
									HttpServletResponse response) {
	String id =  request.getParameter("id");
	String pw = request.getParameter("pw"); 
	model.addAttribute("id", id);
	model.addAttribute("pw",pw);
	return "ex01Answer";
}

@RequestParam 도입

  • 스프링이 제공하는 @RequestParam 을 사용하면 요청 파라미터를 매우 편리하게 사용할 수 있다.
@GetMapping("/ex01/Answer")
public String ex01Answer(Model model,
		@RequestParam("id") String memberId,
        @RequestParam("pw") String memberPw) {
	
	model.addAttribute("id", memberId);
	model.addAttribute("pw",memberPw);
	return "ex01Answer";
}

@RequestParam 생략 버전1

  • 변수명 = 파라미터 이름 같을 때 생략 가능
@GetMapping("/ex01/Answer")
public String ex01Answer(Model model,
		@RequestParam String id,
        @RequestParam String pw) {
	
	model.addAttribute("id", id);
	model.addAttribute("pw", pw);
	return "ex01Answer";
}

@RequestParam 생략 버전2

  • 변수명 = 파라미터 이름 같을 때 생략 가능
  • 그리고 String , int ,Integer 등의 단순 타입이면
    @RequestParam도 생략 가능
@GetMapping("/ex01/Answer")
public String ex01Answer(Model model, String id, String pw) {
	
	model.addAttribute("id", id);
	model.addAttribute("pw", pw);
	return "ex01Answer";
}

@RequestParam의 부가 기능1 -required

  • 생략시 기본값이 true (없으면 오류남)
  • required = false (없어도 오류X)
@GetMapping("/ex01/Answer")
public String ex01Answer(Model model,
		@RequestParam(required = true) String id,
        @RequestParam(required = false)String pw) {
	
	model.addAttribute("id", id);
	model.addAttribute("pw", pw);
	return "ex01Answer";
}

@RequestParam의 부가 기능2 -default

  • 변수에 값이 없을때, defaultValue가 들어감
@GetMapping("/ex01/Answer")
public String ex01Answer(Model model,
		@RequestParam(required = true, defaultValue="guest") String id,
        @RequestParam(required = false, defaultValue="-1")String pw) {
	
	model.addAttribute("id", id);
	model.addAttribute("pw", pw);
	return "ex01Answer";
}

@RequestParam의 부가 기능3 -Map

  • 변수에 값이 없을때, defaultValue가 들어감
@GetMapping("/ex01/Answer")
public String ex01Answer(Model model, 
					@RequestParam Map<String,Object> paramMap {
	String id = paramMap.get("id");
    String pw = paramMap.get("pw");
    
	model.addAttribute("id", id);
	model.addAttribute("pw", pw);
	return "ex01Answer";
}

2. 복잡한 요청인 경우(객체 타입)

  • 실제 개발을 하면 요청 파라미터를 받아서 필요한 객체를 만들고 그 객체에 값을 넣어주어야 한다. 보통 다음과 같이 코드를 작성할 것이다
  • 먼저 요청 파라미터를 바인딩 받을 객체를 만들자

HelloData 객체

  • 롬복 @Data
    @Getter , @Setter , @ToString , @EqualsAndHashCode , @RequiredArgsConstructor 를 자동으로 적용해준다
@Data
public class HelloData {
    private String id;
    private String pw;
}

객체 이용하기

 @GetMapping("/ex01/Answer")
    public String ex01Answer(Model model,
   						 @RequestParam String id,
   						 @RequestParam String pw) {
    
	HelloData helloData = new HelloData();
    helloData.setId(id);
    helloData.setPw(pw);
    
        model.addAttribute("id", helloData.getId());
        model.addAttribute("pw", helloData.getPw());
        return "ex01Answer";
    }




한편, 스프링은

HelloData helloData = new HelloData();
    helloData.setId(id);
    helloData.setPw(pw);

이 과정을 완전히 자동화해주는 @ModelAttribute 기능을 제공한다.

ModelAttribute 도입

스프링MVC는 @ModelAttribute 가 있으면 다음을 실행한다.

  • HelloData 객체를 생성한다.
  • 요청 파라미터의 이름으로 HelloData 객체의 프로퍼티를 찾는다.
  • 그리고 해당 프로퍼티의 setter를 호출해서 파라미터의 값을 입력(바인딩) 한다.
    예) 파라미터 이름이 username 이면 setUsername() 메서드를 찾아서 호출하면서 값을 입력한다
    - 프로퍼티 -
    객체에 getUsername() , setUsername() 메서드가 있으면, 이 객체는 username 이라는 프로퍼티를 가지고 있다.
    username 프로퍼티의 값을 변경하면 setUsername() 이 호출되고,
    조회하면 getUsername() 이 호출된다.
 @GetMapping("/ex01/Answer")
    public String ex01Answer(@ModelAttribute HelloData helloData) {

        model.addAttribute("id", helloData.getId());
        model.addAttribute("pw", helloData.getPw());
        return "ex01Answer";
    }
  • 마치 마법처럼 HelloData 객체가 생성되고, 요청 파라미터의 값도 모두 들어가 있다.

ModelAttribute 생략 버전

  • @ModelAttribute 는 생략할 수 있다.
    그런데 @RequestParam 도 생략할 수 있으니 혼란이 발생할 수 있다.
    스프링은 해당 생략시 다음과 같은 규칙을 적용한다.
  • String , int , Integer 같은 단순 타입 = @RequestParam
  • 나머지 = @ModelAttribute (argument resolver 로 지정해둔 타입 외)
 @GetMapping("/ex01/Answer")
    public String ex01Answer(HelloData helloData) {

        model.addAttribute("id", helloData.getId());
        model.addAttribute("pw", helloData.getPw());
        return "ex01Answer";
    }

한편

@ModelAttribute("item") Item item을 하면
model. addAttribute("item",item) 까지 해줘서
Model을 따로 불러올 필요가 없다.
여기서
@ModelAttribute Item item을 하면
class명 Item에서 첫글자를 소문자로 바꿔서 item으로 데이터가 매핑된다.

profile
plan11plan

0개의 댓글