Spring boot

Spring Boot 컨트롤러와 Client간의 관계 정리

코앤미 2023. 1. 27. 16:58

*이번 게시물은 다양한 블로그에서 소스를 가져왔습니다.

 

이번 글에선 Controller에서 사용되는 Get, Post 방식의 차이점과

@ModelAttribute, @ResponseBody, @RequestParam 과 같은 컨트롤러 영역에서 사용하는 어노테이션

그리고 컨트롤러 영역의 동작 과정 등에 대해 설명하며 Controller <> Client간의 교류에 대해 설명하겠다.

 

 

우선 Get 과 Post 방식의 근본적인 차이점에 대해 알아보자.

https://hon99oo.github.io/

 

 

Get: 파라미터로 Model 사용. url 정보가 노출된다.

Post: RedirectAttribute Http의 Body에 정보가 숨겨져서 전달된다.

 

 

이번엔 컨트롤러에서 데이터를 전달받는 다양한 방법에 대해 알아보자.

출처: https://dahliachoi.tistory.com

 

 

출처: https://dahliachoi.tistory.com

 

 

출처: https://dahliachoi.tistory.com

 

출처: https://dahliachoi.tistory.com

 

PathVariable 

 

Ex) 

 

Front 단에서 url에 특정 정보를 담아서 보내면, controller에서 뽑아서 쓸 수 있다.

Classescancel/10   -> 컨트롤러가 10을 추출해서 사용한다 

 

 

@ModelAttribute Vs @ResponseBody VS @RequestParam

출처:&nbsp;https://mangkyu.tistory.com/

 

출처:&nbsp;https://mangkyu.tistory.com/

 

@RequestParam

Board라는 객체에서, index, writer, contents를 각각 따로 받는다. 만약 url에 이메일 정보, 혹은 게시물 번호 등 단일 데이터 정보가 들어있을 때 자주 쓰인다. 추가로, 파라미터와 다른이름의 변수 이름을 할당할 수 있다는 특징도 있다.

예를 들어, "name"이라는 명칭으로 url에서 넘어온 정보를 "Writer" 이라는 별칭으로 저장할 수 있다.

 

@RequestParam

 1개의 HTTP 요청 파라미터를 받기 위해서 사용한다.

(HTTP 요청 파라미터를 @RequestParam이 쓰고있는 메서드의 변수로 Mapping해준다.)

@RequestParam은 필수여부가 true이기 때문에 기본적으로  해당 파라미터가 전송되어야 한다. (전송되지 않으면 400 Error가 발생한다) 반드시 필요한 변수가 아니라면 required의 값을 false로 설정할 수 있으며 해당 Parameter를 사용하지 않고 요청을 보낼 경우 default로 defaultValue 옵션을 통해 값을 설정할 수 있다.

 

만약 위의 Board 객체가 입력으로 들어온다면, index, writer, contents를 각각 따로 받아서 수행하거나,  required를 false로 성정하는 등의 설정을 통해 필요한 정보만 받을 수 있다.

추가로, 파라미터와 다른이름의 변수 이름을 할당할 수 있다는 특징도 있다.

예를 들어, "name"이라는 명칭으로 url에서 넘어온 정보를 "Writer" 이라는 별칭으로 저장할 수 있다.

 

@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 파라미터를 받아서 처리할 때 사용하면 된다.

 

 

 

+@