서버 간 통신의 정석: RestTemplate 완벽 가이드
GET, POST부터 만능 도구 exchange 정리
1. RestTemplate: 서버를 위한 브라우저
우리가 브라우저를 통해 웹사이트에 접속하듯, 서버가 다른 서버에 HTTP 요청을 보낼 때 사용하는 도구.
동기(Blocking) 방식으로 동작
동기 방식이란?
-> 앞선 작업이 끝날 때 까지 다음 작업이 대기해야 하는 통신 방식을 의미 함.
-> 요청을 보낸 클라이언트는 서버로 응답이 올 때 까지 아무것도 하지 못하는 블로킹 상태가 된다.
장단점은 : 흐름을 파악하기 쉽고 설계가 간단하지만 , 응답이 지연될 경우 전체 시스템의 효율이 떨어진다.
RESTful 원칙이란?
RESTful 원칙이란 월드 와이드 웹(WWW)과 같은 분산 하이퍼미디어 시스템을 위한 소프트웨어 아키텍처 형식인 REST(Representational State Transfer)를 제대로 준수하는 방식을 의미한다.
핵심은 자원(Resource)을 이름으로 구분하여 해당 자원의 상태를 주고받는 것이며, 주요 원칙은 다음과 같습니다.
핵심 6대 원칙
- Uniform Interface (일관된 인터페이스): HTTP 표준만 맞다면 안드로이드, iOS, 웹 어디서든 동일한 인터페이스로 자원을 사용할 수 있어야 합니다.
- Stateless (무상태성): 서버는 클라이언트의 상태(세션, 로그인 정보 등)를 별도로 저장하지 않습니다. 각 요청은 그 자체로 필요한 모든 정보를 포함해야 합니다.
- Caching (캐시 가능): HTTP 표준 프로토콜을 그대로 사용하므로, 캐싱 기능을 적용해 서버의 부하를 줄이고 성능을 높일 수 있습니다.
- Client-Server Architecture (클라이언트-서버 구조): 자원을 가진 서버와 이를 요청하는 클라이언트가 독립적으로 분리되어 있어야 합니다.
- Layered System (계층화 시스템): 클라이언트는 서버의 중간 매체(프록시, 게이트웨이 등) 유무를 알 수 없으며, 다중 계층으로 구성될 수 있습니다.
- Code on Demand (선택적 사항): 서버가 클라이언트에 실행 가능한 코드를 전송하여 기능을 확장할 수 있다.
요약을 하자면 RESTful 하다는 것은 URL 을 통해 무엇을 제어할지 명시하고 HTTP 메소드(GET,POSH,PUT,DELETE)를 통해 어떻게 할지를 규약에 맞게 사용하는 것을 말하는거 같다.
2. GET과 POST, 목적에 맞는 메서드 선택
① 데이터 조회를 위한 GET (getForEntity)
단순히 바디 데이터만 필요하다면 getForObject를 쓰지만, getForEntity를 사용하는 것이 좋음
상태 코드와 헤더 정보까지 포함된 ResponseEntity를 반환받아 더 정교한 처리가 가능
// URI 구성 후 데이터 조회
URI uri = UriComponentsBuilder.fromUriString("http://localhost:8080")
.path("/api/items/{id}")
.encode().buildAndExpand(1L).toUri();
ResponseEntity<ItemDto> response = restTemplate.getForEntity(uri, ItemDto.class);
② 데이터 생성을 위한 POST (postForEntity)
서버로 데이터를 보낼 때는 요청 바디(Request Body)를 실어 보냅니다. 객체를 넘기면 RestTemplate이 내부적으로 JSON으로 변환하여 전송합니다.
3. 모든 상황에 대처하는 exchange 메서드
현업에서는 특정 HTTP 메서드(PUT, DELETE)를 쓰거나 커스텀 헤더(API Key, 인증 토큰 등)를 붙여야 할 때가 많다. 이때는 exchange가 필수
// 헤더에 인증 정보 추가 및 요청
RequestEntity<UserDto> requestEntity = RequestEntity
.post(uri)
.header("Authorization", "Bearer token")
.body(userDto);
ResponseEntity<String> response = restTemplate.exchange(requestEntity, String.class);
4. 실무 포인트
- UriComponentsBuilder 활용: URL을 문자열 더하기(+)로 만들면 오타나 인코딩 문제가 발생하기 쉽습니다. 반드시 빌더 패턴을 사용하여 가독성과 안정성을 챙겨야 함.
- DTO 매핑: 응답받는 JSON 구조에 딱 맞는 DTO를 설계하는 능력이 중요.
String.class로 통째로 받기보다 타입 안정성을 위해 구체적인 DTO를 정의하는게 좋다고 한다.
정리
RestTemplate은 스프링 서버 간 통신의 기초
최근에는 비동기 방식인 WebClient가 떠오르고 있지만, 여전히 수많은 실무 현장에서 사용되므로 각 메서드의 특징을 정확히 알고 상황에 맞게 골라 쓰는 능력을 기르는 것이 중요한거 같다
'Spring > spring 숙련' 카테고리의 다른 글
| JPA Entity 연관 관계 (0) | 2026.04.10 |
|---|---|
| Vaildation (1) | 2026.04.09 |
| Session/Cookie/Filter/Listener (0) | 2026.04.09 |
| 쿠키(Cookie)와 세션(Session) (1) | 2026.04.09 |
| 인증(Authentication) vs 인가(Authorization) (0) | 2026.04.09 |