[66해빗 페이백 챌린지] 11일차

tree·2023년 5월 12일
0

HTTP 응답 - 정적 리소스, 뷰 템플릿

  • 서버(스프링)이 응답 데이터를 만드는 방법은 3가지다.

    • 정적 리소스
      • 웹 브라우저에 HTML, css, js를 제공하는 경우
    • 뷰 템플릿 사용
      • 동적으로 HTML을 생성하여 제공하는 경우
    • HTTP 메시지 바디 사용
      • HTTP API를 제공하는 경우 HTTP 응답 메시지의 바디에 JSON같은 형식으로 데이터를 담아 제공.
  • 정적 리소스

    • 경로
      • src/main/resources/static
      • 만약 웹 브라우저가 http://localhost:8080/a/b.html의 url로 요청을 보내면 서버는 src/main/resources/static/a/b.html을 제공한다.
  • 뷰 템플릿

    • HTML을 동적으로 만들어서 제공
    • 경로는 src/main/resources/templates
  • 컨트롤러의 메소드 반환 타입에 따른 응답 데이터

    • String을 반환하는 경우
      • 메소드에 @ResponseBody가 있으면 메시지 바디에 문자열을 담아서 응답.
      • 메소드에 @ResponseBody가 없으면 해당 문자열을 뷰의 논리 이름으로 간주되어 뷰 리졸버를 호출해 물리 이름으로 변환하고 해당 물리 이름의 뷰를 렌더링.
    • Void를 반환하는 경우
      • 메소드에서 HTTP 메시지 바디를 처리하는 HttpServletResponse, OutputStream같은 파라미터를 받지 않으면 요청 url을 참고해 논리 뷰 이름으로 사용.
      • 요청 url이 /a/b이면 /templates/a/b.html을 실행.
      • 하지만 명시성이 떨어지니까 사용하지 말자.
    • @ResponseBody, HttpEntity를 사용하면 메시지 바디에 직접 데이터를 담아서 전송 가능.

HTTP 응답 - HTTP API, 메시지 바디에 직접 입력

  • 참고로 HTML이나 뷰 템플릿을 사용해도 HTML 데이터가 HTTP 응답 메시지의 바디에 담겨져서 전송된다.
    • 여기서 말하는 메시지 바디에 직접 입력한다는 것은 정적 리소스나 뷰 템플릿을 거치지 않고 직접 HTTP 메시지 바디에 데이터를 담는 것을 말한다.
  • 직접 HTTP 메시지 바디에 데이터를 담는 방법은 여러가지가 있다.
    • response.getWriter().write("ok")
    • ResponseEntity 객체 반환
    • @ResponseBody 사용
  • 참고로 @ResponseStatus(HttpStatus.OK)를 사용해 응답 코드를 설정할 수 있지만 응답 코드를 동적으로 변경할 수 없다는 단점이 있다. 응답 코드를 동적으로 반환할 필요가 있으면 ResponseEntity를 사용해 응답 코드를 지정해주면 된다.
  • @RestController
    • @RestController 어노테이션 안에 @ResponseBody가 있다.
      • 따라서 @RestController을 클래스에 붙히면 모든 메서드에 @ResponseBody가 적용되는 효과가 있다.

0개의 댓글