http의 동작방식과 spring이 http를 지원해주는 방식
HTTP의 동작 방식
HTTP(Hypertext Transfer Protocol)는 클라이언트와 서버 간 데이터를 주고받기 위한 프로토콜이다. 기본적으로 요청(request)과 응답(response) 구조로 동작한다. 이 동작 방식을 단계별로 설명하면 다음과 같다.
- 클라이언트 요청: 웹 브라우저나 HTTP 클라이언트가 특정 리소스(URL)를 요청한다. 이 요청은 HTTP 메서드(GET, POST, PUT, DELETE 등)와 함께 전송된다.
- 서버 처리: 서버는 요청을 받아, 해당 요청을 처리할 수 있는 서버 애플리케이션이 요청을 해석하고 처리한다.
- 응답 반환: 서버가 요청을 처리한 후, 클라이언트에게 응답을 돌려준다. 응답에는 상태 코드(200 OK, 404 Not Found, 500 Internal Server Error 등), 헤더(header), 그리고 필요한 경우 데이터(body)가 포함된다.
- 클라이언트 처리: 클라이언트는 서버로부터 받은 응답을 처리하여 웹 페이지를 렌더링하거나 데이터를 사용한다.
HTTP 메서드
- GET: 리소스를 조회하기 위한 요청을 보낸다.
- POST: 리소스를 생성하거나 데이터를 서버로 전송하기 위한 요청을 보낸다.
- PUT: 기존 리소스를 수정하기 위한 요청을 보낸다.
- DELETE: 리소스를 삭제하기 위한 요청을 보낸다.
HTTP 상태 코드
- 2xx (성공): 요청이 성공적으로 처리되었음을 나타낸다 (ex: 200 OK).
- 4xx (클라이언트 오류): 클라이언트의 잘못된 요청을 나타낸다 (ex: 404 Not Found).
- 5xx (서버 오류): 서버에서 처리할 수 없는 오류가 발생했음을 나타낸다 (ex: 500 Internal Server Error).
Spring이 HTTP를 지원하는 방식
Spring은 Spring MVC를 통해 HTTP 요청과 응답을 처리할 수 있도록 지원한다. Spring MVC는 웹 애플리케이션에서 HTTP 프로토콜을 간단하게 다룰 수 있는 다양한 편의 기능을 제공한다.
DispatcherServlet
Spring의 HTTP 요청 처리는 DispatcherServlet을 통해 이루어진다. DispatcherServlet은 클라이언트로부터 들어오는 모든 HTTP 요청을 받아 이를 처리할 컨트롤러로 전달한다.
- 클라이언트가 HTTP 요청을 보낸다.
- DispatcherServlet이 요청을 가로채고, 알맞은 컨트롤러를 찾아 해당 요청을 전달한다.
- 컨트롤러는 비즈니스 로직을 처리한 후, View 또는 데이터를 반환한다.
- DispatcherServlet이 클라이언트에게 응답을 반환한다.
Controller와 Request Mapping
Spring에서는 @Controller와 @RequestMapping 어노테이션을 사용하여 특정 HTTP 요청을 처리하는 메서드를 정의한다.
@Controller
public class MyController {
@GetMapping("/hello")
public String hello() {
return "hello";
}
@PostMapping("/data")
public ResponseEntity<String> postData(@RequestBody String data) {
return ResponseEntity.ok("Data received: " + data);
}
}
/hello경로로 GET 요청이 들어오면 hello() 메서드가 호출된다./data경로로 POST 요청이 들어오면 postData() 메서드가 호출되어 데이터를 처리한다.
HTTP 요청 파라미터 처리
Spring은 HTTP 요청의 파라미터, 헤더, 본문 등을 쉽게 가져올 수 있는 어노테이션을 제공한다.
- @RequestParam: 쿼리 파라미터를 받아온다.
- @PathVariable: URL 경로에 포함된 변수를 받아온다.
- @RequestBody: HTTP 본문에 포함된 데이터를 객체로 변환하여 받아온다.
RestController와 REST API
Spring에서는 @RestController를 사용하여 RESTful 웹 서비스를 쉽게 구축한다. @RestController는 JSON 또는 XML 형식의 데이터를 반환하는 HTTP 엔드포인트를 만드는 데 사용된다.
@RestController
public class ApiController {
@GetMapping("/api/hello")
public String apiHello() {
return "Hello from API";
}
@PostMapping("/api/data")
public ResponseEntity<String> apiData(@RequestBody String data) {
return ResponseEntity.ok("Received: " + data);
}
}
HTTP 상태 코드 및 예외 처리
Spring은 ResponseEntity를 사용하여 HTTP 응답 코드, 헤더, 바디를 명시적으로 설정할 수 있다.
@GetMapping("/api/error")
public ResponseEntity<String> error() {
return new ResponseEntity<>("Error Occurred", HttpStatus.BAD_REQUEST);
또한, Spring은 @ExceptionHandler를 사용하여 전역 또는 특정 컨트롤러 내에서 발생하는 예외를 처리한다.
Reference
https://docs.spring.io/spring-framework/reference/integration/rest-clients.html