백엔드 서버는 웹 애플리케이션의 핵심적인 기능과 데이터 처리를 담당하여 웹 프론트엔드와 상호작용하는 중요한 부분입니다. Servlet
은 Java
플랫폼에서 백엔드 서버를 구현하는 데 가장 일반적으로 사용되는 기술 중 하나입니다. 이 블로그에서는 Servlet
을 이용하여 백엔드 서버를 구현하는 과정과 톰캣과의 연결, 그리고 Servlet
의 동작 과정과 주요 메소드인 doPost
, doGet
메소드, 그리고 HttpServletRequest
와 HttpServletResponse
객체에 대해 자세히 설명하겠습니다.
서블릿 생성
생성 후 서버 재시작 → 확인
Servlet
은 Java
언어를 기반으로 작성된 서버 사이드 컴포넌트로, 톰캣과 같은 서블릿 컨테이너(서블릿 엔진)에서 실행됩니다.
톰캣은 Apache Software Foundation에서 제공하는 오픈소스 서블릿 컨테이너로서, Servlet 스펙에 따라 작성된 Servlet을 실행하고 관리합니다.
톰캣은 서블릿 컨테이너로서 웹 서버와 연동하여 웹 요청을 받고, 이를 처리하여 웹 애플리케이션에 응답합니다.
서블릿과 톰캣은 Java SE의 javax.servlet 패키지와 javax.servlet.http 패키지를 기반으로 구현됩니다.
doGet
또는 doPost
메소드를 호출합니다.doGet
메소드는 HTTP GET 요청을 처리하고, doPost
메소드는 HTTP POST 요청을 처리합니다.HttpServletResponse
객체에 담아 웹 브라우저에 응답합니다.HttpServletRequest
객체는 클라이언트의 HTTP 요청 정보를 담고 있으며, 요청한 데이터를 읽어오는 기능을 제공합니다.HttpServletResponse
객체는 서버가 클라이언트에게 전송하는 응답 정보를 담고 있으며, 응답 데이터를 설정하는 기능을 제공합니다.HttpServletRequest
객체로부터 파라미터, 헤더, 쿠키 등의 정보를 읽어오고, HttpServletResponse
객체를 통해 응답 데이터를 설정하여 클라이언트에게 전달합니다.doPost
와 doGet
메소드doPost
와 doGet
메소드는 HttpServlet
클래스를 상속받은 Servlet에서 오버라이드하여 구현합니다.doPost
메소드는 HTTP POST 요청을 처리하며, 클라이언트로부터 전송된 데이터는 HttpServletRequest
객체에서 읽어옵니다.doGet
메소드는 HTTP GET 요청을 처리하며, URL 매개변수를 통해 전달된 데이터는 HttpServletRequest
객체에서 읽어옵니다.HttpServletResponse
객체를 사용하여 클라이언트에 응답합니다.LoginServlet
클래스를 통한 세션 생성HttpSession
객체를 이용하여 세션을 생성합니다.@WebServlet("/login")
public class LoginServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 클라이언트가 입력한 로그인 정보 받아오기
String username = request.getParameter("username");
String password = request.getParameter("password");
// HttpSession 객체를 이용하여 세션 생성
HttpSession session = request.getSession();
session.setAttribute("username", username);
// 클라이언트와 서버의 세션 ID가 동일한지 확인
String sessionId = session.getId();
String clientSessionId = request.getRequestedSessionId();
// 세션 아이디 확인
if (sessionId.equals(clientSessionId)) {
response.getWriter().println("로그인 성공! 세션 아이디: " + sessionId);
} else {
response.getWriter().println("세션 아이디 불일치");
}
}
}
SaveCookieServlet
클래스를 통한 쿠키 저장 및 조회@WebServlet("/save-cookie")
public class SaveCookieServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 클라이언트가 입력한 상품 이름 받아오기
String productName = request.getParameter("product-name");
// 쿠키 생성 및 유효기간 설정
Cookie cookie = new Cookie("product", URLEncoder.encode(productName, "UTF-8"));
cookie.setMaxAge(3600); // 1시간 유효
// 쿠키 저장
response.addCookie(cookie);
// 저장된 쿠키 조회
Cookie[] cookies = request.getCookies();
if (cookies != null) {
for (Cookie c : cookies) {
if (c.getName().equals("product")) {
String value = URLDecoder.decode(c.getValue(), "UTF-8");
response.getWriter().println("저장된 상품 이름: " + value);
}
}
}
}
}
LoginAndCookieServlet
클래스를 통한 로그인과 쿠키, 세션 연동@WebServlet("/login-and-cookie")
public class LoginAndCookieServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 클라이언트가 입력한 로그인 정보 받아오기
String username = request.getParameter("username");
String password = request.getParameter("password");
// 로그인 처리
if (username.equals("user") && password.equals("password")) {
// 로그인 성공 시 세션 생성
HttpSession session = request.getSession();
session.setAttribute("username", username);
// 쿠키에 로그인 정보 저장
Cookie cookie = new Cookie("user", URLEncoder.encode(username, "UTF-8"));
cookie.setMaxAge(3600); // 1시간 유효
response.addCookie(cookie);
response.getWriter().println("로그인 성공! 세션과 쿠키에 로그인 정보 저장 완료.");
} else {
response.getWriter().println("로그인 실패! 다시 시도해주세요.");
}
}
}
RequestDispatcher
를 사용하여 요청을 포워드하고, 응답을 리다이렉트하는 방법에 대해 알아보겠습니다.javaCopy code
@WebServlet("/forward-example")
public class ForwardExampleServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// forward: 페이지 전환, 한 번의 요청으로 처리됨
RequestDispatcher dispatcher = request.getRequestDispatcher("/forward-page.jsp");
dispatcher.forward(request, response);
}
}
@WebServlet("/redirect-example")
public class RedirectExampleServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// redirect: 특정 URL로 재 요청, 2번의 요청이 발생
response.sendRedirect("/redirect-page.jsp");
}
}
참조:
https://gowoonsori.com/spring/architecture/
https://victorydntmd.tistory.com/154
https://ok-vamos.tistory.com/27
https://naeti.tistory.com/222
https://carrotweb.tistory.com/14
https://yh0921k.tistory.com/28
https://wecanit.tistory.com/12