[ 스프링 웹 MVC ] - 서블릿

.·2021년 5월 18일
1

스프링 MVC

목록 보기
2/6

프로젝트 생성

스프링 부트 스타터 사이트에서 다음과 같은 옵션으로 스프링 프로젝트를 생성합니다.
https://start.spring.io

Hello 서블릿

@ServletComponentScan

스프링 부트는 서블릿을 직접 등록해서 사용할 수 있도록 @ServletComponentScan을 지원한다.

@ServletComponentScan //서블릿 자동 등록 @SpringBootApplication
public class ServletApplication {

      public static void main(String[] args) {
          SpringApplication.run(ServletApplication.class, args);
	}
}

@WebServlet


  @WebServlet(name = "helloServlet", urlPatterns = "/hello")
  public class HelloServlet extends HttpServlet {
      @Override
      protected void service(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
     
     함수내용

}

@WebServlet 서블릿 애노테이션

  • name: 서블릿 이름
  • urlPatterns: URL 매핑

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

HttpServletRequest

개요

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

함수

request.getMethod()
request.getProtocol()
request.getScheme()
request.getRequestURL()
request.getRequestURI()
request.getQueryString()
request.isSecure()

결과

request.getMethod() = GET
request.getProtocal() = HTTP/1.1
request.getScheme() = http
request.getRequestURL() = http://localhost:8080/request-header
request.getRequestURI() = /request-header
request.getQueryString() = username=hello
request.isSecure() = false

함수

request.getHeaderNames().asIterator()
        .forEachRemaining(headerName -> System.out.println(headerName + ": " + request.getHeader(headerName)));

결과

host: localhost:8080
connection: keep-alive
cache-control: max-age=0
sec-ch-ua: "Chromium";v="88", "Google Chrome";v="88", ";Not A Brand";v="99"
sec-ch-ua-mobile: ?0
upgrade-insecure-requests: 1
user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X
이하 생략

HTTP 요청 데이터

개요

GET - 쿼리 파라미터

  • /url?username=hello&age=20
  • 메시지 바디 없이, URL의 쿼리 파라미터에 데이터를 포함해서 전달
  • 예) 검색, 필터, 페이징등에서 많이 사용하는 방식

POST - HTML Form

  • content-type: application/x-www-form-urlencoded
  • 메시지 바디에 쿼리 파리미터 형식으로 전달 username=hello&age=20
  • 예) 회원 가입, 상품 주문, HTML Form 사용

HTTP message body - 직접 데이터를 담음

  • HTTP API에서 주로 사용, JSON, XML, TEXT
    데이터 형식은 주로 JSON 사용

GET 쿼리 파라미터, POST HTML Form

전달 데이터

  • username = hello, kim
  • age = 20

URL
http://localhost:8080/request-param?username=hello&username=kim&age=20

String username = request.getParameter("username");
String age = request.getParameter("age");
System.out.println("request.getParameter(username) = " + username);
System.out.println("request.getParameter(age) = " + age);

String[] usernames = request.getParameterValues("username"); 
for (String name : usernames) {
              System.out.println("username=" + name);
          }

request.getParameter(username) = hello
request.getParameter(age) = 20
username=hello
username=kim

POST도 GET과 같이 getParameter함수를 통해 조회 가능

API 메세지 바디

  • HTTP message bod에 데이터를 직접 담아서 요청
  • 주로 JSON 데이터 형식 사용
  • HTTP 메시지 바디의 데이터를 InputStream을 사용해서 직접 읽을 수 있다.

단순 텍스트 바디

 ServletInputStream inputStream = request.getInputStream();
 String messageBody = 
 StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8)

JSON

  • JSON 형식으로 파싱할 수 있게 객체 하나 생성
@Getter @Setter
  public class HelloData {
      private String username;
      private int age;
  }
  • JSON 결과를 파싱해서 사용하기 위해 Jakson라이브러리 (ObjectMapper)을 사용해야 한다.
private ObjectMapper objectMapper = new ObjectMapper();
HelloData helloData = objectMapper.readValue(messageBody,HelloData.class);
System.out.println("messageBody = " + messageBody);
System.out.println("helloData.username = " + helloData.getUsername());
System.out.println("helloData.age = " + helloData.getAge());

messageBody={"username": "hello", "age": 20}
data.username=hello
data.age=20

HTTPServletResponse

기본 사용법

response.setStatus(HttpServletResponse.SC_OK); //200
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","hello");
response.setContentType("text/plain");
response.setCharacterEncoding("utf-8");
Cookie cookie = new Cookie("myCookie", "good");
cookie.setMaxAge(600);
response.addCookie(cookie);
response.sendRedirect("/basic/hello-form.html");

HTTP 응답 데이터

단순 텍스트, HTML

  • 단순 텍스트 응답 - writer.println("ok");
  • HTTP 응답으로 HTML을 반환할 때는 content-type을
    text/html 로 지정해야 한다.
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>");

API JSON

  • HTTP 응답으로 JSON을 반환할 때는
    content-type을 application/json 로 지정해야 한다.
  • objectMapper.writeValueAsString() 를 사용하면
    객체를 JSON 문자로 변경할 수 있다.
response.setHeader("content-type", "application/json");
response.setCharacterEncoding("utf-8");
HelloData data = new HelloData();
data.setUsername("kim");
data.setAge(20); //{"username":"kim","age":20}
String result = objectMapper.writeValueAsString(data);
response.getWriter().write(result);
profile
지금부터 공부하고 개발한것들을 꾸준하게 기록하자.

0개의 댓글