BackEnd 학습/Spring Framework

Spring(스프링) - 스프링 MVC 기본기능

잉아당 2023. 6. 22. 19:19
728x90

로깅

  • 로깅 라이브러리를 통해서 콘솔에 로그를 출력
  • 로그 라이브러리는 Logback, Log4J 등이 있고 이를 통합한 인터페이스가 SLF4J 임
  • 구현체로 Logback 같은 라이브러리 사용
  • → 스프륑 부트에서 기본으로 제공
  • 로그 포멧
    • 시간, 로그 레벨, 프로세스 ID, 쓰레드 명, 클래스명, 로그 메시지
  • 로그 레벨
    • TRACE > DEBUG > INFO > WARN > ERROR
    • 기본 설정은 INFO
    • logging.level.[groupname].[artifactname] = [level 지정]
      • 프로젝트 단위 로깅 레벨 지정
  • log.debug(”debug log={}”, name) 으로 사용
    • 문자열끼리 + 를 하게 되면 사용하지 않아도 연산이 일어나게 되서 리소스 낭비를 하게 됨
  • @RestController
    • 반환 값으로 HTTP 메시지 바디에 바로 입력

요청 매핑

  • @RequstMapping은 method속성을 지정하지 않으면 모든 method를 허용 함
  • 각 메서드 어노테이션을 사용하는 것이 편리함
  • 경로 변수
    • @PathVariable 어노테이션을 사용해 경로의 변수를 파라미터로 사용할 수 있음
    • 경로 변수와 파라미터의 변수명이 동일하면 @PathVariable에 속성을 지정하지 않아도 됨
    • 다중 사용도 가능
  • params 속성을 이용해 해당 파라미터에 따라 매핑을 처리 할 수 있음
  • headers 속성을 이용해 해당 헤더 값에 따라 매핑을 처리 할 수 있음
  • consumes 속성을 이용해 컨텐트 타입에 따라 매핑을 처리 할 수 있음
  • produce 속성을 이용해 Accept 헤더 기반으로 매핑 처리를 할 수 있음

HTTP 요청 - 기본, 헤더 조회

  • HttpServletRequest
  • HttpServletResponse
  • HttpMethod
    • HTTP 메서드를 조회
    • org.springframework.http.HttpMethod
  • Locale : Locale 정보를 조회
  • @RequestHeader MultiValueMap<String, String> headerMap
    • 모든 HTTP 헤더를 MultiValueMap 형식으로 조회
    • MultiValueMap
      • 하나의 키에 여러가지 value를 받을 수 있음
  • @RequestHeader("host") String host
    • 특정 HTTP 헤더를 조회
    • 속성
      • 필수 값 여부: required
      • 기본 값 속성: defaultValue
  • @CookieValue(value = "myCookie", required = false) String cookie
    • 특정 쿠키를 조회
    • 속성필수 값 여부: required
      • 기본 값: defaultValue

HTTP 요청 파라미터 - 쿼리 파라미터, HTML Form

  • 요청 데이터를 보내는 방법
    • GET - 쿼리 파라미터
      • url의 쿼리 파라미터에 데이터를 포함해서 전달
    • POST - HTML Form
      • 메시지 바디에 쿼리 파라미터 형식으로 전달
    • HTTP message body
      • JSON으로 사용
      • HTTP API에서 사용
  • 쿼리 파라미터

HTTP 요청 파라미터 - @RequestParam

  • @RequestParam
    • 속성 값에 name을 지정하여 바인딩
    • 속성값을 주지 않고 쿼리 파라미터와 변수명을 맞춰주면 자동으로 바인딩
    • 단순 타입이면 @RequestParam 없이 파라미터와 변수명이 동일하면 자동으로 바인딩
    • required=(true or false) 속성으로 필수 여부를 지정할 수 있음
    • 기본타입에는 null 이 들어갈 수 없음
    • 쿼리 파라미터에 값을 주지않고 username= 으로 주게되면 빈값으로 들어가게 됨
    • defualtValue를 지정하면 값을 주지 않더라도 설정된 값이 들어가게 됨
      • 빈문자의 경우에도 defaultValue로 처리 됨
    • Map으로도 파라미터를 받을 수 있음
  • @ResponseBody
    • View 조회를 무시하고 HTTP message body에 직접 해당 내용 입력

HTTP 요청 파라미터 - @ModelAttribute

  • @ModelAttribute
    • 객체를 쉽게 바인딩 해 줌
    • 스프링에서는 해당 어노테이션이 있으면 해당 객체를 생성하고 요청 파라미터의 이름으로 객체의 프로퍼티를 찾아 setter를 호출해 바인딩 함
    • 해당 애노테이션을 사용하지 않아도 바이딩 가능
    • → 스프링에서는 단순 타입은 @RequstParma으로 처리하고 나머지는 @ModelAttribute로 처리
  • @Data
    • 해당 롬복 기능을 사용하게 되면 기본적으로 필요한 생성자, getter, setter 등을 만들어 줌
  • 프로퍼티
    • getXxx, setXxx → xxx
    • getter와 setter의 이름에서 추출한 것을 의미

HTTP 요청 메시지 - 단순 텍스트

  • HTTP message body에 데이터를 직접 담아서 요청
  • body에 데이터가 직접 넘오는 경우는 @RequestParam 혹은 @ModelAttribute 사용할 수 없음
  • HttpEntity
    • HTTP header, body 정보를 편리하게 조회
    • 메시지 바디 정보를 직접 조회
    • 요청 파라미터 조회랑 관계 없음
    • 응답에도 사용이 가능
      • 헤더 정보 포함 가능
      • view 조회 불가능
      • 메시지 바디 정보 직접 반환
    • RequestEntity
      • 요청에서 사용
    • ResponseEntity
      • HTTP 상태코드 설정 가능
  • @RequestBody
    • HTTP q바디 정로를 편리하게 조회 가능
    • 헤더 정보의 경우 @RequestHeader 사용
  • @ResponseBody
    • 응답 결과를 HTTP 메시지 바디에 직접 담아서 전달 가능

HTTP 요청 메시지 - JSON

  • @RequestBody
    • 직접 만든 객체를 지정할 수 있음
    • HTTP 메시지 컨버터가 HTTP 메시지 바디의 내용을 우리가 원하는 문자나 객체 등으로 변환
    • 생략하게 되면 @ModelAttribute로 인식하게 되어 메시지 바디가 아닌 요청 파라미터를 처리
  • 컨텐트 타입이 application/json이여야 JSON을 처리할 수 있는 HTTP 메시지 컨버터 실행
  • @RequestBody
    • JSON요청 → HTTP 메시지 컨버터 → 객체
  • @ResponseBody
    • 객체 → HTTP 메시지 컨버터 → JSON요청

응답 - 정적 리소스, 뷰 템플릿

  • 정적 리소스
    • /resources 안의 자원을 리소스로 제공
    • 정적 리소스는 그대로 제공
  • 뷰 템플릿 아용
    • 동적 HTML 제공
    • 뷰 템플릿을 거쳐서 HTML이 생성 되고 뷰가 응답을 만들어서 전달
    • String을 반환 할 때 @ResponseBody 가 있으면 문자 그대로 반환
  • HTTP 메시지 이용
    • JSON 같은 형태로 제공
    • @ResponseBody 사용하거나 HttpEntity를 사용하면 뷰템플릿이 아닌 HTTP 메시지 바디에 직접 응답 데이터 출력

HTTP 응답 - HTTP API, 메시지 바디에 직접 입력

  • JSON과 같은 형태로 메시지 바디에 데이터를 실어 보냄
  • @ResponseBody 어노테이션을 이용해 JSON으로 변환 되어서 반환
  • @RestController를 사용하면 @ResponseBody 전부 적용되어 JSON으로 변환 되어서 반환

HTTP 메시지 컨버터

  • @ResponseBody 및 HttpEntity의 경우 메시지 컨버터 적용
    • HTTP의 BODY에 문자 내용을 직접 반환
  • viewResolver 대신에 HttpMessageConverter 가 동작
    • 기본 문자처리: StringHttpMessageConverter
    • 기본 객체처리: MappingJackson2HttpMessageConverter
    • byte 처리 등등 기타 여러 HttpMessageConverter가 기본으로 등록되어 있음
  • HTTP 요청 데이터 읽기
    • 요청이 오고 컨트롤러에서 @RequestBody, HttpEntity 파라미터 사용
    • 메시지 컨버터가 메시지를 읽을 수 있는지 확인 하기 위해 canRead()를 호출
      • 대상 클래스 타입 지원 여부
      • Content-Type 미디어타입을 지원 여부
    • canRead() 조건을 만족하면 read()를 호출하여 객체 생성후 반환
  • HTTP 응답 데이터 생성
    • 컨트롤러에서 @ResponseBody, HttpEntity 로 값이 반환
    • 메시지 컨버터가 메시지를 읽을 수 있는지 확인 하기 위해 canWrite()를 호출
      • 대상 클래스 타입 지원 여부
      • Accept 미디어타입을 지원 여부
    • canWrite() 조건을 만족하면 write()를 호출해서 HTTP 응답 메시지 바디에 데이터를 생성

요청 매핑 핸들러 어댑터 구조

  • RequestMappingHandlerAdapter 동작 방식
    • RequestMapping 핸들러 어댑터 호출
    • ArgumentResolver가 다양한 파라미터를 컨트롤러가 필요로 하는 파라미터 값으로 생성
    • 파라미터 값이 모두 준비되면 컨트롤러 혼출하면서 값을 넘겨 줌
  • ArgumentResolver 동작 방식
    • ArgumentResolver의 supportsParameter()를 호출하여 해당 파라미터를 지원하는지 체크하고 resolverArgument()를 호출하여 실제 객체를 생성
  • ReturnValueHandler
    • ArgumentResolver와 비슷하며 응답 값을 변환하고 처리
  • HTTP 메시지 컨버터
    • 요청의 @RequestBody, HttpEntity의 경우 ArgumentReslover들이 HTTP 메시지 컨버터를 사용해 필요한 객체 생성
    • 응답의 @ResponseBody, HttpEntity의 경우 ReturnValueHandler가 HTTP 메시지 컨버터를 호출해서 응답 데이터 생성

 

 

출처 : https://www.inflearn.com/course/스프링-mvc-1

 

스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술 - 인프런 | 강의

웹 애플리케이션을 개발할 때 필요한 모든 웹 기술을 기초부터 이해하고, 완성할 수 있습니다. 스프링 MVC의 핵심 원리와 구조를 이해하고, 더 깊이있는 백엔드 개발자로 성장할 수 있습니다., -

www.inflearn.com