

(Post-HTML Form 예시)
Get

Post

Get 과 Post.
1. 주소창에 직접 요청 파라미터(=값)를 입력해주거나 = 단순입력
(직접 주소창에 타다닥 타이핑)
2. 요청 파라미터를 간접적으로 보낼때 사용
(코딩해서 URL에 파라미터 입력 (주로 .html을 통해서 보냄))
로그인 클릭 후
1. Get 방식으로 데이터를 전송한 경우
URL에 데이터가 보인다.

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

지금은 Get과 Post의 차이가 URL에 데이터를 보여주냐 안보여주냐 차이만 있는걸로 알고있자. 지금부터 Get(Post여도 됨)으로 설명을 하겠다.
작성 코드
@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";
}
<!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>
<!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.@RequestMapping(value="/ex01",method= ReqeustMethod.GET)
2.@GetMapping(value="/ex01")
3.@GetMapping("/ex01")
다 같은 의미다. 점점 생략되어 가는 Get 활용방법을 눈으로 확인 가능하다.
주소창에 직접 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도 생략가능한 버전이 있다.
생략 전, 생략 후
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 일때만 메소드가 호출된다.
@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";
}
@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";
}
@GetMapping("/ex01/Answer")
public String ex01Answer(Model model,
@RequestParam String id,
@RequestParam String pw) {
model.addAttribute("id", id);
model.addAttribute("pw", pw);
return "ex01Answer";
}
@GetMapping("/ex01/Answer")
public String ex01Answer(Model model, String id, String pw) {
model.addAttribute("id", id);
model.addAttribute("pw", pw);
return "ex01Answer";
}
@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";
}
@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";
}
@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";
}
@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 기능을 제공한다.
스프링MVC는 @ModelAttribute 가 있으면 다음을 실행한다.
@GetMapping("/ex01/Answer")
public String ex01Answer(@ModelAttribute HelloData helloData) {
model.addAttribute("id", helloData.getId());
model.addAttribute("pw", helloData.getPw());
return "ex01Answer";
}
@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으로 데이터가 매핑된다.
