2) 스프링 웹 개발 기초
출처 : https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%EC%9E%85%EB%AC%B8-%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8/unit/49576?tab=curriculum
2-1) 정적 컨텐츠 , MVC와 템플릿 엔진, API
- 정적 컨텐츠 : 단순히 파일을 웹 브라우저에 내려주는 형식
- MVC와 템플릿 엔진: JSP / PHP 와 같은 템플릿 엔진이 html을 그냥 보내는것이 아닌 서버에서 프로그래밍을 거쳐 html을 동적화 시켜 송출.
( MVC: Model , View , Controller)
- API : JSON이라는 데이터 포맷으로 클라이언트에게 전달.
정적 컨텐츠
정적 컨텐츠

- hello-static.html
- 프로그래밍은 불가 (그대로 전송됨)


- 순서: 해당 url 요청시 톰캣 서버가 hello-static.html 에 대한 Controller (1순위) 를 가장 먼저 확인 -> 있으면 해당 파일 실행 -> 없으면 resources/static/hello-static.html 실행
MVC와 템플릿 엔진
MVC와 템플릿 엔진
- MVC ( Model , View , Controller)
view
화면을 구현하는데 모든 집중 필요 (Controller 와 분리의 필요성)
Controller
비지니스 로직 혹은 서버 뒷단의 내부적 요소들에 대한 처리에 대한 집중
Model
화면구현에 필요한 정보들을 view에서 전달해주면 담아서 넘겨줌
- GetMapping 에 새로운 정보 추가 ("hello-mvc")
- 파라미터를 활용한 url 등록
- @RequestParam과 attributeName은 동일한 "name" -> 쿼리 ?name 에 관한 부분, String name 이 해당 쿼리에 대한 value ( 즉, ?name=spring 과 같은 형식)

- hello - template.html 파일 생성

- 원하는 파라미터 값(spring!) 전달

- 웹 브라우저가 해당 url을 톰캣에게 요청
- 톰캣이 Controller 찾아서 해당 url에 대한 return 값 (템플릿) 반환
- 해당 템플릿을 viewResolver가 변환과정을 거쳐 웹 브라우저에게 전송

API
API
HTTP 프로토콜 통신시 요청/응답간의 과정의 메시지 포맷에 있어 HTTP 헤더 ( Generl Header , Request<->Response Header / Entity Header ) 와 HTTP 바디로 구성이됨.


- 해당 페이지 소스 확인시 html 형식이 아닌 입려된 문자 형태 그대로 입력되는 걸 확인 할 수 있다. (즉 , thymleaf 의 변환과정이 생략됨)

API 방식으로 데이터 얻기 (객체 반환)
- Hello 클래스 생성
- static 타입의 Hello 객체 hello 생성
- getName, setName 함수 생성

- 응답 페이지
- JSON 형태
- 스프링은 객체 생성후 ResponseBody 요청시 JSON으로 반환하는것이 기본.

동작원리
- 원래의 작동원리라면 웹브라우저 -> 톰캣 서버-> helloController -> templates 폴더 내 html파일을 viewResolver에게 던짐.
- 하지만 , @ResponseBody 존재시 http 응답과정에 있어 해당 데이터를 '원형 그대로 ' 넘겨야 겠다고 생각.
- 그렇지만 응답 타입이 문자형태가 아닌 객체?
- 객체 존재시 기본 디폴트는 JSON 형태의 응답 방식.
- HttpMessageConveter 동작 (viewReslover X)
단순 문자열 : StringConverter 동작
기본 객체처리: MappingJackson2HttpMessageConverter
// Jackson : 객체를 JSON으로 바꿔주는 라이브러리 , 구글의 GSON 도 존재 , Spring은 Jakson 채택.
// HTTP Accept 헤더와 서버의 Controller 반환 타입 정보 2가지를 조합해 반환 타입(HttpMessageConverter) 결정.
- 해당JSON 객체 웹 브라우저에게 전달 ( ex) {name: spring} )
