정적 리소스
- HTML, CSS, JS
- 스프링 부트는 클래스패스의 다음 경로에 있는 정적 리소스들을 제공한다.
- 기본 시작 경로:
src/main/resources
/static
, /public
, /resources
, /META-INF/resources
src/main/resources/static
에 index.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
를 사용하고, HttpServletResponse
, OutputStream(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";
}
@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);
}
@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
를 사용하면 된다.