초기 웹 서비스 시대에는 SOAP(Simple Object Access Protocol)이 API 통신의 표준처럼 사용됐다.
XML 기반의 프로토콜로, 엄격한 스키마와 헤더 구조, 다양한 기능 지원(WSDL, 메시지 보안 등) 덕분에 복잡한 시스템 간 연동에 유용했다.
근데 문제는 무겁고 복잡했다
이런 상황에서 등장한 것이 바로 REST(Representational State Transfer).
HTTP의 표준 메서드(GET, POST, PUT, DELETE 등)를 활용하고, JSON이나 XML 등 다양한 포맷을 사용할 수 있어 훨씬 가볍고 직관적이다.
| 항목 | SOAP | REST |
|---|---|---|
| 데이터 포맷 | XML 고정 | JSON, XML 등 자유 |
| 메시지 구조 | 복잡, 무겁다 | 간결, 직관적 |
| 확장성 | 다양한 기능 지원 | 단순한 CRUD 중심 |
| 사용성 | 학습 곡선 있음 | URI 기반으로 쉬움 |
[Client] → [DispatcherServlet] → [HandlerMapping] → [Controller]
→ [Return Object] → [HttpMessageConverter] → [Response Body] → [Client]
브라우저나 앱에서 GET /api/users 같은 요청을 보냄 → Spring Boot의 DispatcherServlet이 이를 받는다.
Spring은 내부적으로 HandlerMapping을 통해 어떤 컨트롤러가 이 요청을 처리해야 하는지 찾아낸다.
예를 들어 이런 코드가 있다면:
@RestController
@RequestMapping("/api/users")
public class UserController {
@GetMapping
public UserResponse getUser() {
return new UserResponse("채원", 25);
}
}
→ 해당 메서드가 실행되어 UserResponse 객체를 반환한다.
여기서 등장하는 게 바로 HttpMessageConverter다.
이 객체는 UserResponse 같은 자바 객체를 JSON 문자열로 바꿔주는 역할을 한다.
컨트롤러가 리턴값을 반환하면, DispatcherServlet이 View를 처리하는 대신 @ResponseBody가 있음을 인식하고
HttpMessageConverter를 통해 데이터를 직렬화하여 클라이언트에 전달한다.
직렬화(Serialization)란,
자바 객체 같은 메모리 속 데이터 구조를 → 텍스트나 바이트 형태로 바꾸는 과정이다.
예를 들어, 컨트롤러가 아래와 같은 객체를 리턴한다고 해보자:
new UserResponse("채원", 25)
이건 자바 객체라서 클라이언트(예: 브라우저, 모바일 앱)가 직접 이해할 수 없음.
그래서 이걸 JSON 같은 형식의 텍스트로 바꿔서 클라이언트가 이해할 수 있도록 한다.
최종적으로 JSON 문자열이 HTTP 응답 바디에 담겨서 클라이언트에 전달된다.
| 단계 | 설명 |
|---|---|
| 요청 수신 | DispatcherServlet이 HTTP 요청 수신 |
| 컨트롤러 매핑 | HandlerMapping → 컨트롤러 탐색 |
| 요청 처리 | @RestController의 메서드 실행 |
| 응답 변환 | HttpMessageConverter가 자바 객체 → JSON 변환 |
| 응답 반환 | 클라이언트에게 최종 응답 전달 |
@RestController와 HttpMessageConverter
개발자는 자바 객체만 신경 쓰면 되고, 나머지는 스프링이 다 처리한다.
볼드체로 강조한 부분이 눈에 띄네요!