개발자로 후회없는 삶 살기
spring PART.서블릿 프로그래밍 개요 본문
서론
※ 이 포스트는 다음 강의의 학습이 목표임을 밝힙니다.
https://www.inflearn.com/roadmaps/373
본론
- hello 서블릿
스프링 부트 환경에서 서블릿을 등록하고 사용해보자(빈을 등록하는 것과 같은 개념인 것 같습니다.) 사실 서블릿을 스프링과 전혀 관련이 없는데 스프링 부트가 톰캣 띄우기가 쉬워서 스프링 부트 환경에서 서블릿 쓰는 것을 보여줄 것입니다.
=> 스프링 부트 서블릿 환경 구성
서블릿 환경 구성을 해보자 스프링에서 서블릿을 쓰려면 @서블릿 컴포넌트 스캔이라는 어노를 지원합니다. 이러면 스프링이 자동으로 @서블릿컴포넌트스캔 어노테이션이 달린 파일의 패키지의 하위 패키지를 다 뒤져서 서블릿을 자동으로 다 등록해 줍니다.(서블릿 코드가 스프링 빈 코드같은 느낌인 것 같습니다. 지금부터 서블릿 컨테이너의 서블릿 생명주기 관리를 시작합니다.)
그리고 서블릿을 한 번 만들어보자 패키지를 만들고 helloservlet 클래스를 만듭니다. 서블릿은 httpservlet을 상속받고 @webservlet 어노를 붙여야합니다. 이름은 스프링 빈처럼 클래스 명에서 첫 글자를 소문자로 줬고 url 패턴은 /hello로 요청이 오면 이게 실행이 되게 합니다. (컨트롤러 클래스의 내부 메서드 느낌입니다. 등록은 빈 객체처럼 클래스에 하는데 url매핑은 컨트롤러의 getmapping처럼 메서드에 하지 않고 클래스에 합니다.)
@WebServlet(name = "helloServlet", urlPatterns = "/hello")
public class HelloServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("HelloServlet.service");
}
}
이제 중요합니다. 오버라이딩으로 service를 만드는데 좌물쇠있는 거로 합니다.(protected 접근지정자) 이렇게 하면 서블릿이 호출되면 서비스 메서드가 호출됩니다. (아 그래서 url 패턴을 클래스에 합니다!)
이제 이걸 실행을 해볼 것이다. 실행은 어떻게 할까? 아까 서블릿이 호출되면 서비스 메서드를 실행한다고 했습니다. 그러면 서블릿을 호출하면 됩니다. 서블릿에 아까 url을 달아놨습니다. 스프링에서 getmapping으로 메서드를 실행합니다. 그것처럼 url로 /hello해서 서블릿을 실행할 수 있습니다. 그러면 서비스 메서드가 실행이 됩니다. sout로 실행해보면 스프링을 띄우면 서버가 뜨고 url 호출하면 오류가 안나고 sout결과가 잘 나옵니다.
> 추가로 해보자 url 요청이오면 was가 req를 만들어서 서블릿에 던져준다고 했습니다.(사실 req를 만드는게 서블릿으로 뒤에 나옵니다.) 그 req에는 아까 /hello로 호출한 http 요청메세지를 만들어서 서버에 던진 게 담겨있습니다. 이것을 찍어보겠습니다.
> 이번엔 url에 쿼리파라미터(= 쿼리 스트링)를 줘보겠습니다. ?name=kim하면 지금은 당연히 안보입니다. req를 해체하는 코드를 안했으니깐 그렇습니다.
String name = req.getParameter("name");
System.out.println("name = " + name);
그것을 req.getParameter("name")으로 쿼리파라미터의 = 앞에 것으로 뒤의 것을 서블릿을 쓰면 쉽게 꺼낼 수 있습니다.
이렇게 서블릿을 이용하면 편리하게 http를 굉장히 편리하게 사용할 수 있게 해줍니다. 서블릿이 없으면 이걸 일일이 분해해야합니다.
resp.setContentType("text/plain");
resp.setCharacterEncoding("UTF-8");
resp.getWriter().write("hello" + name);
> 이번에는 응답 메세지를 보내보겠습니다. resp에 값을 넣으면 http 응답 메세지에 데이터가 담겨서 나가게 됩니다.(값을 넣기만 하면 알아서 담겨서 나가나?) contenttype으로 넣을 값의 타입을 알려줍니다. text/plain이 단순 문자열입니다. charenc로 인코딩 정보도 넣어야합니다. writer로 http resp 메세지 body에 데이터를 넣고 실행합니다. 위에 두개는 헤드에 들어가는 것이고 write만 body에 들어가는 것입니다.
실행해보면 데이터가 보입니다. 진짜로 write로 보낸 순수한 데이터가 남아있습니다. 진짜로 신기한게 그냥 resp에 담아서 실행만 했는데 브라우저로옵니다. 이게 http를 쉽게 쓸 수 있도록 개발자를 도와주는 was와 서블릿의 목적입니다.
> 개발자 도구로 보면 요청이랑 응답 정보를 다 볼수있습니다. req도 있고 resp 헤더도 있는데 type이 있고 resp를 보면 넘어온 데이터를 알 수 있다. 너무 신기합니다.
-> 정리
http 요청이 오면 맵핑 url이 호출되면서 서블릿 컨테이너는 서비스 메서드를 실행하고 끝나면 resp를 브라우저에게 보냅니다.
=> http 요청 메서드 보기
프로퍼티스에 로거를 지원합니다. logging.level.org.apache.coyote.http11=debug 라고 넣고 서버를 시작하고 요청을하면 갑자기 많은 정보가 나옵니다.
1. kim이라고 보내면 브라우저가 utf8로 인코딩해서 보냅니다. get방식도 보이고
2. 헤더 정보가 쭉 나옵니다.
이렇게 하면 개발할 때 요청이 제대로 됐나 안됐나를 확인할 수 있습니다.
- 동작방식 설명
그림으로 보자 스프링부트를 실행을 하면 부트가 톰캣을 실행합니다. 톰캣은 서블릿을 지원하는 거라서 서블릿 컨테이너 기능을 가지고 있습니다. 서블릿 컨테를 통해서 서블릿을 생성을 할 것이라서 컨테이너 안에 helloservlet이 생성이 됩니다.(요청이 안와도 생깁니다. 이게 컴포넌트 스캔해서 빈을 등록하듯이 서블릿을 등록해서 그런 것 같습니다.)
> 그 다음에 http 요청을 hello로 get으로 하면 http가 딱 이 모양으로 http 메세지를 만들어서 서버에 던집니다.
그러면 was는 저 메세지대로 req, resp를 만들고 아까 등록해둔 싱글톤 서블릿을 딱 호출해줍니다. 서비스 메서드를 호출하면서 req, resp을 딱 넘겨주는 것입니다. 그리고 개발자가 필요한 비즈니스 로직을 하고 resp에 데이터를 넣으면 종료되면서 resp를 가지고 was가 http 응답 메서지를 딱 이 모양으로 만들어서 반환을 해줍니다. was가 진짜 많은 것을 해줍니다.
- HttpServletRequest
아까 서블렛에게 보낸 요청 인터페이스입니다. 요청 메시지를 개발자가 직접 분해하는게 불편하기에 개발자 대신에 서블릿이 요청 메시지를 꺼내서 사용할 수 있는 기능을 제공하고 그 결과를 http서블릿 req에 담아서 제공합니다. (코드를 보니 req가 서블릿이 아닌 service의 인자로 오는 것을 봤을 때 서블릿이 만들어서 결과를 req에 담는게 맞습니다.)
> hreq를 사용하면 요청 메시지를 편리하게 조회할 수 있습니다. 요청 메시지가 post에 url로는 save에 type은 form으로 전달이 된 것입니다. 데이터는 name과 age가 있는 이런 요청 메세지가 있다고 해보겠습니다.
-> 요청 메세지 분해
1. 처음을 start line이라고 합니다. 첫번째 라인에 http 메서드, 쿼리스트링, url, 프로토콜 등이 있습니다.
2. 헤더에 호스트, content type등이 헤더 정보입니다.
3. 바디에는 데이터로 넘어오는 form 파라미터가 있습니다. 바디는 html form으로 파라미터로 넘어올 수도 있고 http 메세지 바디가 직접 오기도 합니다.
-> 부가기능
hreq 객체는 메세지를 편리하게 읽는 기능만 있는게 아니라 부가기능이 더 있습니다.
1. 임시 저장소 기능
요청 메시지가 고객의 요청이 오고 나가기까지가 생존 범위인데 거기에 setAttribute라고 해놓으면 메세지 안에 데이터 저장소가 있고 요청 메시지가 살아있는 동안 쓸 수 있게 값을 저장을 할 수 있고 get으로 꺼낼 수 있습니다. 이게 나중에 많이 사용됩니다.
2. 세션 관리 기능
로그인을 했다 안했다의 유지를 하는 기능인 세션이라고 있는데 그게 제공이 됩니다.
※ 제일 중요한 점은 hreq, hresp이 객체들이 요청 메시지, 응답 메세지를 편리하게 사용할 수 있도록 도와주는 객체라는 것입니다.
- hreq 사용법
request 패키지를 만들고 그 안에 헤더서블릿이라는 클래스를 만듭니다. 처음에는 헤더 정보를 많이 알아보기 위함입니다.(즉, req 객체에 start라인, 헤더, 바디가 있고 그 정보를 서블릿이 개발자가 사용하기 편리하게 제공을한다고 했는데 그 결과를 hreq에 담았다고 했습니다. 그러니 이번 강의에서는 그 정보를 어떻게 이용할 까를 알아볼 것이고 그 중에서 헤더를 먼저 알아볼 것입니다.)
@WebServlet(name = "requestHeaderServlet", urlPatterns = "/request-header")
public class RequestHeaderServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.service(req, resp);
}
}
> extends를 받고 웹 서블릿 어노와 url을 지정하고 서비스를 재정의합니다. 이제 하나씩 사용법을 봐보자. 이런 기능이 있다 정도만 알면됩니다. 나중에 만약 필요하면 검색해서 req로부터 꺼내 사용해야한다는 것을 알아야합니다.
-> start line 정보 불러오기
start line 정보 봐보자 get메서드는 get, post, 프로토콜은 http1.1이다. 이런 것들을 다 볼 수 있습니다. (말 그대로 요청 메시지를 파헤친 결과를 담은 req를 사용하는 그 자체입니다.) 이렇게 하면 여기있는 정보들이 쭉 출력이 됩니다. URL이면 전체 url이고 URI면 URL 맵핑에 쓴게 다 나옵니다.
-> 모든 헤더 정보보기
--- Headers - start ---
host: localhost:8080
connection: keep-alive
cache-control: max-age=0
sec-ch-ua: "Google Chrome";v="111", "Not(A:Brand";v="8", "Chromium";v="111"
sec-ch-ua-mobile: ?0
sec-ch-ua-platform: "Windows"
upgrade-insecure-requests: 1
user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36
accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
sec-fetch-site: none
sec-fetch-mode: navigate
sec-fetch-user: ?1
sec-fetch-dest: document
accept-encoding: gzip, deflate, br
accept-language: ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7
cookie: Idea-58c804c9=2aae0d19-4424-4710-8269-5a1629bde96a
--- Headers - end ---
getHeaderNames로 헤더에 담긴 모든 헤더 정보들을 다 꺼내서 다 출력할 수 있습니다. 보면 이렇게 정보가 많은데 브라우저가 이렇게 많은 정보를 보냅니다. 이게 아까 로깅으로 찍은 것들이 포함됩니다.
-> post 헤더 조회하는 방법
보면 getcontenttype, length 이런게 null입니다. 왜 그러냐면 지금 요청한 방식이 get 방식이라서 그렇고 get은 데이터를 거의 안보내고 바디에 뭔가 담겨있어야 contenttype이 의미가 있는데 지금 그런게 아니니깐 없는 것입니다. 이것을 post 방식으로 한 번 해보려면 postman으로 할 수 있습니다.
원래는 post 방식은 form 태그를 만들어서 보내야하는데 postman으로 form 태그 없이 보낼 수 있는 것입니다. post 방식으로 보내고 url은 서블릿 url 패턴으로 하고 raw 데이터에 text라고 하면 content type에 text/plain이라고 설정이 되고 send하면 바디 정보가 나옵니다.
-> 정리
지금까지 요청 메세지의 헤더, 메타 정보들을 봤는데 이제부터는 헤더 이런 거 말고 실제 데이터인 쿼리 파라미터라던가, content body에 있는 데이터를 조회하는 방법을 알아보겠습니다.
- http 요청 데이터 개요
요청 메시지를 통해서 클라에서 서버로 어떤 식으로 데이터를 주는지 알아보자 3가지 방법이 있습니다.
- get 쿼리 파라미터
http 요청 데이터 전송 중에 get 방식의 쿼리 파라미터에 대해 알아보자 보통 검색, 필터, 페이징에서 많이 사용합니다. /url?username=hello로 합니다. 서버에서는 httprequest를 통해서 쿼리 파라미터를 편리하게 조회할 수 있습니다.
@WebServlet(name = "requestParamServlet", urlPatterns = "/request-param")
public class RequestParamServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.getParameterNames().asIterator()
.forEachRemaining(paramName -> System.out.println(paramName + "=" + req.getParameter(paramName)));
}
}
> 전체 파라미터를 조회하는 것은 get파라미터names로 모든 요청 파라미터인 username, age를 다 꺼낼 수 있습니다. 요즘 방식은 forEachRemaining으로 합니다. param Name이 파라미터의 키이고 getParameter에 키를 넣어서 값을 꺼낼 수 있습니다.
실행해보면 출력이 됩니다.
System.out.println("[단일 파라미터 조회]");
String username = req.getParameter("username");
String age = req.getParameter("age");
System.out.println("age = " + age);
System.out.println("username = " + username);
다음은 단일 파라미터 조회입니다. 실제로 모든 파라미터를 다 부르는 건 별로 없고 단일로 꺼내는게 많습니다.
String[] usernames = req.getParameterValues("username");
for (String s : usernames) {
System.out.println("s = " + s);
}
> 이번에는 이런게 가능합니다. username=h를 해도 username=h2로 해도 값이 중복해서 넘어갈 수 있습니다. get파라미터Values로 이름이 같은 복수 파라미터를 조회할 수 있습니다.
> 복수 파라미터는 잘 안 씁니다. 중복일 때 getParameter를 쓰면 getValues()의 첫번째 값이 나옵니다.
- post html form
form은 회원가입, 상품 주문에서 사용하는 방식입니다. 메시지 바디에 쿼리 파라미터 형식으로 데이터가 존재합니다. webapp에 basic이라고 dir을 만들고 hello-form html을 만듭니다. 정적 파일을 접근할 때처럼 /basic/hello-form.html으로 합니다.
> request param 서블릿에 보낼 것입니다. f12로 보면 form 데이터에 데이터가 컨텐트 바디에 보입니다.
get 쿼리 파라미터 방식과 html form 방식 둘이 형식이 ? & &로 똑같기 때문에 request.getparameter로 다 꺼낼 수 있습니다. 이 메서드는 get, form 방식 두가지를 다 지원합니다. 파라미터 정보를 다 꺼낼 수 있고 form도 파라미터 모양이라서 됩니다.
-> postman 테스트
form 테스트 할 때마다 html을 만들기 귀찮습니다. 그때 postman을 씁니다. post로 데이터를 보낼 때 postman을 씁니다.
- api 메시지 바디 - 단순 텍스트
rest api 방식으로 http 요청 메시지의 메시지 바디에 내가 원하는 데이터를 직접 실어서 서버에 전송하는 것입니다. 단순한 텍스트를 전송해보자 post, put, patch를 사용합니다.
@WebServlet(name = "requestBodyStringServlet", urlPatterns = "/request-body-string")
public class RequestBodyStringServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletInputStream inputStream = req.getInputStream();
String messageBody = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8);
System.out.println("messageBody = " + messageBody);
}
}
> 새로운 클래스를 하나 만듭니다. 이름이 requestbody입니다. req에 http 메시지에 컨텐트 바디에서 꺼내려면 inputStream을 바이트 코드로 바로 꺼낼 수 있고 이를 String으로 바꿔야하고 스프링의 StreamUtils를 사용합니다. 사용할 때 바이트를 문자로 바꿀 때 어떤 인코딩인지 알려줘야합니다. UTF8로 하면 끝입니다. 메시지 바디가 꺼내집니다.
> 확인하려면 postman으로 해야합니다. 왜냐하면 컨텐트 바디에 담는 게 get이 아니니 post이고 post로 데이터를 담을 때 postman을 써야합니다.
raw에 text에 hello!!를 보내면 바디에 메시지가 담겨서 나옵니다. > 보통 문자로 주고 받지는 않고 json으로 주고 받습니다.
- api 메시지 바디 - JSON
json으로 바디에 넣고 꺼내보자 json 형식이기 때문에 보통 json을 그대로 쓰지 않고 객체로 바꿔서 씁니다. 그래서 json 형식으로 파싱할 수 있게 객체를 하나 만들어야합니다.
> 새로운 클래스를 만듭니다. 객체 클래스이고 이름과 age가 있고 게터 세터가 필요합니다. 롬복으로 게터 세터를 합니다.
@WebServlet(name = "requestBodyStringServlet", urlPatterns = "/request-body-string")
public class RequestBodyJsonServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletInputStream inputStream = req.getInputStream();
String messageBody = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8);
System.out.println("messageBody = " + messageBody);
}
}
그리고 서블릿을 만듭니다. 데이터를 읽는 것은 아까 text 방식과 똑같이 스트림 가져와서 꺼내면 됩니다. 이게 그냥 http 메시지 바디에 데이터를 가져오는 개념이라서 똑같습니다.
이를 요청해야하는데 postman에서 json으로 하고 데이터를 json으로 넣습니다. 전송하면 메시지 바디 결과가 나옵니다.
@WebServlet(name = "requestBodyJsonServlet", urlPatterns = "/request-body-json")
public class RequestBodyJsonServlet extends HttpServlet {
private ObjectMapper objectMapper = new ObjectMapper();
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletInputStream inputStream = req.getInputStream();
String messageBody = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8);
HelloData helloData = objectMapper.readValue(messageBody, HelloData.class);
System.out.println("helloData.name = " + helloData.getUserName());
System.out.println("helloData.age = " + helloData.getAge());
System.out.println("messageBody = " + messageBody);
}
}
얘를 방금 만든 객체로 변환시켜보자 이를 쓰려면 json 라이브러리가 필요하고 jackson이 필요합니다. ObjectMapper를 만들고 readValue에 메시지 바디를 넣고 HelloData.class로 하면 변환이 되고 이러면 HelloData 객체에 데이터가 초기화 되는 것이다. get으로 출력하면 됩니다.
- resp 기본 사용법
http 응답 메세지를 생성하는 역할을 하고 여기에 필요한 값을 넣으면 자동으로 http 응답 메세지를 만듭니다. 대표적으로 응답 상태 1 ~ 500 시리즈, 헤더, 바디를 직접 넣어서 생성할 수 있습니다. 편의 기능으로 쿠키, content type, redirect을 편리하게 넣을 수 있는 방법을 제공합니다.
response 패키지를 만들고 응답 서블릿을 만듭니다.
@WebServlet(name = "responseHeaderServlet", urlPatterns = "/response-header")
public class ResponseHeaderServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setStatus(HttpServletResponse.SC_OK);
resp.setHeader("Content-Type", "text/plain");
resp.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");
resp.setHeader("Pragma", "no-cache");
resp.setHeader("my-header", "hello");
url은 response header라고 합니다. 서비스에 응답 상태를 셋팅합니다. setstatus 메서드로 응답 코드를 넣을 수 있고 SC_OK 에 들어가보면 상수로 다 정의가 되어있고 직접쓰는 것보다 이렇게 하는게 낫습니다.
> 헤더 데이터를 셋팅하겠습니다. content type text로 하고, cache-control을 원전히 무효화하고 pragma를 주고 내 임의의 헤더 my-header를 만듭니다.
> 실행하고 f12로 열어보면 내가 넣은게 다 있습니다.
> 응답 코드를 400인 bad req로 해보면 상태가 400으로 갑니다.
-> 헤더 편의 메서드
//Content-Type: text/plain;charset=utf-8
//Content-Length: 2
//response.setHeader("Content-Type", "text/plain;charset=utf-8");
response.setContentType("text/plain");
response.setCharacterEncoding("utf-8");
//response.setContentLength(2); //(생략시 자동 생성)
방금은 content type을 직접 set header로 셋팅했습니다. 이는 오타날까 귀찮습니다. 얘를 set 메서드로 편하게 할 수 있습니다. 단순 전송일 경우 length가 꼭 있어야합니다. 생략하면 자동으로 계산되어 나갑니다.
-> 쿠키 편의 메서드
private static void cookie(HttpServletResponse resp) {
Cookie cookie = new Cookie("myCookie", "good");
cookie.setMaxAge(600);
resp.addCookie(cookie);
}
쿠키는 쿠키 객체를 만들면 됩니다. set-cook: 을 하면 귀찮으니 그렇게 하지 말고 편하게 객체를 만들고 name, value에 넣고 유효기간을 넣고 addCookie하면 됩니다.
f12보면 resp에 set cook이 들어가고 브라우저 요청을 새로고침하면 cookie 헤더가 req에 들어가 있습니다. 쿠키 조회는 req 편의 메서드에서 봤고 서버가 준 쿠키 저장소에 저장된 쿠키를 브라우저가 요청에 넣어 보내면 조회할 수 있었습니다. 로그인할 경우 조회하여 사용자를 확인하거나 세션 ID를 조회하여 사용자 확인을 할 것입니다.
-> 리다이렉트 편의 메서드
resp.setStatus(HttpServletResponse.SC_FOUND);
resp.setHeader("Location", "/basic/hello-form.html");
응답 코드는 302, location을 /basic/hello-form.html로 보낼 것입니다. set 상태와 헤더만 넣으면 됩니다. 아주 간편하게 적용할 수 있는 것입니다.
> f12를 보면 response-header 서블릿을 호출해서 302가 되고 html로 가서 200을 준 것입니다. 이보다 더 쉬운 방법이 setRedirect하면 똑같이 상태와 리다이렉이 됩니다.
- 응답 데이터 단순 텍스트, html
응답 헤더 말고 바디에 집중해서 데이터를 알아보자 3가지고 텍스트, html, http api로 응답하는 3가지가 있습니다.
텍스트는 writer로 하는 것으로 봤기에 패스합니다.
@WebServlet(name = "responseHtmlServlet", urlPatterns = "/response-html")
public class ResponseHtmlServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//Content-Type: text/html;charset=utf-8
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>");
}
}
새로운 서블릿을 만듭니다. 응답이 html로 나갈 것이면 type을 먼저 잡아야합니다. html과 utf를 지정합니다. writer를 텍스트를 응답할 때처럼 얻은 후 html 진짜 태그로 넣으면 됩니다. 서비스 메서드가 종료되면 텍스트를 넣었을 때처럼 응답 메서드가 자동으로 만들어져서 브라우저에게 갑니다.
- http 응답 api json
@WebServlet(name = "responseJsonServlet", urlPatterns = "/response-json")
public class ResponseJsonServlet extends HttpServlet {
ObjectMapper objectMapper = new ObjectMapper();
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setHeader("content-type", "application/json");
HelloData helloData = new HelloData();
helloData.setAge(25);
helloData.setUserName("hsb");
String s = objectMapper.writeValueAsString(helloData);
resp.getWriter().write(s);
}
}
rest api를 할 때 응답 데이터를 json으로 하는 것을 해보겠습니다. 바디에 직접 json 데이터를 넣는 것입니다.
새로운 서블릿을 만들고 역시나 type, 인코딩을 지정해야한다. hello 객체를 만든다. hello 객체에 set으로 이름과 age를 채웁니다. 이를 json으로 형태를 바꿔야합니다. (객체를 보내면 json이 됩니다.)
> 이를 바꾸려면 objectMapper가 필요합니다. writeValueString으로 객체를 json으로 변환하고 writer 얻은 후 write로 쓰면 됩니다. 이게 나중에 스프링을 쓰면 return helloData하면 됩니다.
'[백엔드] > [spring | 학습기록]' 카테고리의 다른 글
spring PART.서블릿 jsp로 웹 어플리케이션 개발 (0) | 2023.04.10 |
---|---|
spring PART.HTTP의 모든 것 1 (0) | 2023.04.07 |
spring PART.request scope (0) | 2023.04.02 |
spring PART.빈 스코프 (0) | 2023.04.02 |
spring PART.의존관계 자동 주입 (0) | 2023.03.31 |