[JAVA기초] Servlet으로 구현하는 백엔드 서버

junghan·2023년 7월 27일
0

JAVA

목록 보기
11/12
post-thumbnail

백엔드 서버는 웹 애플리케이션의 핵심적인 기능과 데이터 처리를 담당하여 웹 프론트엔드와 상호작용하는 중요한 부분입니다. ServletJava 플랫폼에서 백엔드 서버를 구현하는 데 가장 일반적으로 사용되는 기술 중 하나입니다. 이 블로그에서는 Servlet을 이용하여 백엔드 서버를 구현하는 과정과 톰캣과의 연결, 그리고 Servlet의 동작 과정과 주요 메소드인 doPost, doGet 메소드, 그리고 HttpServletRequestHttpServletResponse 객체에 대해 자세히 설명하겠습니다.

백엔드 개발 환경 구성과 설정하기

  • 웹 애플리케이션을 생성하고 Context Path를 설정한다.
  • Servlet을 URL Mapping하여 브라우저를 통해 확인한다.
    • 서블릿 생성

    • 생성 후 서버 재시작 → 확인


Servlet과 톰캣의 연결 과정

ServletJava 언어를 기반으로 작성된 서버 사이드 컴포넌트로, 톰캣과 같은 서블릿 컨테이너(서블릿 엔진)에서 실행됩니다.
톰캣은 Apache Software Foundation에서 제공하는 오픈소스 서블릿 컨테이너로서, Servlet 스펙에 따라 작성된 Servlet을 실행하고 관리합니다.
톰캣은 서블릿 컨테이너로서 웹 서버와 연동하여 웹 요청을 받고, 이를 처리하여 웹 애플리케이션에 응답합니다.
서블릿과 톰캣은 Java SE의 javax.servlet 패키지와 javax.servlet.http 패키지를 기반으로 구현됩니다.


Servlet의 동작 과정

  • 웹 브라우저에서 HTTP 요청을 보내면, 톰캣이 해당 요청을 받아서 처리합니다.
  • 톰캣은 요청된 URL 경로를 분석하여 매핑된 Servlet을 찾고, 해당 Servlet의 doGet 또는 doPost 메소드를 호출합니다.
  • doGet 메소드는 HTTP GET 요청을 처리하고, doPost 메소드는 HTTP POST 요청을 처리합니다.
  • Servlet은 요청에 따라 비즈니스 로직을 수행하고 데이터베이스와 통신하여 데이터를 처리합니다.
    • 처리된 결과를 HttpServletResponse 객체에 담아 웹 브라우저에 응답합니다.

HttpServletRequest와 HttpServletResponse

  • HttpServletRequest 객체는 클라이언트의 HTTP 요청 정보를 담고 있으며, 요청한 데이터를 읽어오는 기능을 제공합니다.
  • HttpServletResponse 객체는 서버가 클라이언트에게 전송하는 응답 정보를 담고 있으며, 응답 데이터를 설정하는 기능을 제공합니다.
  • HttpServletRequest 객체로부터 파라미터, 헤더, 쿠키 등의 정보를 읽어오고, HttpServletResponse 객체를 통해 응답 데이터를 설정하여 클라이언트에게 전달합니다.

doPostdoGet 메소드

  • doPostdoGet 메소드는 HttpServlet 클래스를 상속받은 Servlet에서 오버라이드하여 구현합니다.
  • doPost 메소드는 HTTP POST 요청을 처리하며, 클라이언트로부터 전송된 데이터는 HttpServletRequest 객체에서 읽어옵니다.
    • doGet 메소드는 HTTP GET 요청을 처리하며, URL 매개변수를 통해 전달된 데이터는 HttpServletRequest 객체에서 읽어옵니다.
    • 이 두 메소드에서 비즈니스 로직을 수행한 후 HttpServletResponse 객체를 사용하여 클라이언트에 응답합니다.

쿠키, 세션, 로그인 예제

세션 관리

  • LoginServlet 클래스를 통한 세션 생성
    • 클라이언트가 입력한 로그인 정보를 받아옵니다.
    • HttpSession 객체를 이용하여 세션을 생성합니다.
    • 클라이언트의 세션 ID와 서버의 세션 ID가 동일한지 확인하여 세션 관리를 수행합니다.
@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 활용

  • forward와 redirect
    • 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

profile
42seoul, blockchain, web 3.0

0개의 댓글