본문 바로가기
HTTP

HTTP 기반의 외부 시스템과 연동할때 고려해야 할 점

by 졸린개발자 2022. 4. 19.

바쁜독자들을 위한 1줄요약

더보기

외부시스템과 연동할때는 연결에서 문제가 발생할 수 있으니 고려해서 개발합시다.

 

안녕하세요 졸린개발자입니다.

 

서버나 클라이언트를 개발하다보면 HTTP기반의 외부 시스템과 연동의 필요성이 생길 수 있습니다.

 

여기서 어떤 독자들은

클라이언트는 당연히 서버와 연결하기 위해 외부시스템과 연동이 필요한데

왜 서버는 외부시스템과 연동하지? 라고 생각할 수도 있습니다.

 

서버를 만들 때, 자신이 모든 것을 만드는 것보다

외부의 서비스를 이용할 때, 더욱 효율적이고 효과적인 경우에는 외부 시스템을 이용하게 됩니다.

 

가장 대표적인 예가 OAuth입니다.

카카오톡으로 회원가입처리를 대신하게 되면 많은 이점을 가져옵니다.

1. 사용자 정보를 카카오톡에서 저장하여, 사용자 정보의 보안과 트래픽을 대기업인 카카오톡에 맡길 수 있습니다.

2. 사용자 검증을 카카오톡에서 대신해주게 되어, 검증된 유저임을 보증합니다.

3. 사용자가 회원가입 프로세스를 거치지 않고, 빠르게 서비스를 이용할 수 있습니다.

 

이렇게 외부시스템이 더욱 좋은 시스템을 만들 수 있는 기반이 되기도 하지만,

언제든지 외부시스템과의 연결에서 문제가 발생할 수 있다는 것을 고려하고 개발을 하셔야합니다.

 

특히나 HTTP는 TCP(HTTP 3.0은 UDP)기반의 네트워크 연결이기 때문에

네트워크의 상황에 따라 불안정하게 동작할 수도 있습니다.

 

그럼 예제를 통해 자세하게 살펴봅시다.

 

 

정상적인 경우

<그림1 정상적인 경우>

정상적인 처리의 경우는 5가지 step으로 볼 수 있습니다.

1. TCP 연결

2. 리소스요청

3. 서버 내부 처리

4. 리소스 응답

5. TCP 종료

 

이렇게 잘 되면 좋겠지만 현실은 만만치 않습니다.

 

 

TCP연결이 제대로 되지 않을경우

<그림2 TCP연결이 안될경우>

TCP연결이 제대로 되지 않는 경우는 어떤경우일까요?

  • IP로 직접 연결을 시도하면, 없는 IP로 연결할때 생길 것입니다.
  • 네트워크 불량으로 연결이 실패할 수 있습니다.

이렇게 TCP연결이 제대로 성립되지 않으면 리소스 요청이 되지 않기 때문에

다시 연결을 시도한다던지의 적절한 오류처리를 해주셔야 합니다.

 

 

서버의 리소스 응답이 오지않을경우

<그림3 리소스응답이 오지않을경우>

리소스 요청을 했는데, 리소스 응답이 오지 않는 경우가 있습니다.

 

이때 발생할 수 있는 경우는 다음과 같습니다

  • 리소스 요청이 서버까지 가지 못한경우
  • 서버가 죽어버린경우 or 서버나 너무 오랫동안 작업을 처리하는 경우
  • 서버가 리소스 응답을 보냈지만 클라이언트까지 도달하지 못한경우

리소스 요청을 보낸 상황에서 이런 오류를 어떻게 탐지할 수 있을까요?

 

서버가 오랫동안 작업을 하게 되어 응답이 지연되는데 그것을 리소스 요청이 도달하지 못한것과 어떻게 다르게 판단할 수 있을까요?

안타깝게도 이 둘을 따로 판단할 수는 없습니다.

 

그래서 보통 이러한 경우에는 Timeout값을 정하게 됩니다.

 

이렇게 판단하게 되면 네트워크 상태가 불량한 경우는, 당연히 응답이 오지않아 Timeout이 날테고

서버의 응답시간의 평균 정도로 Timeout의 time값을 적절히 조절하여, 서버가 너무 오랫동안 작업하는 경우에 오류를 뱉게 됩니다.

 

 

응답값으로 오류를 내뱉는 경우 (HTTP status code가 400, 500번대인 경우)

<그림4 응답값이 오류인경우>

마지막은 HTTP응답값으로 오류코드를 받는 경우입니다.

 

HTTP는 오류가 발생하면 서버가 400번, 500번대의 Status Code를 내려줄 수 있습니다.

400번대는 사용자의 잘못된 요청으로 인해 발생하는 오류,

500번대는 서버 내부의 문제로 발생하는 오류입니다.

 

이 경우 위의 2가지 경우와는 다르게 네트워크의 문제로 발생하는 오류가 아니라,

서버가 오류로 처리했음을 알려주는 에러입니다.

 

이렇게 400, 500번대의 status code를 클라이언트가 받게되면

잘못된 요청을 보냈음을 사용자에게 알려주어야 합니다.

 

 

결론

외부 시스템과의 HTTP통신을 할때는 연결에서 문제가 발생할 수 있습니다.

마지막에는 정상적인 연결에서 응답으로 오류코드를 받는 경우도 함께 살펴봤습니다.

 

외부 시스템과 연결할때는 항상 외부 시스템이 잘못될 경우를 고려하여 시스템을 구축하여야합니다.

이러한 고려가 없이 개발이 이루어지면, 사용자는 알 수 없는 오류로 서비스를 정상적으로 이용하지 못할 것이고,

문제가 발생했을 때, 어디서 문제가 발생했는지도 알기 쉽지 않기 때문입니다. 

 

제가 이렇게 글을 쓴 이유는,

다음 포스트에서 java에서 서버에 HTTP요청을 보낼때, 적절하게 오류처리를 하는 법을 작성하기 위해

기초지식을 먼저 알려드리려고 이렇게 작성해 봤습니다.

 

그럼 긴글 읽어주셔서 감사합니다.