본문 바로가기

공부/TIL

23.11.28

RestTemplate를 이용해 서버와 서버간의 통신을 배웠다. 아니 사실 저번에 배웠는데 당시 프로젝트에 적용하는 파트가 아니었기 때문에 조금 정리가 되지 않은 상태. 이제 어느정도 스프링에 적응한 상태에서 다시 들어보니 더 이해가 쉬웠다. RestTemplate을 통해 서버간의 통신을 했다. 다시 공부를 해보니 서버간의 통신은 RestTemplate의 하나의 기능이다.

 

[RestTemplate]

RestTemplate은 HTTP 통신을 위한 도구. RESTful API 웹서비스와의 상호작용을 위해 외부 도메인에서 데이터를 가져오거나 전송할 때 사용되는 스프링 프레임워크의 클래스. HTTP 메서드(GET, POST, PUT, DELETE 등)을 사용하여 원격 서버와 '동기식 방식'으로 JSON, XML 등의 다양한 데이터 형식으로 통신함.

 

RestTemplate의 특징

1. 동기식 요청 & 블로킹 요청 // 비동기식 요청 & 논블로킹 요청

 RestTemplate은 기본적으로 '동기식 요청' 처리를 수행하며 요청을 보내고 응답을 받을 때 까지 블로킹 된다. 

 어허... 동기식은 그럼 무엇이냐? 동기식 통신 및 동기식 프로그래밍이란 요청이 오면 응답이 올 때 까지 가만히 대기하는 것. 그렇다면? 비동기 식은? 요청을 하고, 응답이 오기 전임에도 새로운 요청이 가능한 것!

그렇다면 동기식 요청 & 블로킹 요청이란? 요청이 오고, 응답이 오기 전까지 블로킹을 걸어서 아무 요청을 받지 않는다.

아 이래서 처음 RestTemplate을 생성할 때 5초의 대기시간을 걸었구나. 요청에 대한 응답이 무한할 수도 있기 때문에! 동기식이니까!

 

2. HTTP 요청 및 응답에 대한 다양한 메서드 제공

 RESTful한 요청들 GET, POST, PUT 등여러 메서드를 제공한다. 이를 스프링에서 제공한다. 각 메서드는 반환을 어떻게 받을지도 정해져 있다. getForObject()같은 경우는 하나의 객체를 반환. gotForEntity()는 ResponseEntity로 반환. 이렇게 HTTP 요청을 스프링에서 할 수 있게 된다.

 

3. HTTP 요청 및 응답을 자동으로 변환하고 역직렬화한다.

HTTP 요청 및 응답을 자동으로 변환하고 역질렬화 하는 기능을 제공. 이를 위해 RestTemplate은 기본적으로 MessageConverter를 사용.

그렇다면 "직렬화"란? 

자바 객체를 외부 저장소에 저장하거나 네트워크를 통해 전송하기 위해 객체를 데이터 스트림으로 변환하는 과정.

"역직렬화"란?

데이터 스트림으로 부터 자바 객체로 재구성하는 과정.데이터 스트림에서 읽은 값들이 객체의 필드 값으로 설정된다.이떄 어떤 객체로 변환돼야 할지 알려줘야 한다.

MessageConverter는 요청 및 응답 바디의 데이터 형식을 변환한다. exchange()메서드를 이용해 엔티티를 dto로 변환해줄 수 있다.

 

4. HTTP 요청 및 응답을 다양한 형식으로 처리할 수 있다.

JSON, XML 및 바이너리 데이터 형식과 같은 데이터 형식으로 응답 처리를 할 수 있고, HTTP 요청 및 응답의 부분을 추출하거나 수정할 수 있다. 포스트맨에서 요청을 보낼 때 헤더에 Content-Type을 볼 수 있었다. 뒤에 값으로 application/json이 붙어있었는데 이는 JSON형태로 변환해서 보낸다는 뜻이였다.이것을 RestTemplate을 이용해서 할 수 있다. 

 

5. HTTP 요청에 대한 요청 헤더 및 쿼리 매개변수를 설정 할 수 있다.

요청 헤더는 RestTemplate의 HttpHeaders 클래스를 사용하여 설정할 수 있다. HttpHeaders 클래스의 add() 메서드를 사용하여 요청 헤더에 새 항목을 추가할 수 있다. 쿼리 매개변수는 RestTemplate의 exchange()메서드를 호출할 때 UriComponentsBuilders를 사용하여 설정 가능하다. UriComponentsBuilders의 queryPara() 메서드를 사용하면 쿼리 매개변수를 추가 할 수 있다. 

 

와 진짜 이거까지 보니까 이거 대단한 클래스다. 지금까지 이거 적다보니까 큰 깨달음을 얻었다. 5번쓰기 전까지 내 가장 큰 의문은 이것이다. 아니 그냥 이거 클라이언트가 요청 넣을때 하면 되는데 왜 씀?????

왜쓰냐면? 서버에서 서버간의 통신 때 써야 되니까!!! 위에서 말했듯 나는 이 RestTemplate을 서버간의 통신에서 썼다고 했다. 클라이언트 -> A서버 -> B서버 통신을 해야 하는데, 한단계를 거치기 위해서는 A서버는 클라이언트로 부터 받은 요청을 B로 요청 해야 한다. 그때 이 RestTemplate이 해주는 것. 어떻게? RESTful하고, 데이터는 직렬화하고? 검색은 쿼리를 날려서! 이제서야 RestTemplate을 사용하는 이유를 알았다. 이제 다시 흐름을 파악하니 더 잘 보인다.

이 RestTemplate이 있으면 서버 한개가 아닌 여러 레이어가 있어도 가능할 것 같다.(물론 너무 복잡하고 어렵겠지만)

 

오늘 새로운 팀을 배정받았고, 팀원들과 소소히 수다를 떨었다. 저번 프로젝트를 어떻게 진행했는지? 물어보면서 builder를 이용해서 객체를 생성하는 것을 봤다. 빌더를 볼때마다 저거 참 좋다. 가독성도 좋고? 수정에도 용이하다고 생각했다. builder는 시간이 나면 좀더 공부해보자.

 

출처 - https://adjh54.tistory.com/234

'공부 > TIL' 카테고리의 다른 글

23.11.30  (0) 2023.11.30
23.11.29  (0) 2023.11.29
23.11.27  (1) 2023.11.27
23.11.24  (1) 2023.11.24
23.11.23  (1) 2023.11.23