*이번 게시물은 다양한 블로그에서 소스를 가져왔습니다.
이번 글에선 Controller에서 사용되는 Get, Post 방식의 차이점과
@ModelAttribute, @ResponseBody, @RequestParam 과 같은 컨트롤러 영역에서 사용하는 어노테이션
그리고 컨트롤러 영역의 동작 과정 등에 대해 설명하며 Controller <> Client간의 교류에 대해 설명하겠다.
우선 Get 과 Post 방식의 근본적인 차이점에 대해 알아보자.
Get: 파라미터로 Model 사용. url로 정보가 노출된다.
Post: RedirectAttribute로 Http의 Body에 정보가 숨겨져서 전달된다.
이번엔 컨트롤러에서 데이터를 전달받는 다양한 방법에 대해 알아보자.
PathVariable
Ex)
Front 단에서 url에 특정 정보를 담아서 보내면, controller에서 뽑아서 쓸 수 있다.
Classescancel/10 -> 컨트롤러가 10을 추출해서 사용한다
@ModelAttribute Vs @ResponseBody VS @RequestParam
@RequestParam
Board라는 객체에서, index, writer, contents를 각각 따로 받는다. 만약 url에 이메일 정보, 혹은 게시물 번호 등 단일 데이터 정보가 들어있을 때 자주 쓰인다. 추가로, 파라미터와 다른이름의 변수 이름을 할당할 수 있다는 특징도 있다.
@RequestParam
1개의 HTTP 요청 파라미터를 받기 위해서 사용한다.
(HTTP 요청 파라미터를 @RequestParam이 쓰고있는 메서드의 변수로 Mapping해준다.)
@RequestParam은 필수여부가 true이기 때문에 기본적으로 해당 파라미터가 전송되어야 한다. (전송되지 않으면 400 Error가 발생한다) 반드시 필요한 변수가 아니라면 required의 값을 false로 설정할 수 있으며 해당 Parameter를 사용하지 않고 요청을 보낼 경우 default로 defaultValue 옵션을 통해 값을 설정할 수 있다.
만약 위의 Board 객체가 입력으로 들어온다면, index, writer, contents를 각각 따로 받아서 수행하거나, required를 false로 성정하는 등의 설정을 통해 필요한 정보만 받을 수 있다.
추가로, 파라미터와 다른이름의 변수 이름을 할당할 수 있다는 특징도 있다.
@Modelattribute
앞서 설명했듯이, @RequestParam으로 index, writer, contents 를 각각 받을 필요 없이,
DTO/VO와 같이 객체 전체로 받아 사용할 수 있다.
어떻게 이게 가능할까?
해당 어노테이션을 사용하면 Client가 전송하는 multipart/from-data 형태의 HTTP Body의 내용과 HTTP 파라미터 갑을 생성자 Or Setter를 통해 주입하기에 주입을 위한 Setter와 생성자가 있어야만 올바르게 동작한다.
또한 문제를 방지하기 위해 @ModelAttribute는 매핑시키는 파라미터의 타입이 생성자, Setter을 통해 주입이 될지 확인하는 것을 포함하는 다양한 검증을 추가적으로 진행하게 된다.
쉽게 요약하자면, 파라미터로 전달된 데이터를 전달 받는다.
@RequestBody
@ModelAttribute와 유사하게, 적절한 자바 객체를 받아올 수 있다.
그렇다면 어떤 차이점이 있을까?
@RequestBody는 클라이언트가 전송하는 JSON(application.json) 형태의 HTTP Body 내용을 "Java 객체" 로 변환시킨다.
@RequestBody로 받은 데이터는 MappingJackson2HttpMessageConverter를 통해 Java 객체로 변환되며 그렇기에
@ModelAttribute처럼 값을 주입하기 위한 생성자나, Setter가 필요 없다.
다만, 직렬화를 위한 기본 생성자는 필요하고, 데이터 바인딩을 위한 필드명을 알아내기 위해 Getter 이나 Setter 중 1개는 정의되어 있어야한다.
요약하자면, JSON, XML 등의 데이터를 Converter를 통해 Java 객체를 변환하는 것이다.
@RequestBody와 @ModelAttribute의 차이점이 처음에 많이 헷갈렸는데, 간단하게
@RequestBody는 JSON,XML등의 데이터를 받는 ajax요청을 처리할 때,
@ModelAttribute는 url 파라미터를 받아서 처리할 때 사용하면 된다.
+@
'Spring boot' 카테고리의 다른 글
[JPA 기본] Part1 (영속성 컨텍스트, 기본 매핑 ) (0) | 2023.03.08 |
---|---|
API 서버 구성과 JWT를 통한 인증, 인가 (1) | 2023.01.30 |
Spring 소셜 로그인 처리 [OAuth] (0) | 2023.01.26 |
Spring security란? (0) | 2023.01.25 |
자바 Stream 정리 [Stream, Map, Filtering, Sorted, Collect] (0) | 2023.01.15 |