서블릿

ttaho·2023년 4월 15일
0

Spring-MVC

목록 보기
1/6

서블릿은 톰캣 같은 웹 애플리케이션 서버를 직접 설치하고, 그 위에 서블릿 코드를 클래스 파일로 빌드해서 올린 다음, 톰캣 서버를 실행하면 된다. 하지만 이 과정은 매우 번거롭다.
스프링 부트는 톰캣 서버를 내장하고 있으므로, 톰캣 서버 설치 없이 편리하게 서블릿 코드를 실행할 수 있다.

스프링 부트는 서블릿을 직접 등록해서 사용할 수 있다.
@ServletComponentScan을 추가하자.


@webServlet : 서블릿 애노테이션

  • name : 서블릿 이름
  • urlPatterns : URL 매핑
    HTTP 요청을 통해 매핑된 URL이 호출되면 서블릿 컨테이너는 service 메서드를 실행한다.

웹브라우저에 localhost:8080/hello?username=world 를 요청하면
username에 world가 저장된다.

서블릿 컨테이너 동작 방식

HttpServletRequest 역할

HTTP 요청 메시지를 개발자가 직접 파싱해서 상용해도 되지만, 매우 불편할 것이다. 서블릿은 개발자가 HTTP 요청 메시지를 편리하게 사용할 수 있도록 개발자 대신에 HTTP 요청 메시지를 파싱한다. 그리고 그 결과를 HttpServletRequest 객체에 담아서 제공한다.

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

HTTP 요청 데이터

  • GET 쿼리 파라미터 : 검색, 필터, 페이징등에서 많이 사용하는 방식
    메시지 바디 없이, URL의 쿼리 파라미터를 사용해서 데이터를 전달하자.

username=hello, age=20을 서버에 전달한다.
서버에서는 HttpServletRequest가 제공하는 다음 메서드를 통해 쿼리 파라미터를 편리하게 조회할 수 있다.

복수 파라미터에서 단일 파라미터 조회

username=hello & username=Kim과 같이 파라미터 이름은 하나인데, 값이 중복이면 어떻게 될까?
request.getParameter()는 하나의 파라미터 이름에 대해서 단 하나의 값만 있을 때 사용해야 한다.
지금처럼 중복일 때는 request.getParameterValues()를 사용해야 한다.
참고로 이렇게 중복일 때 request.getParameter()를 사용하면 request.getParameterValues()의 첫 번째 값을 반환한다.

HTTP 요청 데이터 - POST HTML Form

이번엔 HTML의 FORM을 사용한 클라이언트-> 서버 데이터 전송이다.
주로 회원가입, 상품주문 등에서 사용하는 방식이다.

특징
  • content-type:application/x-www-form-urlencoded
  • 메시지 바디에 쿼리 파라미터 형식으로 데이터를 전달한다. username=hello&age=20

src/main/webapp/basic/hello-form.html 생성

request-param의 요청을 받는 RequestHeaderServlet의 service 메서드가 실행된다.

그래서 다음의 로그가 찍힌다.

POST의 HTML Form을 전송하면 웹 브라우저는 다음 형식으로 HTTP 메시지를 만든다.

application/x-www-form-urlencoded 형식은 앞서 GET에서 살펴본 쿼리 파라미터 형식과 같다.
따라서 쿼리 파라미터 조회 메서드를 그대로 사용하면 된다.
클라이언트(웹 브라우저) 입장에서는 두 방식에 차이가 있지만, 서버 입장에서는 둘의 형식이 동일하므로, request.getParameter()로 편리하게 구분없이 조회할 수 있다.

정리하면 request.getParameter()는 GET URL 쿼리 파라미터 형식도 지원하고, POST HTML Form 형식도 둘 다 지원한다.

참고

content-type은 HTTP 메시지 바디의 데이터 형식을 지정한다.
GET URL 쿼리 파라미터 형식으로 클라이언트에서 서버로 데이터를 전달할 때는 HTTP 메시지 바디를 사용하지 않기 때문에 content-type이 없다.
POST HTML Form 형식으로 데이터를 전달하면 HTTP 메시지 바디에 해당 데이터를 포함해서 보내기 때문에 바디에 포함된 데이터가 어떤 형식인지 content-type을 꼭 지정해야 한다. 이렇게 폼으로 데이터를 전송하는 형식을 application/x-www-form-urlencoded라 한다.

Postman을 사용한 테스트
이런 간단한 테스트에 HTML form을 만들기는 귀찮다. 이떄는 Postman을 사용하면 된다.

Postman 테스트 주의사항
POST 전송시

  • Body -> x-www-form-urlencoded 선택
  • Headers에서 content-type:application/x-www-form-urlencoded로 지정된 부분 꼭 확인

profile
백엔드 꿈나무

0개의 댓글