스프링 MVC 1

김파란·2024년 10월 1일

Spring

목록 보기
7/10

1. 웹 애플리케이션 이해

  • 모든 것은 HTTP 프로토콜 기반으로 동작하게 된다
  • HTML, TEXT, JSON 등 거의 모든 형태의 데이터 전송한다

1). 웹 서버

  • Web Server
  • HTTP 기반으로 동작
  • 정적 리소스 제공, 기타 부가 기능
    • HTML, CSS, JS, 이미지, 영상
  • 예) 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";
    }
    // 특정 파라미터가 있어야만 호출된다 지금은 ?model=debug 라는 파라미터
    @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";
    }
    /**
     * Content-Type 헤더기반 추가 매핑 Media Type
     * MediaType.APPLICATION_JSON_VALUE
     * 클라이언트가 Post할때 Content-Type을 확인
     * 서버입장에서 요청하는 타입이 application일때 동작한다, 내가 소비한다
     */

    @PostMapping(value = "/mapping-consume",consumes = "application/json")
    public String mappingConsumes(){
        log.info("mappingConsumes");
        return "ok";
    }
    /**
     * Accept 헤더 기반 Media Type
     * Accept, produce, 내가 공급한다
     */
    @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";
    }

0개의 댓글