TIL(Today I Learned)
12월 30일(토)
공부한 내용을 제 언어로 빠르게 정리한 내용이라서 잘못된 내용이 있을 수 있습니다.
인프런: 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술(김영한님 강의)
스프링 웹 개발 기초
정적 컨텐츠
- 스프링의 데이터 전달은 3가지 방식이 있음
- 정적 컨텐츠는 파일을 웹브라우저에게 보내는 방식
- MVC와 템플릿 엔진은 JSP, PHP 같이 HTML 파일을 동적으로 만들어서 보내는 방식
- API는 JSON 데이터 포맷으로 데이터를 전달하는 방식
- 서버끼리 통신할때는 API 방식 사용
- 정적 컨텐츠 방식
- https://docs.spring.io/spring-boot/docs/2.3.1.RELEASE/reference/html/spring-boot- features.html#boot-features-spring-mvc-static-content
- 웹 브라우저가 localhost:8080/hello-static.html 로 요청→ 내장 톰켓 서버가 요청을 스프링 컨테이너로 보내면 컨테이너가 hello-static 관련 컨트롤러가 있는지 확인, 없으면 스프링 부트가 resources에서 static/hello-static.html 이 있는지 찾아서 반환
MVC와 템플릿 엔진
- MVC: Model, View, Controller
- 예전에는 뷰에 모든걸 다 구현함: Model 1 방식
- 관심사 분리, 뷰는 화면 그리는 것만 집중
- 비지니스 로직 등은 컨트롤러가 담당
-
예시 코드
@Controller public class HelloController { @GetMapping("hello-mvc") public String helloMvc(@RequestParam("name") String name, Model model) { model.addAttribute("name", name); return "hello-template"; } }
- 동작 방식
- 웹 브라우저가 localhost:8080/hello-mvc?name=spring 로 요청→ 내장 톰켓 서버가 요청을 스프링 컨테이너로 보내면 hello-mvc로 매핑된 HelloController의 메서드를 호출하면 모델과 템플릿을 스프링한테 넘겨줌
- 스프링은 ViewResolver에게 hello-template이라는 HTML을 찾아서 Thymeleaf 템플릿 엔진에게 전달하면, 템플릿 엔진이 렌더링해 준 HTML을 클라이언트에게 전달
- 동작 방식
API
@GetMapping("hello-spring")
@ResponseBody // HTTP 응답 메세지 바디에 반한된 데이터를 포함시킨다는 의미
public String helloSpring(@RequestParam("name") String name) {
return "hello" + name;
}
@GetMapping("hello-api")
@ResponseBody
public Hello helloApi(@RequestParam("name") String name) {
Hello hello = new Hello();
hello.setName(name);
return hello;
}
static class Hello {
private String name;
// getter setter
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
- InteliiJ 단축키
- cmd + shift + enter 문장 완성해서 다음줄로 넘어감
- ctrl + enter : getter / setter 생성
- JSON은 Key, Value 로 이루어진 구조
- xml은 무겁고 테그 열고 닫고 불편해서 요즘은 xml 안쓰고 JSON으로 통일되었음
- 그래서 spring도 기본이 JSON 반환하도록 세팅되어있음
- xml 전달하고 싶으면 따로 세팅해서 전달할 수도 있음
- Getter/Setter 는 JavaBean 표준 방식
- private 프로퍼티 접근하게 하기 위한 메서드
- @ResponseBody 사용 원리
- 웹 브라우저가 localhost:8080/hello-api로 요청→ 내장 톰켓 서버가 요청을 스프링 컨테이너로 보내면 hello-api로 매핑된 HelloController의 메서드를 호출하며, 메서드에 @ResponseBody가 붙어있으면 HTTP 메세지의 바디에 포함됨.
- 메서드가 반환한 내용을 변환하기 위해 HttpMessageConverter가 동작(ViewResolver 대신에): 단순 문자면 String Converter(StringHttpMessageConverter), 객체면 JsonConverter(MappingJaskson2HttpMessageConverter) 가 작동
- byte 처리 등등 기타 여러 HttpMessageConverter가 기본으로 등록되어있음
- 참고: 클라이언트의 HTTP Accept 헤더와 서버의 컨트롤러 반환 타입 정보 둘을 조합해서 HttpMessageConverter가 선택됨.