꾸준히하자아자

[Spring] JSON 이란? (+@RequestBody, @ResponseBody) 본문

Backend/Spring Boot

[Spring] JSON 이란? (+@RequestBody, @ResponseBody)

성장하고픈개발자 2023. 6. 23. 23:58
728x90
728x90

JSON

(JavaScript Object Notation)

  • 자바스크립트에서 객체를 표현하는 방법이지만 다양한 프로그래밍 언어에서 데이터를 주고 받기 위해 사용된다.
  • Spring에서는 주로 응답으로 XML이나 JSON형식을 사용한다.

이러한 형식의 코드를 예로 들 수 있다.

이 코드는 Request Body(요청 본문)에 담기는 값이다.

(회원가입을 할 때 사용할 수 있다.) - POST 방식

{
	"username":"mata",
	"email":"meta@nate.com",
	"password":"meta1234!"
}

 

이 코드는 Response Body(응답본문) 에 담기는 값이다.

{
	"success": true,
	"response": [
 		{
			"id": 1,
			"productName": "기본에 슬라이딩 지퍼백 크리스마스/플라워에디션 에디션외 주방용품 특가전",
			"description": "",
			"image": "/images/1.jpg",
			"price": 1000
 		},
 		{
			"id": 2,
			"productName": "[황금약단밤 골드]2022년산 햇밤 칼집밤700g외/군밤용/생율",
			"description": "",
			"image": "/images/2.jpg",
			"price": 2000
 		}
	 ]
}

 

{ } (중괄호) 를 통해 하나의 객체를 표현하며,

[] (대괄호) 는 배열을 뜻하고

내부에는 Key : Value 값들로 각 속성값을 정의하고 있으며,

Key 와 Value 는 : (콜론) 에 의해 구분되고

각각의 속성은 , (쉼표) 로 구분되어 진다.

 

그렇다면 간단한 코드를 예로 들어 Controller에서 JSON데이터를 주고 받아보자.

Controller에서 데이터를 받는 방법에는 여러가지가 있다.

그 중 파라미터를 객체로 받는 방법에는 @RequestBody 어노테이션을 사용하면 된다.

이후 JAVA Object를 JSON 데이터로 응답해주는 @ResponseBody를 사용해 응답을 해준다.

 

@PostMapping("/request")
public ResponseEntity postController(@RequestBody LoginForm loginForm) {
		exampleService.fakeAuthenticate(loginForm);
    return ResponseEntity.ok(HttpStatus.OK);
}

이 코드에서 @RequestBody를 통해 요청 본문에 담긴 JSON 데이터가 자동으로 LoginForm 객체로 변환된다.

@RequestParam
은 주로 GET 요청의 쿼리 매개변수를 추출할 때 사용됩니다.
@RequestBody
는 POST, PUT, PATCH 등의 요청 메서드에서 요청 본문에 포함된 데이터를 처리할 때 주로 사용됩니다.

 

이번엔 Controller에서 데이터를 반환해보자.

커스텀 된 Response object가 있다고 가정하자.

public class ResponseTransfer {
    private String text; 
    
    // standard getters/setters
}
@Controller
@RequestMapping("/post")
public class ExamplePostController {

    @Autowired
    ExampleService exampleService;

    @PostMapping("/response")
    @ResponseBody
    public ResponseTransfer postResponseController(@RequestBody LoginForm loginForm) {
        return new ResponseTransfer("Thanks For Posting!!!");
     }
}

여기서 @ResponseBodypostResponseController 메서드가 반환하는 이 응답 본문으로 전송되어야 함을 뜻한다.

 

postman와 같은 콘솔을 이용해서 확인해보면

{"text":"Thanks For Posting!!!"}

이러한 응답이 나오게 된다.

 

추가

Remember, we don't need to annotate the @RestController-annotated controllers with the @ResponseBody annotation since Spring does it by default.

@RestController 는 컨트롤러 클래스에 이 애노테이션을 추가하면 해당 클래스의 모든 핸들러 메서드가 기본적으로 @ResponseBody 동작을 갖게 됩니다.

메서드의 반환 값이 HTTP 응답의 본문으로 전송됩니다. 따라서 별도의 @ResponseBody 애노테이션을 사용하지 않아도 됩니다.

728x90
728x90