Spring에서 클라이언트와 서버 간에 데이터를 전송할 때, 주로 JSON 형태로 데이터를 주고받는 방식이 많이 사용됩니다. 이는 RESTful 웹 서비스 구현에서 가장 흔한 데이터 교환 형식이기 때문입니다. 클라이언트와 서버 사이에서 Spring이 데이터를 어떻게 처리하고 전송하는지 살펴보겠습니다.
1. Spring에서 데이터 전송 흐름
Spring에서는 클라이언트와 서버 간의 데이터 전송을 처리할 때, 다음과 같은 단계를 거칩니다:
1.1. 클라이언트 요청 (Request)
- 클라이언트는 서버에 HTTP 요청을 보냅니다. 이 요청은 주로 GET, POST, PUT, DELETE와 같은 HTTP 메서드를 사용합니다.
- 요청 데이터는 쿼리 파라미터, URL 경로 변수, HTTP 요청 본문(주로 JSON 형식)으로 전달됩니다.
1.2. Spring의 컨트롤러에서 요청 처리
- Spring에서는 컨트롤러를 통해 클라이언트 요청을 처리합니다. 컨트롤러는 요청을 받아들이고, 필요한 데이터 처리 로직을 수행한 후에 응답을 생성합니다.
@RestController
또는@Controller
+@ResponseBody
어노테이션을 사용하여 JSON 형식으로 데이터를 반환할 수 있습니다.
1.3. 데이터 직렬화 (Serialization)
- 서버에서 데이터를 클라이언트에 응답으로 보낼 때, Java 객체를 JSON 형식으로 직렬화하여 전송합니다.
- Spring은 내부적으로 Jackson 라이브러리를 사용하여 Java 객체를 JSON으로 변환합니다. Jackson은 기본적으로 Spring Boot에 내장되어 있어, 추가적인 설정 없이도 JSON 직렬화와 역직렬화를 처리합니다.
1.4. 클라이언트 응답 (Response)
- 컨트롤러에서 처리한 데이터는 JSON 형태로 변환되어 클라이언트에게 HTTP 응답으로 전송됩니다.
- 클라이언트는 서버로부터 받은 JSON 데이터를 파싱하여 화면에 출력하거나, 후속 로직에서 사용합니다.
2. Spring에서의 요청과 응답 처리
2.1. 클라이언트에서 서버로 데이터 전송
- 클라이언트가 서버로 데이터를 보낼 때, 주로 POST나 PUT 요청의 HTTP 본문(body)에 JSON 형식의 데이터를 담아 전송합니다.
- 서버는 이 데이터를 수신하고, JSON 데이터를 Java 객체로 역직렬화(Deserialization)하여 사용합니다.
// 클라이언트가 서버로 보내는 JSON 요청 본문 예시
{
"name": "John Doe",
"age": 30
}
서버에서 이 데이터를 받을 때는 @RequestBody
어노테이션을 사용하여 JSON 데이터를 Java 객체로 변환합니다.
2.2. 서버에서 클라이언트로 데이터 전송
- 서버는 요청을 처리한 후, 필요한 데이터를 Java 객체로 준비하고 이를 JSON 형식으로 직렬화하여 클라이언트로 응답합니다.
@RestController
public class UserController {
@GetMapping("/user/{id}")
public User getUserById(@PathVariable Long id) {
User user = userService.findById(id);
return user; // JSON 형식으로 자동 변환되어 응답
}
}
위의 getUserById
메서드는 User
객체를 반환합니다. 이 객체는 Jackson 라이브러리를 통해 자동으로 JSON 형식으로 변환되어 클라이언트에게 전달됩니다.
// 서버가 클라이언트로 보내는 JSON 응답 예시
{
"id": 1,
"name": "John Doe",
"age": 30
}
3. Spring에서 JSON 데이터를 다루는 주요 어노테이션
3.1. @RequestBody
- 클라이언트가 요청 본문에 담아 보내는 JSON 데이터를 Java 객체로 변환해줍니다.
@PostMapping("/user")
public ResponseEntity<String> createUser(@RequestBody User user) {
userService.save(user); // JSON 요청 데이터를 Java 객체로 변환하여 사용
return ResponseEntity.ok("User created");
}
3.2. @ResponseBody
- 메서드의 반환 값을 HTTP 응답 본문으로 보내고, 이를 JSON 형식으로 직렬화하여 클라이언트에게 전달합니다.
@RestController
는 자동으로@ResponseBody
를 적용하므로, 별도로 붙일 필요는 없습니다.
@GetMapping("/user/{id}")
public @ResponseBody User getUser(@PathVariable Long id) {
return userService.findById(id); // Java 객체를 JSON 형식으로 변환하여 응답
}
3.3. @PathVariable
, @RequestParam
- URL 경로 변수나 쿼리 파라미터로 전송된 데이터를 메서드 파라미터로 받는 데 사용됩니다.
@GetMapping("/user/{id}")
public User getUser(@PathVariable Long id) {
return userService.findById(id);
}
@GetMapping("/search")
public List<User> searchUser(@RequestParam String name) {
return userService.findByName(name);
}
4. Jackson 라이브러리를 통한 JSON 처리
Spring은 내부적으로 Jackson이라는 라이브러리를 사용하여 Java 객체와 JSON 간의 직렬화 및 역직렬화를 처리합니다.
- 직렬화(Serialization): Java 객체를 JSON 형식으로 변환하여 클라이언트에 전송.
- 역직렬화(Deserialization): 클라이언트로부터 받은 JSON 데이터를 Java 객체로 변환하여 서버에서 사용.
Jackson 커스터마이징:
- Jackson은 기본적으로 동작하지만, 필요할 경우 커스터마이징할 수 있습니다. 예를 들어, 특정 필드를 직렬화/역직렬화에서 제외하거나 포맷을 변경할 수 있습니다.
public class User {
private Long id;
private String name;
@JsonIgnore // 이 필드는 JSON으로 변환되지 않음
private String password;
}
5. Spring에서 JSON 전송의 유용성
5.1. 표준화된 데이터 교환 형식
JSON은 가볍고, 사람이 읽기 쉬우며 대부분의 프로그래밍 언어에서 쉽게 파싱 및 생성할 수 있는 형식입니다. 클라이언트와 서버 간에 데이터를 교환할 때 REST API를 통해 JSON을 사용하면, 서로 다른 플랫폼 간의 호환성이 높아집니다.
5.2. RESTful API와의 연계
Spring에서 RESTful 웹 서비스를 구현할 때, JSON은 가장 일반적인 데이터 전송 형식입니다. 클라이언트는 주로 JavaScript를 사용하는 웹 애플리케이션, 모바일 애플리케이션 또는 다른 서버가 될 수 있으며, 이들 간의 데이터 교환에 JSON이 유용합니다.
5.3. Jackson과 Spring의 통합
Spring은 Jackson과 깊이 통합되어 있어 별도의 설정 없이도 JSON 데이터를 쉽게 다룰 수 있습니다. 또한 필요에 따라 Jackson의 기능을 확장하거나 수정할 수 있어 유연한 데이터 처리가 가능합니다.
결론
Spring에서는 클라이언트와 서버 사이에서 데이터를 주고받을 때 주로 JSON 형식을 사용합니다. Spring은 Jackson 라이브러리를 통해 Java 객체와 JSON 간의 변환을 자동으로 처리하며, 클라이언트의 요청을 받아 Java 객체로 변환하고, 처리 후 다시 JSON 형태로 응답을 제공합니다. @RequestBody
, @ResponseBody
, @RestController
등의 어노테이션을 활용하여 클라이언트와의 데이터를 손쉽게 주고받을 수 있습니다.
'TIL > 스파르타 TIL' 카테고리의 다른 글
Spring의 IoC(제어의 역전)와 DI(의존성 주입) 이해하기 (0) | 2024.10.08 |
---|---|
[내일배움캠프] Spring 1차 숙제 (튜터님께 받은 피드백) (0) | 2024.10.08 |
[내일배움캠프] 본캠프 TIL Spring 입문(2) (0) | 2024.09.28 |
[내일배움캠프] 본캠프 TIL Spring 입문(1) (0) | 2024.09.27 |
[TIL] 스파르타코딩 2차 팀편성, 7일차 (0) | 2024.09.11 |