정적 리소스

  • HTML, CSS, JS
  • 스프링 부트는 클래스패스의 다음 경로에 있는 정적 리소스들을 제공한다.
    • 기본 시작 경로: src/main/resources
    • /static, /public, /resources, /META-INF/resources
  • src/main/resources/staticindex.html을 넣으면 root url(/)에 뿌려준다.
  • URL을 통해 (정확히는 GET 요청을 통해) 파일에 직접 접근이 가능하다.

뷰 템플릿

  • Thymeleaf, JSP
  • 기본 경로 : src/main/resources/templates

방법 1: ModelAndView 반환

@RequestMapping("/response-view-v1")
public ModelAndView responseViewV1() {
  return new ModelAndView("response/hello").addObject("data", "hello!");
}
  • 클라이언트가 /response-view-v1로 접속한다.
  • ModelAndView 객체를 생성하여 뷰 템플릿을 찾는다.
    • src/main/resources/templates/response/hello.html
  • addObject 메서드를 통해 해당 뷰에 보낼 데이터를 저장한다.
  • 생성한 ModelAndView를 반환한다.

방법 2: String 반환

@RequestMapping("/response-view-v2")
public String responseViewV2(
    Model model
{
  model.addAttribute("data", "hello!!");
  return "response/hello";
}
  • 클라이언트가 /response-view-v2로 접속한다.
  • Model 객체를 인자로 받는다. ( ArgumentResolver )
  • addAttribute 메서드를 통해 해당 뷰에 보낼 데이터를 저장한다.
  • 뷰의 논리 이름을 반환한다.
  • 뷰 리졸버가 실행되어 뷰를 찾는다.
    • src/main/resources/templates/response/hello.html

방법 3: Void 반환

@RequestMapping("/response/hello")
public void responseViewV3(
    Model model
) {
  model.addAttribute("data", "hello!!!");
}
  • @Controller를 사용하고, HttpServletResponseOutputStream(Writer) 같은 HTTP 바디를 처리하는 파라미터가 없으면 요청 URL를 참고해서 논리 뷰 이름으로 사용
  • 명시성이 너무 떨어지고 딱 맞는 경우도 많이 없어서 권장되지 않는다.

HTTP Message

  • Text, JSON
  • API로 응답하는 경우 사용된다.

ResponseBody

@Slf4j
@Controller
public class ResponseBodyController {
  /**
   * 일단 텍스트 응답
   */
  @ResponseBody
  @GetMapping("/response-body-string")
  public String responseBody() throws IOException {
    return "ok";
  }

  /**
   * JSON 응답 1
   * ResponseEntity
   */
  @GetMapping("/response-body-json-v1")
  public ResponseEntity<HelloData> responseBodyJsonV1() {
    HelloData data = new HelloData();
    data.setUsername("hello");
    data.setAge(20);
    return new ResponseEntity<>(data, HttpStatus.OK);
  }

  /**
   * JSON 응답 2
   * ResponseBody, ResponseStatus
   */
  @ResponseStatus(HttpStatus.OK)
  @ResponseBody
  @GetMapping("/response-body-json")
  public HelloData responseBodyJson() {
    return new HelloData(username = "hello", age = 20);
  }
}
  • 메서드앞에 @ResponseBody 애노테이션을 붙여서 사용
  • view를 사용하지 않고 HTTP Message Converter를 통해서 Body에 데이터를 넣어 응답하게 된다.
  • 반환 타입에 따라 다르게 처리하여 응답한다.
    • String: 일반 텍스트를 넣어 응답
    • 객체: 해당 객체의 맴버 변수와 저장된 데이터를 JSON으로 변환
  • @ResponseStatus 애노테이션을 사용하여 응답 코드를 설정할 수 있다.
    • 하지만 애노테이션이기 떄문에 응답 코드를 동적으로 변경할 수 없다.
    • 프로그램 조건에 따라서 동적으로 변경하고 싶다면, ResponseEntity를 사용하면 된다.
profile
백엔드 개발자 지망생

0개의 댓글