?
를 시작으로 보낼 수 있다. 추가 파라미터는 &
로 구분하면 된다.주로 웹 페이지에서 사용자가 입력한 데이터를 서버로 전송하는 데 사용된다
HTTP 메시지 바디에 쿼리 파라미터 형식으로 인코딩
되어 전달됩니다.
서버가 값을 받는 형식은 GET 메서드의 쿼리 파라미터 방식과 유사하게 key-value 쌍
으로 전달됩니다.
다만, POST 메서드를 사용할 경우, 데이터는 URL에 노출되지 않고 HTTP 메시지 바디에 포함되어 전송됩니다.
폼 데이터는 application/x-www-form-urlencoded
또는 multipart/form-data
형식으로 전송된다
JSON.parse()
: 일반 문자열도 객체화 됨객체 -> stringfy -> 문자열 -> Parse -> 객체
(1)Model : 비즈니스 로직을 실행하고 DB와의 상호작용을 담당한다. 그리고 필요한 데이터를 모델 객체에 저장하여 뷰와 컨트롤러로 전달한다.
@ModelAttribute, @Vaild 등 데이터의 유효성 검사를 지원
(2)View : 비즈니스 로직의 실행 결과를 전달받아 동적으로 화면을 만들거나 정직 리소스를 표시한다. 다양한 템플릿 엔진이 사용될 수 있다.
(3)Controller : 클라이언트 요청을 처리하고, 비즈니스 로직을 호출하며, 뷰를 선택하여 데이터를 전달한다.
클라이언트 요청 - 쓰레드 할당 - 서블릿을 호출
애플리케이션 코드 하나씩 순차적으로 실행, 한번에 하나의 코드라인만 실행하며 동시처리가 필요하면 쓰레드를 추가로 생성
WAS가 멀티쓰레드 부분을 처리해주므로 싱글쓰레드를 다루듯이 코딩
쓰레드풀
을 사용)해당하는 핸들러를 처리할 수 있는 어댑터 조회
어댑터를 실행하면서 handle메서드를 실행
ModelAndView 반환 : 핸들러가 반환하는 정보를 어댑터가 ModelAndView로 변환해서 Model에 담아 View의 논리이름
을 반환(html파일이름)
뷰 리졸버 호출
뷰 리졸버를 통해 랜더링 및 뷰 반환 : Dispacher Servlet이 뷰 이름을 리졸버에게 전달하고 뷰 리졸버는 미리 설정된 경로와 확장자를 가지고 물리이름으로 바꾼 후 뷰 객체를 반환
클래스레벨이 붙어있으면 빈으로 등록하면서 핸들러 매핑정보로 인식한다.
(매핑정보로 인식되는 것은 나중에 매핑이 필요할 때 서블릿이 탐색을 함)
View를 반환
하기 위해 사용 , service에서 필요한 값이 DB에 있는지 DAO를 통해 확인을 하고 값의 유무와 결과에 따라 어떤 view를 보여줄 것인지 선택JOSN형태의 문자
로 반환되어 나옴파라미터이름
”, required = ) 타입
변수명
(required=true, false)
: true가 기본값, false인 경우 값을 입력하지 않으면 null이 들어감(->int 등 기본형인 경우 Integer 등 객체형으로 바꾸어 주어야 null이 들어갈 수 있음)defaultValue = " "
) : 요청파라미터로 null이 아닌 아무 값도 넘어오지 않았을 때와 빈문자인 경우에 들어갈 기본값@RequestParam, @ModelAttribute, @PathVriable 모두 스프링이 자동으로 형변환을 해줌
파라미터를 Map에 저장해두고 get으로 가져올 수도 있음(Map<String,Object> ParamMap)
@ModelAttribute가 붙은 객체를 자동으로 생성
생성된 객체에 http요청 파라미터 또는 입력폼에서 넘어온 값을 객체의 속성과 자동으로 바인딩
(파라미터 이름과 객체 or 객체안의 객체의 속성이름이 동일한 것끼리 바인딩)하고 setter를 호출해 세팅 (set이 없으면 값이 설정되지 않고 데이터 타입도 맞아야함)
바인딩 된 값이 설정된 객체가 자동으로 Model객체에 추가되고 뷰까지 전달됨
(Model파라미터도 필요없음, model.attribute를 자동으로 실행)
(검증오류가 발생했을 때, 입력폼에 값이 그대로 남아있는 이유는 값이 입력된 객체가 뷰로 넘어갔기 때문)
@ModelAttribute(“뷰에 전달할 객체의 이름”) 을 생략하면 객체의 클래스명의 첫글자를 소문자로 바꾼 이름이 자동으로 들어가서 전달됨(ex Item -> “item”)
->해당 객체의 이름으로 뷰에서 활용됨(th:object=“${..}”)
@ModelAttribute까지도 생략이 가능하다. (추천하지는 않음)
consumes
: HTTP 요청의 Content-Type 헤더를 기반으로 미디어 타입을 매핑한다. 클라이언트가 서버에 요청값을 보낼 때, 해당 메시지의 데이터타입
ex) @PostMapping(Url = " " , consume = "application/json") -> Http요청의 Content-Type 헤더타입이 json인 경우에만 해당 url로 메서드를 호출가능(만약 맞지 않으면 HTTP 415 상태코드 반환)
produces
: HTTP 요청의 Accept 헤더를 기반으로 미디어 타입으로 매핑한다 , 서버가 클라이언트에게 응답값을 보낼 때, 해당 메시지의 데이터타입
만약 맞지 않으면 HTTP 406 상태코드(Not Acceptable)을 반환
Http메시지바디를 통해 직접 데이터가 넘어오는 경우에는 @RequestParam, @ModelAttribute를 사용할 수 없다(바이트코드로 넘어옴) @RequestParam, @ModelAttribute는 요청파라미터를 조회하는 기능임
HttpEntity<>를 상속 받은 RequestEntity<>, ResponseEntity<>가 있음
@RequestBody
HTTP 상태 코드
설정 가능, 응답에서 사용 -> 메서드레벨에 @ResponseBody
@RequestBody
HTTP 메시지 바디를 직접 읽음: HTTP 요청의 바디 데이터를 읽어옵니다.
HttpMessageConverter를 사용한 변환: HttpMessageConverter를 통해 JSON 또는 XML 데이터를 자바 객체로 변환합니다.
파라미터: 이 애노테이션이 붙은 파라미터는 HTTP 메시지 바디의 내용을 읽어와서 해당 타입의 자바 객체로 변환됩니다. 그리고 매핑된 메서드 파라미터로 전달됩니다
Content-Type: 클라이언트가 요청할 때 Content-Type을 application/json 등으로 설정해야 합니다.
비동기 처리: 주로 비동기 요청에서 사용됩니다.
-> @RequestBody는 생략불가능(생략하면 @ModelAttribute가 적용되어 요청파라미터로 처리됨
->이 어노테이션이 붙은 파라미터에는 Http 바디의 문자가 그대로 전달된다
@PostMapping("/example")
public ResponseEntity<ExampleResponse> exampleMethod(@RequestBody ExampleRequest request) {
// request는 HTTP 바디의 JSON 데이터를 자바 객체로 변환한 것
return ResponseEntity.ok(new ExampleResponse());
}
}
클라이언트가 폼에 데이터를 입력하고 JSON 형식으로 서버에 전송합니다. (자바스크립트나 자바의 라이브러리를 사용해서 JSON 형식으로 변환)
컨트롤러 메서드는 @RequestBody를 사용하여 요청 바디의 JSON 데이터를 자바 객체로 변환합니다. (HttpMessageConverter 사용)
서비스 계층에서 회원가입 비즈니스 로직을 처리합니다.
return값이 문자로 반환됨(retuen View x)
, 전체 객체단위로 적용되므로 컨버터 작동이 성공해서 객체가 만들어져야 다음 단계로 넘어갈 수 있음@RequestPart를 사용할 때, 파일 업로드를 처리할 경우 MultipartFile 타입의 매개변수를 선언할 수 있습니다.
이 경우, Spring MVC는 MultipartResolver
를 통해 HTTP 요청의 파일 파트를 처리합니다. MultipartResolver는 파일 업로드를 위한 전용 핸들러로, 들어온 파일을 MultipartFile 객체로 변환하여 매개변수로 전달합니다.
@RequestPart를 사용하여 JSON 데이터와 같은 다른 타입의 파트를 처리할 때는 HttpMessageConverter가 사용됩니다. HttpMessageConverter
는 요청 본문에서 JSON 데이터를 추출하고 이를 Java 객체로 변환하는 역할을 합니다. 이 경우, JSON 데이터는 @RequestPart에 지정된 매개변수 타입으로 변환됩니다.
redirect:/url
: 반복적으로 POST가 호출되는 상황을 방지, post를 처리하는 컨트롤러와 redirect되어 들어온 url을 get방식으로 처리하는 컨트롤러 2개가 작동한다.
(1) post 방식으로 데이터처리를 요청하면 controller A에서 데이터를 처리하고 브라우저에는 다른 주소로 redirect응답
(2) 브라우저는 이동해야하는 redirect 주소를 받고 get방식으로 해당 url을 호출
(3) controller B가 get방식으로 데이터를 처리하고 응답메시지 전송
RedirectAttributes: 그냥 redirect을 하면 기존의 요청데이터가 다 사라지는데 기존의 데이터를 다 살리면서 redirect하고 싶으면 RedirectAttributes를 사용한다.
(1) addAttribute()
: 리다이렉트할 URL에 쿼리스트링으로 데이터가 넘어감
(2) addFlashAttribute
: 일회용으로만 뷰에 데이터를 전달하고 삭제되는 값을 지정(새로고침하면 값이 사라짐), addFlashAttribute가 addAttribute를 호출하면 세션에 저장했다가 redirect 되고나서 세션에 저장된 값을 가지고 옴
@PostMapping("/add")
public String addItemV6(Item item, RedirectAttributes redirectAttributes) {
Item savedItem = itemRepository.save(item);
redirectAttributes.addAttribute("itemId", savedItem.getId());
redirectAttributes.addAttribute("status", true);
return "redirect:/basic/items/{itemId}";
}
@RequestMapping("/members")
return "redirect:/members/login";
=> localhost:/members/login
return "redirect:members/login";
=> localhost:/members/members/login