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에서 사용
- GET - 쿼리 파라미터
- 쿼리 파라미터
- GET
- POST
- body에 userId=hello&age=20 으로 닮김
- GET, POST 모두 형식이 같기 때문에 요청 파라미터 조회를 통해 구분없이 조회가 가능
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