오늘은 SSE의 통신 과정에 생긴 트러블 슈팅을 진행했다!
SSE는 구독 요청이 오면, HTTP 응답을 반환하지 않고, HTTP 통신을 열어둔 상태에서 서버가 클라이언트에게 데이터를 전송하는 방식으로 동작한다.
스프링에서는 자체적으로 OSIV(Open Session In View), HTTP 응답이 완료될 때까지 영속성 컨텍스트를 유지하는 설정이 걸려있었다.
영속성 컨텍스트가 유지된다는 것은, DB 커넥션 또한 계속해서 유지된다는 뜻이다.
SSE는 HTTP 응답이 완료되지 않으니, 하나의 SSE 구독 관계가 생기면 해당 쓰레드에서는 계속해서 DB 커넥션을 붙잡고 있게 된다.
그런데, 우리 어플리케이션의 DB 커넥션풀은 10개 뿐이었고, 그러니 SSE 구독 관계가 10개 이상 생기는 순간, 커넥션 풀이 가득 차서 더 이상 다른 작업을 진행할 수 없게 된다.
spring:
jpa:
open-in-view: false
그래서 이렇게 OSIV 설정을 끄고 나니 SSE 구독 요청 후에도 커넥션이 잘 반납되어 더이상 커넥션 풀이 가득차는 일은 일어나지 않았다.
사실 이 OSIV는 스프링부트에서 타임리프를 사용할 때를 위해 해둔 설정이라고 한다.
하지만, 우리는 서버 사이드 렌더링을 진행하는 것이 아니고, 대부분의 로직은 서비스단에서 끝나기 때문에 OSIV 설정이 필요하지 않게 된다.
그래서 보통은 처음부터 이 설정을 끄고 시작한다고 한다.
우리 팀이 작성한 코드는 깃허브를 통해 업로드해두었다.
GitHub 보러가기
문제가 생겼을 당시에는 굉장히 당황해서 이런 저런 내용들을 찾아보고, 머리가 터질 것 같았었는데, 이런 과정들을 통해 새로운 사실을 알게 된 것 같다.
문제가 생기지 않는 것이 가장 좋겠지만.. 그래도 이 시간을 통해 조금씩 성장하고 있는 것 같아 재미있다.