개발일기
Session2. 서블릿 정리및 회고 ( request, response) 본문
Session2. 서블릿 정리및 회고 ( request, response)
한둥둥 2024. 2. 27. 00:32사실 서블릿을 사용하는 경우는 없을 것 같다. 지금은 Spring boot를 사용하여 간단하게 설정을 하고 MVC패턴을 사용할 수 있기 때문이다.
우선 Servervlet을 사용하기 위해서는
@WebServlet(name="", urlPatterns = "")
이 들어간다. urlPatterns는 localhost:8080/ -> 이 뒤에 붙어오는 url의 문자열을 지정해주는 것이 urlPatterns이다.
또한 상속을 HttpServlet으로 해주어야 한다. 이 때, 상속받아서 사용하는 메소드는 service라는 메소드이다.
예시의 코드는 아래와 같다.
package hello.servlet.basic.request;
import jakarta.servlet.ServletException;
import jakarta.servlet.ServletInputStream;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.util.StreamUtils;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
@WebServlet(name="requestBodyStringServlet", urlPatterns = "/request-body-string")
public class RequestBodyStringServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
Request
request를 통하여 값을 받아 올 수 있는 방법은
1. parameter를 통하여 가져오는 방법
2. String text/plain 값을 가져오는 방법
3. JSON을 통해서 가져오는 방법이다.
1. 이때 파라미터를 가져오는 방법에는
request.getParametersNames().asIterator().forEachRemaining(paramName -> System.out.println(request.getParameter(paramName))); // iterator를 통하여 parameter에 있는 내용을 하나씩 뽑을 수 있음
request.getParameter("파라미터이름");
String[] usernames = request.getParameterValues("username"); // 중복된 이름이 같은 파라미터를 모두 조회해서 올 수 있음 보통 사용할 일 이 없음
getParameter에서 중복된 이름이 있다면 parameter에서 가장 첫번째로 받은 parameterName을 가져온다.
여기까지가 파라미터를 통하여 받을 수 있는 request이다.
번외로 Request는 Header에 있는 값들을 뽑아 올 수 있다. (해당 방법은 종종 간혹 실무에서 응용으로 사용된다.)
----- Request-line - start ----
request.getMethod(); // 어떤 메서드 타입인지 가져올 수 있음
request.getProtocol(); // protocol 관련 정보 가져올 수 있음
request.getScheme(); // http
request.getRequestURL(); // http://localhost:8080/request-header -> full URL
request.getRequestURI(); // /request-header -> URI
request.getQueryString(); // username=hi
request.isSecure(); //https 사용
request.getHeaderName().asIterator().forEachRemaining(headerName -> System.out.println(headerName+ " : " +headerName));
------- 편의 조회 ------
request.getServerName();
request.getServerPort();
request.getLocales().asIterator().forEachRemaining(locale -> System.out.println("locale = " +locale));
// 언어에 대한 내용을 반복문을 통해서 가져올 수 있다.
//cookie 내용
for(Cookie cookie : request.getCookies()) {
System.out.println(cookie.getName() + " : " + cookie.getValue());
}
request.getContentType();
request.getContentLength();
request.getCharacterEncodint();
request.getRemoteHost(); // remote Host 정보 (서버)
request.getRemoteAddr(); // remote ip
request.getRemotePort(); // remote port
request.getLocalName();
request.getLocalAddr();
request.getLocalPort();
2. text/plain string으로 request 받기
ServletInputStream inputStream = request.getInputStream();
StreamUtils.copyToString(inputeStream, StandardCharsets_UTF-8);
3. JSON 으로 받기
ObjectMapper 를 통해서 POSTMAN에서 JSON 으로 raw로 받은 데이터를 class에 매칭 시켜준다. -> MVC 패턴에서도 내부적으로는 사실 ObjectMapper를 통해서 메핑해서 가져와준다.
ServletInputStream inputStream = request.getInputStream();
String messageBody = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8);
System.out.println("messageBody = " + messageBody);
HelloData helloData = objectMapper.readValue(messageBody , HelloData.class);
System.out.println("helloData = " + helloData.getUsername());
System.out.println("helloData.getAge = " +helload.getAge());
package hello.servlet.basic;
import lombok.Getter;
import lombok.Setter;
@Getter @Setter
public class HelloData {
private String username;
private int age;
}
{
"username" : "kim" ,
"age" 10
}
이런식으로 JSON타입으로 있는 내용이 그대로 request.getInputStream()으로 내려받아지게 되며 해당 값을 ServletInputStream 타입의 inputStream 에 넣어준다.
해당 값을 StreamUtils에 있는 copyToString 을통해서 String 타입으로 변경해주며, 이것을 ObjectMapper.readValue를 통해서 HelloData.class안에 있는 필드값의 내용을 매칭시켜주어 helloData 넣어준다.
이때 알아야 할 것은 setter 어노테이션이 아니더라도 setter가 있어야 하며 getter는 해당 값을 보여주기 위하여 어노테이션을 달았다.
Response
response는 응답값을 보내는 것이다. 즉, Request를 통하여 요청을 받을 값을 어떠한 내부적인 처리(비즈니스 로직)를 통해서 가공된 값을 사용자에게 응답 값으로 보내주는 행위이다.
이때 response 값을 통해서 Java 코드를 통해서 html값을 던져 줄 수도 있고, cookie 값, html redirect 시켜줄 수 있다.
또한 Status값을 상태값 정상적으로 비즈니스 로직이 작동했다는 상태 코드를 던져줄 수도 있다.
1. html 데이터 보내기
2. response로 json 형태 데이터 ObjectMapper에 매핑된 데이터 보내기
3. response의 추가기능 (Header)
1. 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>");
위에와 같이 writer를 통해서 html 형태로 보내줄 수 있다. 하지만 해당방식은 사용하지 않는다. (어디선가는 특별한 이유로 사용할 수 있으나.. 필자는 본적이 없긴하다.) PDF등 라이브러리를 통해서 무언가를 할 때 사용한 적이 있던거 같은데 모르겠다.
2. json형태 데이터 response
response.setContentType("application/json");
response.setCharacterEncoding("utf-8");
HelloData helloData = new HelloData();
helloData.setUsername("han");
helloData.setAge(29);
String result = objectMapper.writeValueAsString(helloData);
response.getWriter().write(result);
과거에는 xml 데이터로 응답 값을 많이 보냈으나, 최근에는 JSON데이터를 통하여 응답 값을 주고 받고 있다.
또한 ObjectMapper는 Spring boot에 설치시 자동적으로 제공되는 라이브러리이며 writerValueAsString은 String 타입으로 변환할 대상을 말한다. helloData 객체를 String 타입으로 변환 시켜주었다. JSON형식의 String 타입으로 변경된다.
3. response의 추가적인 기능
response 는 cache 관련 설정할 수 있다.
response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");
response.setHeader("Pragma", "no-cache");
이런식으로 cache를 사용하지 않을 수 있다.
response.setHeader("my-header", "hello");
F12를 통하여 검사 network를 통하여 response값을 보면 "my-header" , "hello"가 있는 것을 확인할 수 있다.
ContentType
response.setContentType("text/plain");
response.setCharacterEncoding("utf-8");
Content 의 타입과 Encoding 타입을 설정할 수 있다. 이때, utf-8로 설정을 안하면 한글이 깨지는 경우를 종종 볼 수 있다.
Cookie
Cookie cookie = new Cookie("myCookie", "good");
cookie.setMaxAge(600); //600초
response.addCookie(cookie);
위에 코드와 같이 쿠키를 설정할 수 있으며 cookie의 지속시간을 설정해줄 수 있다.
Redirect
response.sendRedirect("/basic/hello-form.html");
redirect를 통해서 html을 이동할 수 있다. 해당 코드는 많이 사용되며 redirect는 자주 사용되는 것을 볼 수 있다.
'Spring > (김영한님)스프링 MVC 1편 - 백엔드 웹 개발 핵심기술' 카테고리의 다른 글
MVC 프레임워크 만들기 정리 및 회고 (V1, V2) (0) | 2024.03.06 |
---|---|
서블릿, JSP , MVC 패턴 회고 및 정리 (0) | 2024.03.02 |
자바 백엔드 기술의 역사 (0) | 2023.05.26 |
HTML, HTTP API, CSR, SSR (0) | 2023.05.23 |
스프링 - 동시 요청 멀티스레드 (0) | 2023.05.23 |