728x90

※이 내용은 강의 내용을 정리하고자 하는 내용이라 기본 정의나 사용법은 써놓지 않았다.

 

만약 서블릿에 대해 알고 싶다면 여기 를 참고하자!

서블릿 특징

서블릿 등록

-class 하나를 생성하고 HttpServlet 이라는 인터페이스를 상속받고 service 라는 메소드를 Override한다.

-그리고 class 위에 @WebServlet(name= , urlPatterns=) 을 추가하고 각 변수에 원하는 값을 넣는다.

 

>>service 메소드는 http 요청을 통해 urlPatterns에 있는 매핑된 url이 호출되면 자동으로 실행이 된다.

-그리고 service 메소드에 HttpServletRequest , HttpServletResponse 각 객체들이 파라미터로 들어오는데 이걸로 우리가 http 응답 메시지를 설정 할 수 있다.

 

>> response.setContentType : 타입 설정 or response.setCharacterEncoding : 인코딩 방식 설정 or response.getWirter().write() : 메시지 작성

 

* resources/application.properties 파일에 loggin.level.org.apache.coyote.http11=debug 라는 설정을 추가하면 http 요청 메시지를 로그로 확인 가능*

위에서 한 방식을 정리하면 스프링 부트로 생성하면 내장되어 있는 톰캣 서버가 있는데 이 톰캣 서버가 서블릿 객체를 생성해준다. http 요청 메시지가 들어오면 이를 기반으로 HttpServletRequest , HttpServletResponse 각 객체가 생성되고 이 객체로 http 응답을 생성할 수 있게 된다.

 

HttpServletRequest 역할 : HTTP 요청 메시지를 개발자가 직접 파싱해서 사용해도 되지만 이는 매우 불편하기 때문에 이 파싱을 대신해준다. 그 결과를 객체에 담아서 제공한다.

-로그인 상태 같은 것들을 유지해주는 기능인데 이런 세션 관리 기능도 제공한다.

-임시 저장소 기능도 한다.

-request.getMethod() request.getProtocol() , request.getRequestURI() request.getCookies() 등등으로 HTTP의 정보들을 알 수 있다!


HTTP 요청 데이터

1. GET - 쿼리파라미터

-쿼리 파라미터는 ?로 시작하고 추가 파라미터는 &로 구분한다.

-request.getParameterNames().asIterator() .forEachRemaining(paramName -> System.out.println(paramName + " = " + request.getParameter(paramName)));

>>전체 파라미터 조회 하는 방법

>>단일 파라미터 조회 하는 방법 : request.getParameter("파라미터이름")

-username=spring1&username=spring2 이렇게 이름이 같은 파라미터를 조회 할 때는 : request.getParameterValues("username") 이렇게 가져와야한다.

 

2. POST - HTML Form -> 메시디 바디에 쿼리 파라미터 형식으로 전달

-(content-type : application/x-www-form-urlencoded (메시지 바디 타입을 알려줌) message body : 쿼리 파라미터) 의 형식으로 http 메시지를 만든다.

-서버 입장에서는 GET , POST 둘 다 어차피 같은 쿼리 파라미터이기 때문에 get에서 파라미터 조회 하는 방법과 동일하다.

*HTML Form 형식으로 데이터를 보낼때는 content-type이 꼭 있어야 한다. Message body 에 있는 데이터가 어떤 형식인지 알려줘야 하기 때문이다. 하지만 url 쿼리 파라미터(get방식)로 보내면 메시지 바디를 사용하지 않기 때문에 content-type이 없다*

*postman을 사용해서 HTML Form을 만들지 않고 HTML Form에 쿼리 파라미터를 날릴 수 있다*

 

3. HTTP message body에 데이터를 직접 담아서 요청 -> HTTP API에서 주로 사용, JSON , XML , TEXT

 

-데이터 읽는 방법

 

<text>

-inputStream = request.getInputStream() -> 메시지 바디 내용을 바이트 코드로 얻을 수 있다.

-mb = StreamUtils.copyToString(inputStream,StandardCharsets.UTF_8) -> 위에서 얻은 바이트 코드를 문자로 바꿔준다(UTF-8형식으로)

>>postman 으로 raw (text) 형식으로 메시지를 보내면 인텔리j에서 출력을 확인 할 수 있었다.

 

<json>

-inputStream = request.getInputStream()

-mb = StreamUtils.copyToString(inputStream,StandardCharsets.UTF_8)

위에 text 읽기 부분과 동일하게 읽어올 수 있다. 이렇게 읽어 오면 json 형태 그대로 가져온다 {key : value ...}

*json도 어차피 문자이기 때문*

json은 보통 객체로 바꿔서 사용하기 때문에 파싱 할 수 있게 객체를 하나 생성해줘야 한다

(클래스 생성 : HelloData(필드 : username,age))

-ObjectMapper objectMapper = new ObjectMapper() -> Jackson 라이브러리에 있는 것인데 jackson이 json 라이브러리 이다.

-helloData = objectMapper.readValue(messageBody,HelloData.class) 를 하면 helloData 라는 객체로 age, username 을 가져올 수 있다.

>>postman 으로 raw(json) 형식으로 메시지를 보내면 인텔리제이에서 출력을 확인 할 수 있었다.

HttpServletResponse 역할 : HTTP 응답 메시지 생성 (HTTP 응답 코드 지정, 헤더 생성 , 바디 생성)

>>개발자들이 직접 HTTP 응답 메시지를 만들기에는 어렵기 때문에 메서드에 필요한 값들을 넣으면 HTTP 응답 메시지를 생성해준다.

[status-line] -> response.setStatus(SC_OK...) 상태 코드 설정

[response-headers]

response.setHeader(response.setHeader("Content-Type","text/plain") or response.setContentType("text/plain") .setCharacterEncoding("utf-8")

response.setHeader("Cache-Control","no-cache,no-store,must-revalidate"); //캐시 무효화

response.setHeader("my-header","hello"); header부분 이런식으로 추가 가능

[message-body] -> PrintWriter writer = response.getWriter(); writer.println(); message-body 추가 가능

-cookie 편의 메서드 : Cookie cookie = new Cookie("my cookie","good"); cookie.setMaxAge() response.addCookie(cookie)

>>이런식으로 쿠키를 만들 수 있음

 

-redirect 편의 메서드 : response.sendRedirect("/path") 이렇게 하면 redirect이 일어난다.


HTTP 응답 데이터

1. 단순 텍스트 응답 : 위에서 writer.println("ok") 이런 형식으로 하면 된다.

2. HTML 응답

-Content-Type 과 CharacterEncoding을 지정해줘야 한다. .setContentType("text/html") .setCharacterEncoding("utf-8")

-writer.println("<html>) ... writer.println("</html>");

 

>>이런식으로 자바 코드로 html을 작성하면 HTML 응답이 가능하다.

3.HTTP API - JSON

-json 형식으로 보내기 때문에 .setContentType("application/json") 으로 지정하고 .setCharacterEncoding("utf-8") 도 추가해서 한국어가 꺠지지 않도록 한다.

-위에서 봤던 Jackson 라이브러리를 사용하면 된다.

-HelloData 의 .setName , .setAge 를 해줘서 이름과 나이를 가지고 있는 객체를 만든다.

-여기 있는 객체를 json 형태로 만들어야 한다 {"key" : value , ... }

 

>>result = objectMapper.writeValueAsString(객체)

 

*json도 문자이기 때문에 위에 있는 코드 처럼 하면 json 형태로 변한다*

-reponse.getWriter().wirte(result) 하면 화면에 json 형태의 데이터가 보인다!

728x90

+ Recent posts