OSIV의 구현
Spring Boot는 `OpenEntityManagerInViewFilter`라는 기본 필터를 사용해 OSIV(🔗)를 지원한다. 요청을 받으면 DB 세션을 열고, HTTP 요청이 끝나면 DB 세션을 닫는다. 필터는 DB 세션이 살아 있는 내내 JPA의 엔티티 매니저를 열어둠으로써 HTTP 요청이 끝나기 전까지 Lazy Loading을 가능하게 한다.
SSE
요청 없이도 웹페이지에 text/event-stream MIME type으로 데이터를 전송할 수 있는 W3C의 HTML 표준으로 EventSource라는 인터페이스로 구현되어있다. EventSource 인터페이스는 EventSource.close() 호출 전까지 HTTP 서버와 지속적인 커넥션을 맺게 해준다. 웹소켓과는 달리 서버측에서 클라이언트 쪽으로만 데이터가 흐른다는 점에서 단방향이다.
OSIV와 SSE가 상극인 이유
OSIV는 HTTP 요청이 끝날 때까지 DB 세션을 잡아두고, SSE는 서버와 클라이언트가 지속적으로 HTTP 커넥션을 맺게 해준다. SSE를 사용할 땐 `open-in-view`를 `false`로 설정해야 하는 이유이다. `open-in-view`를 `true`로 설정해 놓으면 SSE 연결을 맺는 클라이언트 수만큼 서버가 DB 커넥션을 반환하지 않고 계속 물고 있게 된다. `Could not open JPA EntityManager for transaction; nested exception is org.hibernate.exception.JDBCConnectionExceptionL Unable to acquire JDBC Connection` 에러 메시지가 뜨며 서버가 먹통이 되는건 한 순간이다.
'웹' 카테고리의 다른 글
ORM 사용 이유와 장점 (1) | 2024.12.13 |
---|---|
AWS Code Deploy 사용법 (0) | 2024.11.30 |
OSIV는 안티패턴? (2) | 2024.10.28 |
OSIV(open-in-view)란? (feat. LazyInitializaionException) (0) | 2024.10.27 |
JAVA 앱 배포하기 (0) | 2020.07.28 |