GET: 문서를 달라는 요청이다. View 자체를 return 한다. (등록을 위한 페이지를 요청)
POST: 문서에 입력한 값을 전달하려는 요청이다. View를 redirect 한다. (등록을 위한 정보 전달 후 다른 페이지로 이동)
문서를 달라는 요청은 GET이다.
그렇다면 GET을 통해서 얻은 페이지에
입력을 해서 서버로 전달하는 요청은
똑같은 GET일까?
이때는 POST 요청을 사용한다.
POST는 입력된 정보를 서버로 전달한다.
서버로 전달한 뒤에 다시 GET처럼 페이지를 새로 요청하지 않는다.
단지, 등록 후 화면으로 이동(redirect)시킨다.
출처: 뉴렉처(https://www.youtube.com/@newlec1)
POST 요청을 사용하게 되면
더 이상 URL에쿼리스트링으로 값이 전달되지 않는다.
서버에 매개변수로 전달된다..!
#GET / POST 매핑하기
1. HTML에서 처리가 필요한 부분
일단 HTML에서 form에 method를 명시해야 한다.
method를 따로 명시해주지 않으면 기본값인 GET으로 넘어간다.
💡 form 태그를 POST 요청으로 보내는 방법
<!-- action을 따로 지정하지 않으면 자기 자신을 호출한다. -->
<form action="" method="post">
그리고 값이 전달되기 위해서는
반드시 값을 입력받은 input 태그 안에
name 속성이 있어야 한다.
💡 서버로 넘어가는 값과 넘어가지 않는 값
<!-- 한글이름은 name이 있어서 서버로 값이 넘어갈 수 있다. -->
<label>한글이름</label>
<input type="text" name="kor-name" required>
<!-- 영문이름은 name이 없다. 값이 입력되어도 서버로 넘어가지 않는다. -->
<label>영문이름</label>
<input type="text" required>
2. java에서 처리가 필요한 부분
필요한 함수를 호출하여 사용하는데,
서블릿 버전과 스프링 버전에서
처리하는 방식이 조금 다르다.
2-1. 서블릿 버전
service 함수를 오버라이드 하거나
doGet 혹은 doPost 함수를 오버라이드 하여 처리한다.
doGet과 doPost는 각각 GET 요청과 POST 요청만 처리하지만
service함수는 둘을 포함해서 모든 HTTP 메소드까지 처리할 수 있다.
💡 service()와 doGet(), doPost()
service() 메서드를 오버라이드하면 모든 HTTP 요청 메서드에 대한 처리를 하나의 메서드 내에서 관리할 수 있다.
반면에 doGet() 및 doPost() 메서드를 오버라이드하면 각각 GET 및 POST 요청을 별도로 처리하는 메서드를 작성하게 된다.
또한, service() 메서드를 오버라이드하면 요청 메서드에 관계없이 동일한 로직을 공유하므로 코드 재사용성을 높일 수 있다.
하지만 특정 요청 메서드에 따라 다른 동작을 해야 할 때는 doGet() 및 doPost() 메서드를 사용하는 것이 더 명확하고 유지보수가 쉬울 수 있다.
1. service() service() 메서드는 javax.servlet.Servlet 인터페이스에 정의된 메서드로 Servlet 클래스에서 오버라이드하여 사용한다.
service() 메서드는 클라이언트의 모든 HTTP 요청 메서드(GET, POST, PUT, DELETE 등)를 처리한다. 따라서 service() 메서드 내에서 요청 메서드를 확인하고 해당 메서드에 따라 다른 로직을 수행할 수 있다.
받아온 값이 String이기 때문에 .equals("GET")이나 ("POST") 출처: 챗지피티(https://chat.openai.com/) 2. doGet(), doPost() doGet() 및 doPost() 메서드는 javax.servlet.http.HttpServlet 클래스에서 제공되는 메서드로, 주로 HTTP GET 및 POST 요청을 처리할 때 사용된다.
doGet() 메서드는 HTTP GET 요청을 처리하고, doPost() 메서드는 HTTP POST 요청을 처리한다. 출처: 챗지피티(https://chat.openai.com/)
출처: 뉴렉처(https://www.youtube.com/@newlec1)
2-2. 스프링 버전
@GetMapping("url"), @PostMapping("url")이라는
어노테이션을 사용하여 간단하게 처리한다.
어노테이션이 달린 각 메서드는
해당 요청 메서드에 따라 호출되며,
컨트롤러 내에서 로직을 실행하고 적절한 뷰를 반환한다.
💡요청 메소드가 다르니 url도 달라야 하나?
GET의 url이 reg면 POST의 url도 reg이다. 다른 이름을 가질 필요가 없다.
출처: 뉴렉처(https://www.youtube.com/@newlec1)
이때 GET은 해당 경로의 파일을 직접 반환하지만
POST는 필요한 페이지로 이동(redirect)시킨다.
💡 GET과 POST에서 return하는 값 차이
/* ------- reg GET -------*/
@GetMapping("reg")
public String reg() {
/* GET은 페이지를 요청하는 녀석이다.
* 등록을 위한 페이지(View)를 반환한다.
*/
return "/admin/menu/reg";
}//get reg ends
/* ------- reg POST -------*/
@PostMapping("reg")
public String reg(){
/* post는 페이지에 입력한 값을 전달하는 녀석이다.
* 등록을 위한 페이지(View)를 다시 반환하지 않고,
* 입력을 완료한 뒤에 이동할 페이지로 redirect 시킨다.
*/
return "redirect:list"; //list와 같은 디렉토리니까 경로 간단하게 적어줘도 됨!!!
}//post reg ends
#null 처리하기 (서버의 유효성검사)
💡null과 빈문자열("" )은 다르다. 빈문자열은 값이 전달된 것으로 인식한다!
클라이언트단에서 name 속성을 추가하지 않으면
서버로 값이 전달되지 않는다고 했다.
그러나 메소드의 매개변수로
값을 입력받게 되어있다면,
값이 전달되지 않았으니 null이 된다.
출처: 뉴렉처(https://www.youtube.com/@newlec1)
#@RequestParam의 기능
이런 null값을 서버에서도 처리할 수 있는데,
@RequestParam이라는 어노테이션으로 처리한다.
1. HTML과 java의 구분자 상이한 부분 처리
HTML에서의 구분자는 대시(-)이다. java에서의 구분자는 대문자(A)이다.
이 둘의 차이를 아래와 같이 처리할 수 있다.
이때 기본 문자열만 1개 넣으면 name으로 인식되기 때문에
name="kor-name"에서 name=부분은 생략이 가능하다.
💡 boolean값은 어떻게 처리하는 것일까?
entity에 boolean값이 있다면 어떻게 처리할까? HTML에서 전달하는 value를 "true", "false"로 설정하면 끝!
💡 @RequestParam으로 구분자 처리하기
@PostMapping("reg")
public String reg(@RequestParam(name="is-small") boolean isSmall){
System.out.println(isSmall);
return "redirect:list"; //list와 같은 디렉토리니까 경로 간단하게 적어줘도 됨!!!
}
2. null값 처리하기
클라이언트단에서 검증되지 못하고
입력값으로 null값이 온 경우
서버단에서 입력을 강제할 수도 있다.
이때 클라이언트단과 동일하게 required 속성을 사용한다.
(required=true로 설정하면 입력값 필수가 된다.)
💡 서버단에서 null값 처리하기
@PostMapping("reg")
public String reg(@RequestParam(name="eng-name", required = true) String engName){
System.out.println(engName);
return "redirect:list"; //list와 같은 디렉토리니까 경로 간단하게 적어줘도 됨!!!
}
이때 주의해야 할 점은
null과 빈문자열("" )은 다르다는 점이다.
빈문자열은 값이 전달된 것으로 인식한다.
서버단에서 required라고 설정한 매개변수가
클라이언트단에서 null값이 전달되면
400오류가 발생한다.
💡 400오류와 404오류 알아놓기
✅ 400 오류 파라미터의 인자값을 올바르지 않게 보냈거나 필수값을 안보냈거나 등 파라미터와 관련된 오류이다.
✅ 404오류 url이 없거나, View 페이지를 못찾았거나 정적인 자료가 없을 때 등 리소스와 관련된 오류이다.
3. 기본값 설정하기
기본값도 설정할 수 있다.
💡 기본값 설정하기
@PostMapping("reg")
public String reg(@RequestParam(defaultValue = "0") int price){
System.out.println(price);
return "redirect:list"; //list와 같은 디렉토리니까 경로 간단하게 적어줘도 됨!!!
}//post reg ends
한 번에 여러 개의 매개변수에
각기 다른 @RequestParam을
설정할 수도 있다.
💡 @RequestParam의 여러 기능에 대해서 알아보자.
/* ------- reg POST -------*/
@PostMapping("reg")
public String reg(
@RequestParam(name="kor-name") String korName,
@RequestParam(name="eng-name", required = true) String engName,
@RequestParam(defaultValue = "0") int price){
/*
* HTML에서의 구분자는 대시(-)이다.
* 따라서 java에서 이것을 인식하지 못하는 문제가 발생하는데,
* 이는 @RequestParam으로 처리한다.
*
* 기본 문자열만 넣으면 name으로 인식되기 때문에
* name="kor-name"이라고 안하고 그냥 "kor-name"이라고 해도 된다.
*
* ★★★ 기본값을 설정할 수도 있다. ★★★
*
* 서버단에서 입력을 강제할 수도 있다.
* required 속성을 사용한다.
* null값이 전달되었을 때는 400오류가 발생한다.
* null과 빈문자열은 다르다.
* 빈문자열은 값이 전달된 것으로 인식한다.
*
*/
/*
* post는 페이지에 입력한 값을 전달하는 녀석이다.
* 등록을 위한 페이지(View)를 다시 반환하지 않고,
* 입력을 완료한 뒤에 이동할 페이지로 redirect 시킨다.
*/
System.out.println(korName);
System.out.println(price);
return "redirect:list"; //list와 같은 디렉토리니까 경로 간단하게 적어줘도 됨!!!
}//post reg ends