1. 웹 애플리케이션 이해
- 모든 것은 HTTP 프로토콜 기반으로 동작하게 된다
- HTML, TEXT, JSON 등 거의 모든 형태의 데이터 전송한다
1). 웹 서버
- Web Server
- HTTP 기반으로 동작
- 정적 리소스 제공, 기타 부가 기능
- 예) NGINX, APACHE

2). 웹 애플리케이션 서버
- WAS (Web Application Server)
- HTTP 기반으로 동작
- 웹 서버 기능 포함
- 사용자에 따라서 동적으로 화면을 다르게 보여줄 수 있다
- 프로그램 코드를 실행해서 애플리케이션 로직 실행
- 동적 HTML, HTTP API(JSON)
- 서블릿, JSP, 스프링 MVC
- 예) 톰캣, Jetty, UnderTow

웹 서버와 WAS의 차이
- 웹 서버는 정적 리소스(파일), WAS는 애플리케이션 로직
- 사실 둘의 용어도 경계도 모호함
- 웹 서버도 프로그램 실행하는 기능을 포함하기도 한다
- WAS도 웹 서버의 기능을 제공한다
- 자바는 서블릿 컨테이너 기능을 제공하면 WAS
- WAS는 애플리케이션 코드를 실행하는데 더 특화
3). 웹 시스템 구성 - WEB, WAS, DB
- WAS와 DB만으로도 구성할 수 있지만 WAS에게 너무 큰 부담이 된다
- 비싼 애플리케이션 로직이 정적 리소스 때문에 수행이 어려울 수 있다
- WAS 장애시 오류화면도 노출 불가능하다

4). 서블릿
- 톰캣처럼 Servlet을 지원하는 WAS를 서블릿 컨테이너라고 한다
- 동시 요청을 위한 멀티 쓰레드 처리도 지원한다 동시 요청을 위한 멀티 쓰레드 처리도 지원한다
- Client -> WAS -> Thread -> Servlet Container -> MVC
- 클라이언트 요청시 http요청 메시지를 기반으로 Request,Response를 생성한다
- 요청한걸 처리하고 Response로 반환한다
쓰레드
- Servlet Container는 스레드가 호출한다

2. 정적 및 동적 리소스 이해
1). 개발자가 고민해야 할 리소스
(1). 정적리소스
- 고정된 html파일, css, js, 이미지, 영상 등을 제공하면 된다
- 그냥 visual code 등으로 작성되는 간단한 html이라고 생각
(2). 동적리소스
- 동적으로 필요한 html 파일을 생성해서 전달
- thymeleaf 등으로 동적으로 데이터넣어서 html생성
(3). http api
- html이 아니라 데이터를 전달, html이 아닌 모든 곳에서 처리
- 주로 3가지 -> 앱, 웹 클라이언트(자바스크립트 ajax), 서버 to 서버
2). SSR, CSR
(1). SSR 서버사이드 렌더링
- html 최종 결과를 서버에서 만들어서 웹 브라우저에 전달
- 주로 정적인 화면에 사용
- 관련기술 : jsp, thymeleaf
(2). CSR 클라이언트 사이드 렌더링
- html 결과를 자바스크립트를 사용해 웹 브라우저에 동적으로 생성해서 적용
- 주로 동적인 화면에 사용, 웹 환경을 마치 앱처럼 필요한 부분부분 변경할 수 있음
- 예) 구글지도, 구글 캘린더
- 관련기술: React, Vue.js
3). 스프링 관련기술
- Web Serlvet - Spring Mvc
- Web Reactive - Spring WebFlux
- 비동기 넌 블러킹 처리, 최소 쓰레드 최대 성능, 서블릿 기술 사용X
- 관계형 데이터베이스에서는 쓰기 힘들다
- redis나 mongoDb 이런데는 지원한다
View Template
- 프리마커, 벨로시티: 속도문제 해결, 다양한 기능
- 타임리프: 스프링 mvc와 강력한 기능 통합, 성능은 프리마커, 벨로시티가 더 빠름
3. 스프링 MVC 기본기능
1). 요청 매핑
@GetMapping("/mapping/users/{userId}/orders/{orderId}")
public String mappingPath(@PathVariable("userId") String userId, @PathVariable("orderId") String orderId) {
log.info("mappingPath userId={}",userId);
return "ok";
}
@GetMapping(value = "/mapping-param",params = "mode=debug")
public String mappingParam(){
log.info("mappingParam");
return "ok";
}
@GetMapping(value = "/mapping-param",headers = "mode=debug")
public String mappingHeader(){
log.info("mappingHeader");
return "ok";
}
@PostMapping(value = "/mapping-consume",consumes = "application/json")
public String mappingConsumes(){
log.info("mappingConsumes");
return "ok";
}
@PostMapping(value = "/mapping-produce",produces = "text/html")
public String mappingProduce(){
log.info("mappingProduce");
return "ok";
}
2). Http 요청- 기본, 헤더조회
@RequestMapping("/headers")
public String headers(HttpServletRequest request,
HttpServletResponse response,
HttpMethod httpMethod,
Locale locale,
@RequestHeader MultiValueMap<String, String> headerMap,
@RequestHeader("host") String host,
@CookieValue(value = "myCookie", required = false) String cookie) {
log.info("request={}", request);
log.info("response={}", response);
log.info("httpMethod={}", httpMethod);
log.info("locale={}", locale);
log.info("headerMap={}", headerMap);
log.info("header host={}", host);
log.info("myCookie={}", cookie);
return "ok";
}