@ResponseBody가 적용된 메서드는 뷰 이름이 아니라 데이터를 직접 반환합니다. Spring은 이 데이터를 HTTP 응답 바디에 쓰기 위해 적절한 메시지 변환기를 사용합니다.
반환되는 객체는 JSON이나 XML 등의 형식으로 변환됩니다. 이는 주로 Jackson이나 Gson 같은 라이브러리를 통해 이루어집니다.
Copy code
@RestController
public class MyRestController {
@GetMapping("/hello")
public String hello() {
return "Hello, World!";
}
}
위 코드에서 @RestController는 @Controller와 @ResponseBody를 결합한 것으로, 메서드 hello()의 반환 값 "Hello, World!"는 HTTP 응답 바디에 직접 포함됩니다.
@ResponseBody와 @Controller 조합
@Controller와 함께 @ResponseBody를 사용하는 경우:
Copy code
@Controller
public class MyController {
@GetMapping("/hello")
@ResponseBody
public String hello() {
return "Hello, World!";
}
}
여기서 @ResponseBody는 메서드 수준에서 사용되어, hello() 메서드의 반환 값이 뷰 이름으로 해석되는 대신 HTTP 응답 바디에 직접 포함됩니다.
JSON 데이터 반환 예시
Copy code
@RestController
public class UserController {
@GetMapping("/user")
public User getUser() {
return new User("John", "Doe");
}
}
이 경우 User 객체가 JSON 형식으로 변환되어 클라이언트에게 응답됩니다. JSON 변환은 Jackson 라이브러리를 통해 자동으로 처리됩니다.
@RestController 사용
@RestController는 @ResponseBody의 편리한 형태로, 클래스 전체에 적용됩니다. 각 메서드에서 별도로 @ResponseBody를 지정할 필요가 없습니다.
Copy code
@RestController
@RequestMapping("/api")
public class ApiController {
@GetMapping("/message")
public String getMessage() {
return "Hello, World!";
}
@GetMapping("/user")
public User getUser() {
return new User("John", "Doe");
}
}
클라이언트가 HTTP 요청을 보냅니다.
Spring은 해당 요청을 처리하는 컨트롤러 메서드를 실행합니다.
메서드의 반환 값을 메시지 변환기(HttpMessageConverter)를 사용해 JSON, XML 등으로 변환합니다.
변환된 데이터를 HTTP 응답 바디에 포함시켜 클라이언트에게 반환합니다.
요약
REST(Representational State Transfer)는 웹 서비스를 설계하는 아키텍처 스타일로, HTTP 프로토콜을 기반으로 리소스를 정의하고 이를 CRUD(Create, Read, Update, Delete) 방식으로 조작하는 것을 의미합니다. RESTful은 REST 아키텍처 스타일을 따르는 웹 서비스를 의미합니다.
클라이언트-서버 아키텍처: 클라이언트와 서버가 분리되어 있어, 클라이언트는 사용자 인터페이스와 사용자 경험에 집중하고, 서버는 데이터 저장 및 비즈니스 로직을 처리합니다.
무상태(Stateless): 각 요청은 클라이언트의 상태를 서버에 저장하지 않고, 모든 요청은 독립적입니다. 클라이언트의 상태는 각 요청에 포함되어 전달됩니다.
캐시 가능(Cacheable): HTTP 응답은 캐시될 수 있어야 하며, 이를 통해 클라이언트는 서버와의 통신을 최소화하고 성능을 향상시킬 수 있습니다.
계층화된 시스템(Layered System): 클라이언트는 중간 서버와의 상호작용을 통해서도 데이터를 얻을 수 있으며, 이러한 계층은 보안, 로드 밸런싱 등을 제공합니다.
일관된 인터페이스(Uniform Interface): 리소스는 일관된 방식으로 접근되고 조작되어야 합니다. URI를 통해 리소스를 식별하고, HTTP 메서드를 통해 조작합니다.
리소스 기반: 리소스는 URI(Uniform Resource Identifier)를 통해 식별됩니다. 각 리소스는 고유한 URI를 가지며, 클라이언트는 이 URI를 통해 리소스에 접근합니다.
HTTP 메서드와 RESTful API
Copy code
@RestController
@RequestMapping("/api")
public class UserController {
@GetMapping("/users")
public List<User> getAllUsers() {
// 모든 사용자 목록을 반환합니다.
}
@GetMapping("/users/{id}")
public User getUserById(@PathVariable Long id) {
// ID로 사용자를 조회합니다.
}
@PostMapping("/users")
public User createUser(@RequestBody User user) {
// 새로운 사용자를 생성합니다.
}
@PutMapping("/users/{id}")
public User updateUser(@PathVariable Long id, @RequestBody User user) {
// 기존 사용자를 업데이트합니다.
}
@DeleteMapping("/users/{id}")
public void deleteUser(@PathVariable Long id) {
// 사용자를 삭제합니다.
}
}
요약