티스토리 뷰

서블릿이란 뭘까?

 

Java를 기반으로 웹 페이지를 동적으로 만들어줄 수 있는 프로그램을 뜻한다. 서블릿 내에 HTML도 작성할 수 있는데 if, else 또는 반복문을 이용하여 동적이 페이지를 만들 수 있는 것이다.

 

Servelt프로그래밍에서 Servlet으로 등록하기 위해 @WebServlet 어노테이션을 붙여야 한다.

@WebServlet(name = "requestParamServlet", urlPatterns = "/request-param")
public class RequestParamServlet extends HttpServlet {

    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  • name : 서블릿의 이름
  • urlPatterns : 해당 서블릿과 매핑될 URL

위의 코드를 보면 HttpServlet이란 패키지를 상속받고 있다.

해당 패키지 안에는 서블릿 구현을 위한 다양한 인터페이스와 클래스가 포함되어있다.

 

서블릿과 관련된 수많은 함수들이 존재하는데 나는 service()메서드를 사용했다.

# service(HttpServletRequest req, HttpServletResponse resp) 메서드?

이 메서드는 Http를 사용해서 넘어온 자료들을 doGet메서드나 doPost메서드를 호출하게 된다. 즉, 넘겨진 자료를 보고 GET요청이면 doGet을 POST 요청이면 doPost를 호출한다.

 

service 메서드를 보면 두 개의 파라미터가 보인다.

 

우선 request를 보면 이는 단어그대로 Http에서 요청된 것에대해 처리하고 response는 요청에 대한 응답을 처리한다.

 

<request의 기능>

  • 임시 저장소 기능 : Http 요청이 시작부터 끝날 때 까지 유지되는 임시 저장소이다.
    • 저장 : request.setAttribute(name, value)
    • 조회 : request.getAttribute(name)
  • 세션 관리 기능 : request.getSession(create: true)

이 request에서는 여러 메서드를 통해 Http에 담겨져 넘어오는 많은 정보들을 조회할 수 있다.

이는 메서드가 너무 많으니 구글을 통해 알아보자...

 

HTTP 요청 데이터 처리

 

HTTP가 서버쪽으로 요청할 때 데이터를 보내는 방법은 크게 세가지 방법이 있다.

 

1. GET - 쿼리 파라미터

URL을 보면 "?" 뒤에 id={}&q={} 이런식으로 넘어가는 것을 본적이 있을 것이다. 이는 메시지 바디 없이 URL에 데이터를 포함해서 전달하는 것이다.

쿼리 파라미터(쿼리 스트링)

 

2. POST - HTML Form

메시지 바디에 쿼리 파라미터 형식으로 전달한다. 이 말은 Http 메시지 바디에 id={}&q={} 형식으로 데이터를 넣어 보낸다는 것이다.

 

3. HTTP message boy에 데이터를 직접 담아서 요청

HTTP API에서 주로 사용하고, JSON, XML, TEXT 등을 사용하고 현재는 JSON을 가장 많이 사용한다.

 

그럼이제 요청한 데이터를 서버쪽에서 받아야 하는데 어떻게 받아야 할까?

 

1. GET /  POST

GET과 POST 형식은 request.getParameter() 메서드를 이용하여 받으면 된다. 서버입장에서는 받은 데이터의 형식이 둘다 쿼리 파라미터 형식으로 동일하기에 getParameter() 메서로 구분없이 조회가 가능하다.

String username = request.getParameter("username");
String age = request.getParameter("age");

2. JSON 형식의 전송

JSON 형식을 받기 위해서는 JSON변환 라이브러리(Jackson, Gson)가 필요하다.

private ObjectMapper objectMapper = new ObjectMapper(); // JSON을 사용하기 위한 선언

@Override
protected void service(HttpServletRequest request, HttpServletResponse responsesp) throws ServletException, IOException {
    ServletInputStream inputStream = request.getInputStream();
    String messageBody = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8);

    System.out.println("messageBody = " + messageBody);

    HelloData helloData = objectMapper.readValue(messageBody, HelloData.class);
    // 요청된 JSON을 HelloData객체로 변환

    System.out.println("helloData.username = " + helloData.getUsername());
    System.out.println("helloData.userage = " + helloData.getAge());
}

ObjectMapper(Jackson 라이브러리)를 사용하여 JSON 형식의 데이터를 받고 이를 지정된 객체로 변환시켰다.

 


HTTP 응답 데이터 처리

content 설정

response.setHeader("Content-Type", "text/plain;charset=utf-8");
response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");
response.setHeader("Pragma", "no-cache");
response.setHeader("my-header", "하이하이");

response 응답 객체는 setHeader를 통하여 여러 설정정보들을 지정할 수 있다.

또한 자신만의 설정정보도 추가할 수 있다. -> response.setHeader("my-header", "하이하이");

 

쿠키 설정

private void cookie(HttpServletResponse response){
    Cookie cookie = new Cookie("myCookie", "good");
    cookie.setMaxAge(600);
    response.addCookie(cookie);
}

위와 같이 쿠키를 응답 객체에 추가하여 클라이언트로 보낼 수 있다.

 

redirect 설정

페이지에 오류가 났을 경우 지정된 페이지로 redirect 설정도 할 수 있다.

private void redirect(HttpServletResponse response) throws IOException {
    //response.setStatus(HttpServletResponse.SC_FOUND);
    response.sendRedirect("/basic/hello-form.html");
}

 

HTTP HTML 응답

내가 위에서 servlet의 정의를 설명할 때 HTML코드도 추가할 수 있다고 하였는데 아래와 같이하면 된다.

@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    response.setContentType("text/html");
    response.setCharacterEncoding("utf-8");

    PrintWriter writer = response.getWriter();
    writer.println("<html>");
    writer.println("<body>");
    writer.println(" <div>안녕?</div>");
    writer.println("</body>");
    writer.println("</html>");
}

위와 같이 자바 코드내부에 PrintWriter 객체를 생성하고 println() 메서드 내부에 HTML 코드를 작성해서 응답하면 브라우저가 이를 HTML로 해석하여 보여준다. 여기서 조건문, 반복문을 이용하면 동적이 화면을 만들 수 있게 되는 것이다.

 

HTTP JSON 응답

private ObjectMapper objectMapper = new ObjectMapper();

@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    response.setContentType("application/json");
    response.setCharacterEncoding("utf-8");

    HelloData helloData = new HelloData();
    helloData.setUsername("hahaha");
    helloData.setAge(20);

    String result = objectMapper.writeValueAsString(helloData);
    response.getWriter().write(result);
}

위에서 request에서도 했듯이 objectMapper 객체를 생성하고 여기서 응답하고자 하는 객체를 생성하여 

writeValueAsString() 메서드를 이용하여 JSON으로 변환시켜 넘겨주면 JSON 데이터로 응답하게 된다.

'스프링' 카테고리의 다른 글

@RequestBody 데이터 검증하기  (0) 2022.11.04
Spring Controller에서 사용하는 여러 어노테이션  (0) 2022.08.23
JSP와 MVC패턴??  (0) 2022.08.21
DI(Dependency Injection) - 의존주입  (0) 2022.08.17
스프링(Spring)?  (0) 2022.08.16
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함