<< 학습 목표 >>

1. 서블릿이 상태 코드를 설정해 응답할 수 있다.

2. 서블릿에서 상황에 맞는 상태 코드를 설정할 수 있다.


지금까지 우리는 클라이언트에게 "결괏값" 을 전달하는 방법과 "결괏값을 담고 있는 페이지" 를 전달하는 방법을 배웠음

서버가 클라이언트에게 전달하는 "결괏값" 또는 "결괏값을 담고 있는 페이지" 는 응답 정보의 몸통(Body)에 담음

 

클라이언트에게 보내는 HTTP 버전은 1.1 버전이고 헤더는 비어있는 상태임

( 사실 헤더는 비어있지 않고 무언가가 들어있는데 지금 우리가 헤더까지 생각하면 너무 복잡해지니 무시해도됨 / 자소서, 면접을 준비하면서 요청 정보, 응답 정보의 헤더를 찾아보거나 취업하고 난 이후에 알아도 무방함 )

 

우리가 서버(서블릿)에서 상태 코드를 별도로 설정하지 않고 "결괏값" 또는 "결괏값을 담고 있는 페이지" 만 클라이언트에게 전달 했으므로 클라이언트가 받게 되는 응답 정보의 상태 코드는 200, 상태 코드 설명은 상태 코드 200에 맞는 OK 가 들어있는 상태가 됨

따라서 지금까지 클라이언트가 받은 응답 코드는 최종적으로 아래와 같음


응답 정보의 상태 코드는 클라이언트와 서버가 통신할 때 중요한 역할을 담당함

클라이언트는 서버가 응답했을 때 가장 먼저 상태 코드를 봐야함

 

여기서는 서버가 상태 코드를 설정해 응답하고 서버가 보낸 상태 코드에 맞게 처리하는 방법을 배워보자

 

이번에는 서버(서블릿) 먼저 만들자

chapter04 패키지 내 Status200 서블릿을 추가하고 아래 코드를 입력하자

package chapter04;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/chapter04/status/200")
public class Status200 extends HttpServlet {
	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setStatus(200);
	}

}

 

응답 정보의 상태 코드를 설정해야하므로 당연히 HttpServletResponse 객체를 다뤄야함

위 서블릿은 별도의 코드는 없고 상태 코드를 200으로 설정하고 있음

서블릿이 상태 코드를 설정하는 방법은 여기까지가 끝!

응답 정보 객체(HttpServletResponse) 의 setStatus 메서드를 사용해서 상태 코드를 설정함

 

이번에는 웹 페이지를 만들자

webapp -> chapter04 -> status.html 을 만들고 아래 코드를 입력하자

<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>상태코드별 처리 방법</title>
</head>
<body>
	<button type="button" onclick="request(200)">서버로 요청1</button>
	<button type="button" onclick="request(300)">서버로 요청2</button>
	<button type="button" onclick="request(400)">서버로 요청3</button>
	<button type="button" onclick="request(500)">서버로 요청4</button>
	
	<script src="https://code.jquery.com/jquery-3.6.3.min.js" integrity="sha256-pvPw+upLPUjgMXY0G+8O0xUf+/Im1MZjXxxgOcBQBXU=" crossorigin="anonymous"></script>
	<script type="text/javascript">
		function request(path) {
			$.ajax({
				url: "/studyProject/chapter04/status/"+path,
				type: "GET",
				success: function() {
					alert("서버가 200번대 상태 코드로 응답했습니다.");
				},
				error: function() {
					alert("서버가 300, 400, 500번대 상태 코드로 응답했습니다.");
				}
			});
		}
	</script>
</body>
</html>

 

이 웹 페이지는 버튼 마다 각각 다른 서블릿으로 요청을 보내고 있음

요청을 보낼 때는 request 함수 내 ajax를 사용하고 있음

 

ajax는 간단하게 요청을 보내고(1) 응답을 받았을 때 간단한 처리 /alert으로 출력/ 를 하고 있음(2)

 

이제 서버를 시작하고 웹 페이지에 접속해 [ 서버로 요청1 ] 버튼을 눌러보자

[ 서버가 200번대 상태 코드로 응답했습니다. ] 가 출력됨

 

여기서 주의 깊게 봐야할 점은 서버가 200번대 상태 코드로 응답했을 때 success의 function 이 동작한다는 점


서블릿이 300, 400, 500번대 상태 코드를 설정해 응답하는 서블릿은 여러분이 먼저 만들어보자

더보기

<< 300번대 상태 코드 설정 >>

package chapter04;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/chapter04/status/300")
public class Status300 extends HttpServlet {
	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setStatus(300);
	}

}

 

더보기

<< 400번대 상태 코드 설정 >>

package chapter04;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/chapter04/status/400")
public class Status400 extends HttpServlet {
	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setStatus(400);
	}

}

 

더보기

<< 500번대 상태 코드 설정 >>

package chapter04;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/chapter04/status/500")
public class Status500 extends HttpServlet {
	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setStatus(500);
	}

}

 

서버를 재시작하고 다시 웹 페이지에 접근해 [ 서버로 요청2 ], [ 서버로 요청3], [ 서버로 요청4 ] 버튼을 눌러보자

서버가 300, 400, 500번대 상태 코드로 응딥을 하게 되면 error의 function이 동작함


여기까지 서버가 상태 코드를 담아 클라이언트에게 전달하는 방법을 배웠음

또 클라이언트가 상태 코드가 담긴 응답 정보를 받았을 때 ajax의 succes, error 중 한 함수가 동작한다는 것까지 해서 클라이언트가 상태 코드에 따른 처리하는 방법을 배웠음

 

굉장히 간단함

 

그렇다면 서버가 언제 200, 300, 400, 500번대 상태 코드를 언제 응답해야하는지 알아보자

서버가 300, 500번대 상태 코드를 응답하는 경우는 거의 없음

300번대와 500번대의 의미는? 잘모르겠다면 https://codingaja.tistory.com/16 이 글을 다시 보고 오자

 

서버는 주로 200, 400번대 상태 코드로 응답함

 

회원가입 처리를 하는 서블릿을 만들었는데

1. 유효성 검증에 통과하지 못했다면 400번대 상태 코드로 설정함

2. 유효성 검증에 통과했으나 이미 사용중인 아이디여서 "회원 가입에 실패" 했을 경우 400번대 상태 코드로 설정함

3. 유효성 검증에 통과했고 아이디도 사용중인 아이디가 아니여서 "회원 가입에 성공" 했을 경우 200번대 상태 코드로 설정함

 

로그인 처리를 하는 서블릿을 만들었는데

1. 유효성 검증에 통과하지 못했다면 400번대 상태 코드로 설정함

2. 유효성 검증에 통과했고 아이디, 비밀번호가 일치하는 계정있을 경우 "로그인 성공" 이므로 200번대 상태 코드로 설정함

3. 유효성 검증에 통과했지만 아이디, 비밀번호가 일치하는 계정이 없을 경우 "로그인 실패" 이므로 400번대 상태 코드로 설정함

 

등등...

 

이런 상황에서 상태 코드를 설정함

 

꼭 상태 코드만 설정하는게 아닌 상태 코드 + ("결괏값" 또는 "결괏값을 담고 있는 페이지") 를 같이 보낼 수도 있음


여기까지 서버에서 상태 코드를 설정하는 방법과 언제 어떤 상태 코드를 설정해서 응답 해야하는지 알아봤음

만약 "그럼... 클라이언트는 상태 코드를 받아서 그 이후에 어떻게 처리를 해줘야하지?" 라고 생각이 들었다면 잘 이해하고 있다는 것!

이는 클라이언트의 처리이므로 HTML, CSS, JS 로 그 이후에 처리를 하면 됨

 

로그인에 성공했을 때 HTML, CSS, JS 를 활용해서 메인 화면으로 넘어가게 하면 됨

로그인에 실패했을 때 HTML, CSS, JS 를 활용해서 "아이디 또는 비밀번호를 확인하세요" 메세지를 보여주면 됨

728x90
LIST