📹 참고 : 인프런 [ 스프링 입문 - 김영한 ]
💡 정적컨텐츠 : 서버를 통한 것이 아닌 파일(html) 그대로 웹 브라우저에 띄우는 형식
💡 MVC 와 템플릿 엔진 : 과거의 JSP, PHP 와 같이 HTML을 그냥 웹브라우저에 띄우는 것이 아닌 서버에서 프로그래밍을 통해 HTML을 동적으로 바꾸어 화면에 띄우는 것. 가장 많이 사용하는 방식
💡API : JSON과 같은 데이터 구조 포맷으로 클라이언트한테 데이터를 전달하는 방식.

스프링 부트는 정적 컨텐츠를 자동으로 제공함.
/resources/static/hello-static.html
경로에 파일을 생성하여 예제 코드를 삽입해 보자.
<!DOCTYPE HTML>
<html>
<head>
<title>static content</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
정적 컨텐츠 입니다.
</body>
</html>
스프링 부트를 실행 한 후 www.localhost:8080/hello-static.html 에 접속하면

위와 같은 정적 파일이 그대로 반환된다.

: Model, View, Controller
과거 jsp를 사용하여 개발할 때 컨트롤러와 뷰를 분리하지 않고 뷰에서 모든 걸 다 개발하는 Model 1 방식을 사용했다.
이번에는 외부에서 파라미터를 입력 받아 화면에 띄워보자.
/controller/HelloController
@Controller //컨트롤러 어노테이션 필수
public class HelloController {
@GetMapping("hello-mvc")
public String helloMVC(@RequestParam("name") String name,Model model){ //@RequestParam으로 외부에서 파라미터를 받아 옴.
model.addAttribute("name",name); //파라미터로 넘어온 name을 모델에 넘어감 (key,value)
return "hello-template";
}
}
/resources/templates/hello-template.html
<html xmlns:th="http://www.thymeleaf.org">
<body>
<p th:text="'hello ' + ${name}">hello! empty</p>
<!-- 서버에서는 "'hello ' + ${name}" 로 내용이 바뀌게 됨-->
</body>
</html>
스프링 부트를 실행 후 http://localhost:8080/hello-mvc 에 접속하면

에러 페이지를 볼 수 있다.
이유는 컨트롤러에서 @RequestParam을 사용하여 외부에서 파라미터를 받아왔는데, 해당 어노테이션은 String 형식의 value,required 두가지 파라미터가 필요하다.
required는 default 값이 true 이기 때문에 해당 오류가 발생.
🌟 해결 방법
1. required = false 로 설정 (에러는 없지만 null로 넘어옴)
2. defaultValue 설정 (파라미터 값이 비어있으면 디폴트 값으로 설정)
3. 주소 값에 임의적으로 파라미터 입력
http://localhost:8080/hello-mvc?name=spring! 실행


1. 톰캣 서버가 요청된 주소를 스프링 부트에 전달한다.
2. 스프링 부트는 컨트롤러에서 맵핑되는 메소드인 hello-mvc를 찾는다.
3. 이때 파라미터로 넘어온 spring!이 model의 키값인 name에 치환된다.
4. 컨트롤러가 모델에 name:spirng! 을 담아 이름을 hello-template으로 하여 스프링에 넘겨준다.
4.뷰를 찾아주고 템플릿을 연결 시켜주는 ViewResolver는 templates/hello-template 라는 return 된 값과 똑같은 파일을 찾아서 thymeleaf 템플릿 엔진에 넘긴다.
5. 템플릿 엔진은 렌더링해서 변환 한 html을 웹브라우저에 반환한다.

브라우저 화면에서 소스보기를 하면 위와 같이 변환된 것을 확인할 수 있다.
정적 컨텐츠를 제외하면 MVC 와 API 방식 두가지를 기억하면 됨.
HTML으로 내리느냐 API으로 데이터를 바로 내리냐 라는 차이점이 존재.
API를 사용하여 스트링 데이터를 확인해보자.
/controller/HelloController
@Controller //컨트롤러 어노테이션 필수
public class HelloController {
@GetMapping("hello-string")
@ResponseBody //필수! http 통신의 헤드와 바디 중 응답 바디에 아래 데이터를 직접 넣어주겠다는 의미.
public String hellostring(@RequestParam("name") String name) {
return "hello " + name; //hello Spring!
}
}

위의 템플릿 엔진 예제와 다른 점은 View가 없다는 것.
그냥 문자가 그대로 내려간다.

소스보기로 확인해 보아도 html 태그는 보이지 않는다.
이번에는 문자가 아닌 데이터를 보이려 할 경우 API 사용 예제를 살펴보자.
/controller/HelloController
@Controller //컨트롤러 어노테이션 필수
public class HelloController {
@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;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
}

실행해보면 json 형식으로 띄워지는 것을 확인 할 수 있다.

1. 톰캣 서버가 요청된 주소를 스프링 부트에 전달한다.
2. 스프링 부트는 컨트롤러에서 맵핑되는 메소드인 hello-api를 찾는다.
3. @Responsebody 어노테이션을 확인하고 http 응답에 그대로 이 데이터를 넣은게 되겠구나 라고 동작한다.
4. API방식 에서는 viewResolver 이 아닌 HttpMessageConverter가 동작하여 객체를 json 형태로 변환한다.
5. 변환된 데이터를 웹브라우저에 반환한다.
@ResponseBody를 사용
HTTP의 BODY에 문자 내용을 직접 반환
viewResolver대신에HttpMessageConverter가 동작
기본 문자처리:StringHttpMessageConverter
기본 객체처리:MappingJackson2HttpMessageConverter
byte 처리 등등 기타 여러 HttpMessageConverter가 기본으로 등록되어 있음