@HyunJi_Lee 님의 말씀에 힌트를 얻어서, 다시 한 번 테스트를 해봤습니다.
Web API 서버가 Docker로 띄워진 DB 컨테이너를 찾는데 시간이 오래 걸리는게 아닌가?
{
"ConnectionStrings": {
"ShirtStoreManagement": "Host=localhost;Port=5432;Database=ShirtStoreManagement;Username=postgres;Password=postgres;Include Error Detail=true;"
},
:
:
}
만약 ASP.NET Core 애플리케이션도 Docker Container로 띄웠다면, Connection String에서 Host
는 DB 컨테이너의 이름
을 사용했을 것입니다.
하지만 저는 DB(PostgreSQL)만 컨테이너로 띄웠었기 때문에, Host
는 localhost
로 설정했었습니다.
그래서 이번에는 localhost
대신 127.0.0.1
로 수정 후 다시 한 번 테스트를 해봤습니다.
{
"ConnectionStrings": {
"ShirtStoreManagement": "Host=127.0.0.1;Port=5432;Database=ShirtStoreManagement;Username=postgres;Password=postgres;Include Error Detail=true;"
},
:
:
}
그랬더니 첫 쿼리 응답 속도가 8초 걸리던게, 1초대로 줄어들었습니다!
아무래도 호스트 네트워크와 Dokcer 네트워크 간의 DNS 과정이 가장 큰 문제 원인이었던 거 같습니다
Connection String의 Host를 localhost
에서 127.0.0.1
로 변경함으로써, 본문에서 언급했던 문제 1)
과 문제 2)
가 모두 해결됐네요!
- 문제 1) 서버 실행 후 첫 번째 쿼리의 응답 속도가 8초였던 문제
- 이제는 DB를 빠르게 찾아 Connection을 맺기 때문에 8초에서 1초로 단축됨
- 사실상 Connection을 맺고 쿼리 응답받는건 오래 걸리지 않음
(앱 실행 후 최초 쿼리는 DB Context의 모델 초기화로 인해 좀 더 지연되는 부분이 있는걸로 추측)
- 문제 2) Connection 유실 후 쿼리 수행하면 다시 8초대 응답을 받던 문제
- 마찬가지로 DB를 빠르게 찾아 Connection을 맺기 때문에 문제 해결
- 새로운 Connection을 맺고 쿼리 응답을 받는데 수십 또는 100ms 정도 걸림
제가 처음에 조치를 취해던 방법은 “Connection을 맺는 시간이 오래 걸리니까, API 서버 초기 실행 때 DB Connection을 미리 만들어 놓고 계속 유지하자” 였는데,
알고보니 Connection을 맺기 위해 DB를 찾는 시간이 오래 걸린거였고, 결국엔 불필요한 DNS 과정을 생략함으로써 모든 문제가 한 번에 해결됐습니다 ㅎㅎ
앞으로는 다음 사항에 유의하며 개발 공부를 해야겠습니다
- 같은 Docker 네트워크로 묶여 있는 Docker 컨테이너들이라면 서로 컨테이너 이름을 이용하여 통신한다.
- 호스트 네트워크에 있는 애플리케이션과 (포트포워딩된) Docker 컨테이너를 연결할 때는
localhost
대신127.0.0.1
를 사용함으로써 불필요한 DNS 과정이 생략되어 더 빠르게 통신한다.