정적 리소스라는 것은 HTML, CSS, JS, 이미지 등과 같이 서버에서 별도의 처리 없이 그대로 반환되는 파일을 의미합니다.
Spring Boot에서는 아래 경로에 위치한 파일들을 정적 리소스로 인식하여 반환합니다.
/static/public/META-INF/resources예를 들어서, src/main/resources/static/hello/world.html이라는 파일이 있으면, localhost:8080/hello/world.html로 접근할 수 있습니다.
서버에서 동적으로 HTML을 생성하여 반환합니다. Spring에서는 Thymeleaf, JSP 등의 템플릿 엔진을 통해 View Template을 작성할 수 있습니다.
컨트롤러에서 @Controller와 함께 메서드가 문자열을 반환하면 Spring은 View Resolver를 통해 해당 이름의 템플릿 파일을 찾아서 렌더링 합니다.
@Controller
public class ViewTemplateController {
@RequestMapping("/response-view")
public Stirng responseView(Model model) {
model.addAttribute("data", "test");
return "thymeleaf-view"; // templates/thymeleaft-view.html
}
}
기본적으로 SpringBoot는 src/main/resources/templates 경로를 View Template 폴더로 사용합니다.
HTTP Message Body는 데이터를 직접 응답 본문에 담아서 반환하는 방식입니다.
컨트롤러에서 @ResponseBody를 사용하거나 @RestController를 사용하면 반환 값이 HTTP Message Body에 직접 들어갑니다.
@Controller
public class ViewController {
@ResponseBody
@RequestMapping("/resopnse-body")
public String responseBody() {
return "thymeleaft-view"; // 문자열이 그대로 HTTP Response Body에 들어감
}
}
JSON 응답이 필요한 경우 DTO 객체를 반환하면 Spring이 자동으로 Json으로 변환해줍니다.
Servlet 프로그래밍과 동일하게 HttpServletResponse의 getWriter().write()를 통해 response body에 직접 데이터를 넣습니다.
가장 저 수준의 방식으로, HttpStatus, header 등도 직접 설정해야 합니다.
@Controller
public class ResponseBodyController {
@GetMapping("/response-body")
public void responseBody(HttpServletResponse response) throws IOException {
response.getWriter().write("data");
}
}
ResponseEntity는 HttpStatus, header, body를 모두 제어할 수 있는 대표적인 응답 객체입니다. body에 데이터를 담아 반환할 수 있고, 상태 코드도 원하는 대로 지정할 수 있습니다.
@GetMapping("/response-body")
public ResponseEntity<String> responseBody() {
return new ResponseEntity<>("data", HttpStatus.OK);
}
객체를 반환하게 되면 자동으로 JSON 변환됩니다.
@GetMapping("/response-body")
public ResponseEntity<Tutor> responseBody() {
Tutor tutor = new Tutor("철수", 100);
return new ResponseEntity<>(tutor, HttpStatus.OK);
}
@ResponseBody를 메서드에 붙이면 반환값이 View 이름이 아니라 HTTP 메시지 바디에 직접 들어가게 됩니다.
반환 타입이 String이면 text, 객체라면 JSON 등으로 자동 변환됩니다.
@ResponseBody
@GetMapping("/response-body-text")
public String responseBodyText() {
return "data";
}
@ResponseBody
@GetMapping("/response-body-json")
public Tutor responseBodyJson() {
Tutor tutor = new Tutor("철수", 100);
return tutor;
}
@ResponseStatus(HttpStatus.000)을 함께 사용하면 HttpStatus도 지정할 수 있습니다. 단, 동적으로 HttpStatus를 변경하는 것은 불가능합니다.
@ResponseStatus(HttpStatus.OK)
@ResponseBody
@GetMapping("/response-body")
public Tutor responseBody() {
Tutor tutor = new Tutor("철수", 100);
return tutor;
}
@ConTroller + @ResponseBody의 조합입니다. 모든 메서드의 반환 값이 HTTP body에 직접 들어가게 됩니다.
자료 및 코드 출처: 스파르타 코딩클럽