REST?
REST란 자원을 이름으로 구분하여 해당 자원의 상태를 주고 받는 것을 의미
즉, HTTP URI를 통해 자원을 명시하고 HTTP Method를 통해 자원에 대한 CRUD를 적용하는 것을 의미
따라서 REST 아키텍쳐의 원칙을 지켜 구현한 API를 제공하는 서비스는 RestFul하다고 할 수 있다.
REST API URI 설계 규칙
- 슬래시(/)는계층 관계를 나타내는데 사용.
- URI 마지막엔 슬래시(/)를 포함하지 않는다.
- 하이픈(-)은 URI 가독성을 높이는데 사용.
- 밑줄(_)은 URI에 사용하지 않는다.
- URI에는 소문자가 적합하다.
- 파일확장자는 URI에 포함하지 않는다.
RestTemplate?
스프링에서 제공하는 HTTP 통신을 쉽게 사용하기 위한 템플릿
RestTemplate의 특징
- HTTP 서버와의 통신을 단순화하고 REST 원칙을 지킴
- 동기방식으로 처리, 비동기 방식인 AsyncRestTemplate이 있음
RestTemplate의 주요 메소드
METHOD | HTTP | COMMENT |
getForObject | GET | GET 형식으로 요청하여 객체로 결과를 받음 |
getforEntity | GET | GET 형식으로 요청하여 ResponseEntity로 결과를 받음 |
postForObject | POST | POST 형식으로 요청하여 객체로 결과를 받음 |
postForEntity | POST | POST 형식으로 요청하여 ResponseEntity로 결과를 받음 |
delete | DELETE | DELETE 형식으로 요청 |
put | PUT | PUT 형식으로 요청 |
patchForObject | PATCH | PATCH 형식으로 요청 |
exchange | any | HTTP 헤더를 생성하여 추가할 수 있고 어떤 형식에서도 사용 가능 |
RestTemplate 예제
먼저 어떤 URI 경로로 API를 호출할 것인지 정의해야한다.
60LINE~64LINE
RestTemplate을 통해 HTTP 통신을 하기 위해선 URI 객체 또는 URI 문자열(String)이 필요하다.
이 예제에선 URI 객체를 만들어 RestTemplate에 사용하였다.
UriComponentsBuilder는 URI에 대한 여러 세팅을 해줄 수 있는 클래스이다.
fromUriString메소드로 위와 같이 "http://localhost:8080"형태로 지정하게되면
이 UriComponentsBuilder가 정규식을 이용해 해당 주소의 scheme, host, port 등 에 대한 정보들이 자동으로 지정된다.
(path도 식별 가능하나 사용 예를 위해 .path() 메소드를 별도로 사용했다.)
이 밖에도 pathVairable, queryParam 등 다양한 URI 세팅이 가능하다.
UriComponetnsBuilder의 build()메소드는 UriComponents 형태로 변환이 되는데 .toUri()메소드를 사용하게 되면 URI객체로도 변환이 가능하다.
66LINE~67LINE
RestTemplate을 사용하기 위해 RestTemplate 인스턴스를 생성하고
restTemplate.getForEntity로 HTTP 통신 응답 데이터를 가져왔다.
getForEntity의 매개변수로는 URI객체, 응답받을 데이터의 타입을 지정하면된다.
ResponseEntity<T>?
ResponseEntity는 HTTPRequest에 대한 응답 정보인 상태코드, 헤더, 응답 데이터들이 담겨있는 객체이며,
HttpEntity를 상속받은 구현체이다.
ResponseEntity에 타입 파라미터를 지정하게 되면 응답 데이터에 대한 타입을 지정할 수 있다.
예)ResponseEntity<String>의 응답 데이터는 String 형태로 저장됨.
간단한 예제이기 때문에 주요 코드는 이정도로 끝이다.
저 경로로 요청했을 때 해당 서버는 단순 String 형태의 문자열을 리턴하는 처리를한다.
RESULT
요청 성공
API 서버에 연결하지 못하여 ConnectException 발생 시
'Spring, Spring Boot' 카테고리의 다른 글
[Spring Boot] JUnit4 + Mock Test (0) | 2022.05.16 |
---|---|
[Spring Boot] HTTP 통신을 위한 OpenFeign (0) | 2022.05.08 |
[Spring Boot] MyBatis typeAlias 지정하기 (0) | 2022.04.01 |
[Spring Boot] 웹 페이징(Paging) 구현(2) (0) | 2022.03.28 |
[Spring Boot] Thymeleaf 템플릿 사용하여 공통 레이아웃 구성하기 (0) | 2022.03.24 |