본문 바로가기
☕ Java 웹 프로그래밍/Servlet & JSP

[Servlet&JSP] GET과 POST에 특화된 service( )메소드

by 일단연 2023. 6. 4.

* 본 글은 [뉴렉처]의 Servlet&JSP 프로그래밍 강의를 듣고 정리한 글입니다.

 

2020 Servlet&JSP 프로그래밍

 

www.youtube.com

 

 GET과 POST에 특화된 service( )메소드

GET 요청과 POST 요청을 구분해주는 방법

  • service( )메소드를 오버라이딩해서 GET 요청과 POST 요청을 조건문으로 한 번에 처리
  • doGet( )메소드와 doPost( )메소드를 오버라이딩해 GET 요청과 POST 요청을 각각 처리
    • GET 요청에 특화된 메소드: doGet( ) POST 요청에 특화된 메소드: doPost( )

 

위의 두 방법을 사용하기 전에 먼저 할 것들

  • 새 서블릿 만들기
    • Java Resources>src>원하는 패키지(com.newlecture.web) 밑에 새 클래스 Calculator.java 생성
    • HttpServlet을 상속하게 함(public class 클래스명 extends HttpServlet{ } )
    • HttpServlet을 자동완성(Ctrl+Space)시켜서 HttpServlet을 import
    • service 입력해서 자동완성(Ctrl+Space)으로 service 클래스를 import
  • HTML 파일 만들기
    • WebContent>새 HTML 파일 calculator.html 생성
    • <form> 안에 <input> 만들기

 

service( )메소드로 GET 요청과 POST 요청을 공통으로 처리하는 과정

  • 1) [calculator.html] <form>에 action, method 값 설정 / <input>에 type, value 값 설정
<form action="calculator" method="get">
  <input type="submit" value="요청">
</form>
  • 2) [Calculator.java] service( )메소드 오버라이딩
    • HttpServletRequest가 가지고 있는 getMethod( )메소드를 사용
      • 클라이언트의 <input> 속 method 속성 값을 반환해줌 > get과 post를 나눠서 처리하거나, get과 post를 구체화할 수 있음
      • request.getMethod( ).equals(”GET
      • 주의사항: getMethod( )메소드를 함께 쓸 때는 equals( )메소드 안에 들어가는 문자열은 무조건 대문자여야 함
@WebServlet("/calculator")
public class Calculator extends HttpServlet {
  @Override
  protected void service(HttpServletRequest req
                        , HttpServletResponse resp) 
                        throws ServletException, IOException
  {
    if(req.getMethod().equals("GET")) {
      System.out.println("GET 요청이 왔습니다.");
    }
    else if(req.getMethod().equals("POST")) {
      System.out.println("POST 요청이 왔습니다.");
    }
    super.service(req, resp);
  }
}
  • 3) [Calculator.java] super.service(req, resp);는 일단 주석 처리
    • 주석 처리를 안 해두면 오류 발생
      • 오버라이딩된 service( )메소드로 GET 요청과 POST 요청이 각각 처리됨
      • 그 후에 super.service(req, resp);가 실행되는데 doGet( )메소드와 doPost( )메소드가 오버라이딩되어 있지 않아서 오류 발생

  • 405: URL은 있으나, 클라이언트가 요청하는 메소드(GET, POST…)를 처리하는 로직이 없는 경우 발생하는 에러
  • 404: 서블릿에서 매핑하는 URL(예: /calculator)이 아예 없을 경우 발생하는 에러

 

service( )메소드로 GET 요청과 POST 요청을 공통으로 처리하기 결과

  • HTML method가 get으로 되어 있으니, 요청 버튼을 누르면 이클립스 콘솔에 “GET 요청이 왔습니다.”라고 출력됨
  • HTML method를 post로 바꾸고 버튼을 클릭하면 “POST 요청이 왔습니다.”라고 출력됨

calculator.html 실행 화면
HTML method: get - 오버라이딩된 service( ) 실행 결과
HTML method: post - 오버라이딩된 service( ) 실행 결과

 

부모클래스의 service( )메소드로 GET 요청과 POST 요청 각각 처리하기

  • service( )메소드를 오버라이딩하지 않았다면 service( )안에 작성된 super.service(req, resp);를 통해 부모 클래스가 갖고 있는 service( )메소드가 호출되었을 것 > doGet( )메소드와 doPost( )메소드가 자동으로 호출됨

  • 부모클래스의 service( )메소드 기본 기능
    • 사용자의 요청이 GET이면 doGet( )메소드 호출
    • 사용자의 요청이 POST이면 doPost( )메소드 호출
    • super.service(req, resp);로 부모클래스의 service( )를 호출하면 doGet( )메소드와 doPost( )메소드가 자동으로 호출된다는 의미
      • doGet( )메소드와 doPost( )메소드를 오버라이딩하지 않으면 오류 발생

 

부모클래스의 service( )메소드로 GET 요청과 POST 요청 각각 처리하는 과정

  • 1) [Calculator.java] doGet( )메소드를 오버라이딩
    • doGet를 입력 후 자동완성(Ctrl+Space)
    • 부모클래스가 갖고 있는 doPost( )메소드는 호출할 필요 없으니 doPost( ) 안의 super.doPost(req, resp);는 지우기
  • 2) [Calculator.java] doPost( )메소드를 오버라이딩
    • doPost를 입력 후 자동완성(Ctrl+Space)
@Override
protected void doGet(HttpServletRequest req
                      , HttpServletResponse resp) 
                      throws ServletException, IOException {
  System.out.println("doGet 메소드가 호출되었습니다.");
}

@Override
protected void doPost(HttpServletRequest req
                      , HttpServletResponse resp) 
                      throws ServletException, IOException {
  System.out.println("doPost 메소드가 호출되었습니다.");
}

 

부모클래스의 service( )메소드로 GET 요청과 POST 요청 각각 처리하기 결과

calculator.html 실행 화면

  • doPost( )의 결과
    • 요청 버튼을 클릭하면, HTML method가 post니까 오버라이딩된 service( )를 거쳐서 “POST 요청이 왔습니다”가 출력 > 부모클래스의 service( ) 호출 > 자동으로 doPost( )가 호출되면서 “doPost 메소드가 호출되었습니다.”가 출력됨

HTML method: post - 오버라이딩된 service( ) 실행 - 부모클래스의 service( )가 오버라이딩된 doPost( ) 실행한 결과

  • doGet( )의 결과
    • HTML method를 get으로 바꾸고 새로고침 > 요청 버튼 누름 > 오버라이딩된 service( )를 거쳐서 “GET 요청이 왔습니다”가 출력 > 부모클래스의 service( ) 호출 > 자동으로 doGet( )가 호출되면서 “doGet 메소드가 호출되었습니다.”가 출력됨

HTML method: get - 오버라이딩된 service( ) 실행 - 부모클래스의 service( )가 오버라이딩된 doGet( ) 실행한 결과

 

서블릿(Calculator.java)와 HTML(calculator.html) 파일 코드

  • Calculator.java 코드
package com.newlecture.web;

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("/calculator")
public class Calculator extends HttpServlet {
  @Override
  protected void service(HttpServletRequest req
                          , HttpServletResponse resp) 
                          throws ServletException, IOException
  {
    if(req.getMethod().equals("GET")) {
      System.out.println("GET 요청이 왔습니다.");
    }
    else if(req.getMethod().equals("POST")) {
      System.out.println("POST 요청이 왔습니다.");
    }
    super.service(req, resp);
  }
	
  @Override
  protected void doPost(HttpServletRequest req
                        , HttpServletResponse resp) 
                        throws ServletException, IOException {
    System.out.println("doPost 메소드가 호출되었습니다.");
  }
}
  • calculator.html 코드
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
  <form action="calculator" method="post">
    <input type="submit" value="요청">
    </form>
</body>
</html>

 

service( ) 오버라이딩과, 부모클래스의 service( ) 호출로 자동 호출된 doGet( )/doPost( ) 오버라이딩 사용법 정리

  • 공통으로 처리할 부분GET/POST 각각 처리할 부분도 있는 경우
    • doGet( ) / doPost( )를 실행하기 전에 공통으로 처리할 게 있으면 오버라이딩한 service( )에서 작성
    • service( )안에 super.service(req, resp);를 작성해 doGet( ) / doPost( ) 호출
    • doGet( )와 doPost( )를 각각 오버라이딩
@WebServlet("/calculator")
public class Calculator extends HttpServlet {
  @Override
  protected void service(HttpServletRequest req
                          , HttpServletResponse resp) 
                          throws ServletException, IOException
  {
    if(req.getMethod().equals("GET")) {
      System.out.println("GET 요청이 왔습니다.");
    }
    else if(req.getMethod().equals("POST")) {
      System.out.println("POST 요청이 왔습니다.");
    }
    super.service(req, resp);
  }
	
  @Override
  protected void doPost(HttpServletRequest req
                        , HttpServletResponse resp) 
                        throws ServletException, IOException {
    System.out.println("doPost 메소드가 호출되었습니다.");
  }
}

 

  • 공통으로 처리할 부분만 있는 경우
    • service( )를 오버라이딩
    • super.service(req, resp);는 제거해야 함
@WebServlet("/calculator")
public class Calculator extends HttpServlet {
  @Override
  protected void service(HttpServletRequest req
                          , HttpServletResponse resp) 
                          throws ServletException, IOException
  {
    if(req.getMethod().equals("GET")) {
      System.out.println("GET 요청이 왔습니다.");
    }
    else if(req.getMethod().equals("POST")) {
      System.out.println("POST 요청이 왔습니다.");
    }
  }
}

 

  • 공통 부분이 없고 GET/POST 각각 처리할 부분만 있는 경우
    • service( )를 오버라이딩하지 않고, 바로 doGet( ) / doPost( ) 호출 후 각각 오버라이딩
    • 코드엔 super.service(req, resp);를 적지 않지만, doGet( ) / doPost( )를 오버라이딩하는 것 자체에 숨겨져 있음
    • HttpServlet이 갖고 있는 service( )는 doGet( )와 doPost를 라우팅해주는 느낌으로만 사용됨
@WebServlet("/calculator")
public class Calculator extends HttpServlet {
  @Override
  protected void service(HttpServletRequest req
                          , HttpServletResponse resp) 
                          throws ServletException, IOException
  {
    @Override
    protected void doPost(HttpServletRequest req
                          , HttpServletResponse resp) 
                          throws ServletException, IOException {
      System.out.println("doPost 메소드가 호출되었습니다.");
  }
}