Connection은 영문 그대로 '연결'이란 의미를 지니고 있습니다. '연결'은 무엇일까요? 서로 다른 물체가 상호작용을 이룬다고 볼 수 있습니다. 예를 들어 노트북에 마우스를 연결하는 행위도 Connection이라 볼 수 있습니다. 오늘 여기서 알아볼 Connection은 소프트웨어적인 연결을 알아보려고 합니다. 바로 WAS와 데이터베이스 사이의 연결을 의미합니다. 해당 클라이언트와 서버 사이의 연결을 위해서는 아래와 같은 3-way-handshaking이라는 작업이 필요합니다. 쉽게 말해 서로 소통을 하기 위해 준비하는 과정이라고 보시면 됩니다.
[참조] https://velog.io/@ss-won/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-TCP-3-way-handshake
4-way-handshake는 Connection을 종료할 때 필요한 작업입니다. 클라이언트와 서버가 통신을 하기 위해서는 이러한 통신 준비과정이 필요한데 매번 클라이언트의 요청이 들어올 때마다 새로운 Connection을 생성하고 끊어내는데 필요한 비용이 너무 많이 들어갑니다. 이를 해결하기 위해 Connection Pool이 필요합니다.
Connection Pool은 미리 생성한 Connection들을 모아 저장한 공간을 말합니다. 클라이언트에서 요청이 들어올 때마다 Connection Pool은 Pool에 대기하고 있는 Connection들을 제공하여 통신을 하기 때문에 클라이언트 입장에서 새로운 Connection을 생성하고 끊어내는데 들어가는 비용을 단축시킬 수 있으며 제한된 갯수의 Connection을 재사용하기 때문에 메모리적인 측면에서도 절약할 수 있습니다. 하지만 너무 많은 Connection 객체가 Connection Pool에 있다면 Connection 객체 또한 메모리를 차지하기 때문에 적당한 갯수의 Connection을 유지하는 게 좋습니다.

Timeout은 시간이 지났다는 표현으로 사전적으로 '프로그램이 특정한 시간 내에 성공적으로 수행되지 않아서 진행이 자동적으로 중단되는 것'을 의미합니다. 응답을 계속해서 기다릴 수 없기 때문에 이에 대한 시간을 정해야 합니다. 예를 들어 DB Connection을 요청했으나, 특정 시간 내에 연결이 안될 때 Connection timeout이 발생하거나 WEB에서 클라이언트가 서버로 request를 날렸을 때, 연결이 되지 않은 상태로 특정시간 이상 대기할 때 Connection Timeout이 발생하는 것처럼 응답에 대해 장애와 같은 이유로 응답을 받을 수 없는 상황일 때 Timeout이 발생합니다. 이러한 Timeout에는 아래와 같이 두가지 종류가 있습니다.
Connection Timeout은 클라이언트가 서버측으로 Connection을 요청했지만, 서버의 장애 상황으로 Connection을 맺지 못할 때 발생하는 Timeout을 말합니다. TCP 소켓 통신에서 클라이언트와 서버가 연결될 때 정확한 전송을 보장하기 위해 상대방 컴퓨터와 사전에 세션을 수립하는데 이 과정을 위에서 봤던 3-way-handshake라고 합니다. 이 과정이 정상적으로 끝나야 비로소 Connection이 됐다고 표현할 수 있습니다. 즉, Connection Timeout이란 3-way-handshake가 정상적으로 수행되어 서버에 연결되기까지 소요된 시간을 일컫습니다.
Socket Timeout은 Connection Timeout 이후에 일어납니다. 클라이언트와 서버가 연결된 후에 서버는 데이터를 클라이언트에게 전송하게 됩니다. 이 때 하나의 데이터 덩어리가 아니라 여러개의 패킷 단위로 쪼개서 전송하게 되는데, 각 패킷이 전송될 때의 시간 차이 제한을 Socket Timeout이라고 합니다. 또한 클라이언트와 서버가 Connection이 맺어졌지만 I/O 작업이 길어지거나 락이 걸려 요청이 처리되지 못하고 있을 때 클라이언트는 더이상 기다리지 못하고 커넥션을 끊는데 이런 상황을 Read Timeout이라고 합니다.
클라이언트와 서버가 통신하기 위해 필요한 Connection을 맺기 위해 3-way-handshake와 같은 통신 준비 과정이 필요하며 이러한 과정에서 발생하는 비용을 아끼기 위해 미리 생성해둔 Connection을 제공하여 통신 준비 과정을 생략하고 이를 이용하여 작업을 할 수 있게 도와주는 것이 Connection Pool입니다. 또한 통신을 위해 Connection을 맺는 과정에서 클라이언트에서 서버측으로 Connection을 요청했지만 응답이 없는 경우 Connection Timeout이 발생하며 Connection이 맺어진 이후에 데이터 전송 단위인 패킷의 전송, I/O 작업의 지연 또는 락이 결려 요청이 처리되지 못할 때 발생하는 Socket Timeout/Read Timeout에 대해 살펴봤습니다.
참고자료
https://hyuntaeknote.tistory.com/12
https://tyrionlife.tistory.com/790
https://linked2ev.github.io/spring/2019/08/14/Spring-3-%EC%BB%A4%EB%84%A5%EC%85%98-%ED%92%80%EC%9D%B4%EB%9E%80/
https://velog.io/@ss-won/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-TCP-3-way-handshake