스프링 MVC 1편 - 스프링MVC 기본기능
스프링 MVC - 기본 기능
- @RestController @Controller
Controller에서의 String return은 viewName임. RestController는 String을 HTTP Message body에 바로 입력
- 전체 로그 레벨 설정(info가 기본)
application.properties → logging.level.root=info
- @PathVariable
경로 변수. URL에 ex){data} 로 입력하면 파라미터에 @RequestVariable(”data”) 로 사용 가능. 변수명이 같으면 생략 가능함 → @PathVariable data
최근 HTTP API는 리소스 경로에 식별자를 넣는 스타일을 선호함.
다중매핑 사용도 가능함.
- URI에 기능 추가
headers=”mode=debug”, params=”mode=debug”
미디어 타입 조건 매핑
헤더 → consumes = “application/json”
Accept → produces = “text/html”
- 헤더 조회 : 다양한 파라미터를 받을 수 있음(아래값들)
HttpServletRequest, HttpServletResponse, HttpMethod, Locale, @RequestHeader MultiValueMap<String, String>, @RequestHeader(”host”), @CookieValue(value = “~~”, required = boolean)
- @ResponseBody
응답값을 body 에 넣어서 리턴해줌. @Controller인 경우 .. method에 붙이면 뷰렌더 안함
- @RequestParam(name=””)
= request.getParameter() 와 같은 기능
변수명이 같으면 (name=””) 생략 가능
단순 타입은 어노테이션 선언도 생략 가능
required = boolean → 필수값 지정
defaultValue=”” → 요청파라미터가 null or empty일시 기본값 지정
파라미터를 맵으로도 조회 가능(map, multivaluemap)
- @Data : getter setter 자동생성
- @ModelAttribute
객체를 생성하고 프로퍼티를 찾아 setter를 호출해 바인딩해준다.
cf. property? 객체에 getUsername() 메서드가 있으면 객체는 username이라는 프로퍼티를 가지고있음. username 프로퍼티의 값을 변경하면 setUsername()이 호출됨
타입이 맞지 않으면 BindException이 호출된다. 객체명과는 맞지 않아도 되고 속성명만 맞으면 됨
@ModelAttribute 어노테이션 생략 가능
참고 : @RequestParam 도 생략 가능한데.. 단순 타입은 RequestParam으로 처리되지만 객체는 ModelAttribute로 지정됨
- HTTP message body에 데이터를 직접 담아서 요청
HTTP API에서 주로 사용.. ex)json(주로사용), xml, text
이 케이스엔 @RequestParam이나 @ModelAttribute는 사용 불가
HttpEntity : HTTP header, body 정보를 조회.. 메시지 바디 정보를 직접 조회함. 응답도 가능. view 조회는 하지않음. 상속받은 RequestEntity, responeseEntity도 있음.
RequestBody : HTTP 메시지 바디 정보를 조회… 헤더 정보가 필요하면 httpentity나 requestheader를 사용하면 된다. 어노테이션 생략 불가
+) ModelAttribute RequestParam은 파라미터를 찾아오고 RequestBody 는 바디 정보를 직접 조회하는 것임! 다름
- HTTP 응답
방법 : 정적 리소스, 뷰 템플릿(동적), HTTP 메시지
— 정적 리소스
스프링 부트는 다음 디렉토리의 정적 리소스를 제공함
/static, /public, /resources, /META-INF/resources
클래스패스의 시작경로는 src/main/resources
— 뷰 템플릿
뷰 템플릿을 거쳐 HTML이 생성되고 뷰가 응답을 만들어 전달.
기본 뷰 템플릿 경로 : src/main/resources/templates
- HTTP 메시지 컨버터
기본 문자 처리 : StringHttpMessageConverter
기본 객체 처리 : MappingJackson2HttpMessageConverter
스프링MVC는 아래 케이스에 적용함
요청 → @RequestBody, HttpEntity(RequestEntity)
응답 → @ResponseBody, HttpEntity(ResponseEntity)
@ResponseBody 사용시 viewResolver 대신 HttpMessageConverter가 동작하는 것
메시지 컨버터 우선순서(클래스 타입, content-type을 체크해 사용여부 결정함)
0 ByteArrayHttpMessageConverter : byte[], application/octet-stream(* / *)
1 StringHttpMessageConverter : String, text/plain(* / *)
2 MappingJackson2HttpMessageConvert : 객체 or HashMap, application/json
요청 매핑 핸들러 어뎁터 구조
- ArgumentResolver
어노테이션 기반의 컨트롤러는 다양한 파라미터를 사용할 수 있다. 이 파라미터를 유연하게 처리해주는것
HandlerMethodArgumentResolver인데 ArgumentResolver라고 줄여서 부름.
RequestMappingHandlerAdapter가 호출한다. 여기서 파라미터의 값(객체)를 생성하고 컨트롤러에 넘겨준다.
- ReturnValueHandler
응답하는 값을 유연하게 처리해줌
HandlerMehtodReturnValueHandler줄인 명칭
- HTTP 메시지 컨버터
DispatcherServlet → 핸들러 어댑터 → ArgumentResolver → HTTP 메시지 컨버터로 생성 → 핸들러(컨트롤러) → ReturnValueHandler → HTTP 메시지 컨버터로 생성 → 핸들러 어댑터로 반환
스프링은 위 3가지를 모두 인터페이스로 제공하기때문에 개발자가 확장하여 사용 가능하다.
Leave a comment