스프링 부트, Flux, React로 만드는 실시간 채팅(2)

작성자 : 조회수 :

시작은 만만치 않았습니다. 일단 Flux라는 기초 개념도 없을 뿐 더러 MongoDb 또한 개념이 확실히

 

잡히지 않는 상태에서 시작했기 때문입니다.

 

그래도 공부하면서 개발하니 일단 진행해보도록 하겠습니다.

 

(중간중간 많고 다양한 지식들이 나오지만 자세한 정리들은 카테고리별로 다시 다루겠습니다.)

 

 

먼저 DB는 몽고 디비를 사용하는데

 

몽고 쉘은 MongoDBCompass에서도 사용가능하고 보기에도 편한 것 같아서 MongoDBCompass

 

사용하기로 했습니다.




제가 사용할 DBuse 로 선택해줍니다.





이런 식으로 Select도 할 수 있습니다.




스프링부트 서버가 재시작 하더라도 디비가 초기화 되지 않아 이렇게 삭제 문법도 입력해서 초기화 시켜줍니다.

 

 

참고로 새로고침은 (Ctrl + r ) 입니다!


Auto-index-creation을 통해서 컬럼을 unique 적용을 시킬수있다.


만약 저게 없다면 유니크 시키지 못합니다.

 

그리고 꼭 원하는 컬렉션은 이렇게 추가 해 주길 바란다.

 


이 설정이 필수인 이유는 



이런식으로 @Tailable이 걸렸을 때

 

참조하는 버퍼 사이즈가 커져야 올바르게 반환하기 때문입니다.

(이 에러로 한시간정도를 날렸다)

 

 

 

1.     아주 중요한 문제발생 (connection pool 초과, hikaricp 누수예상)

 

개발도중 hikaricp pool , connection10개이상 초과되며 더 이상 MongoDB와 통신하지 못하는

 

아주 치명적인 에러가 발생했습니다.

 

왜냐면 모든 커넥션을 열어버려서 새로운 요청에는 블로킹 되어 막혀있는 것 같습니다.

 

이걸로 구글링을 좀 오래했는데 결국에 알아낸 것은

 

1.     역시 기초가 부족함을 느끼고

2.     다시 기본을 공부해야겠다 역시 이론공부구나

 

였습니다 일단

 

출처 - https://spring.io/blog/2019/05/16/reactive-transactions-with-spring

 

스프링 블로그 글을 보면서 @Transactional이 필요없다는 것을 알게 됐습니다. (아직 전부다 읽지는 못했습니다.)

(더 도와주세요 파파고)

 

 

 

그 긴 여정이 결코 쓸모없지는 않았습니다 다양한 지식들을 얻어냈기 때문입니다.

 

출처 - https://tecoble.techcourse.co.kr/post/2022-10-11-server-sent-events/

 



사실 이글을 먼저 접했기 때문에 음 open-in-view만 끄면 문제없겠구나 했지만

 

다시 에러가 발생하는 것을 발견하고는 긴 구글링을 다시 나섰고 결국



지금은 주석처리 했지만 문제를 찾을 당시에는 아주 이쁘게 들어가 있는 것을 보았습니다

 

사실 flux, Reactive는 이번이 처음이라 습관처럼 넣다가 발견한 것 같습니다

 

(open-in-view를 끄면 뭐하나 @Transactional을 넣어놨는데 ㅠㅠ)

 

두 가지  (open-in-view @Transactional) 두가지를 사용하면

 

원리는 이렇게 됩니다.

 

보통의 HTTP 통신은 연결이 끝남과 동시에 종료가 가 되어

 

트랜잭션이 닫히게 되는데 비해

 

코드를 보면 Flux 즉 계속 응답이 진행됩니다.

 (SSE는 3초마다 확인한다는데 정확히는 모르겠습니다.)

 

그리고 찾아봤는데 Flux통신은 끊는 것이 아니라 새로운 응답을 계속 만들어내니

 

닫히지 않은 트랜잭션만 늘어나고 쓰레드를 잡아먹으며

 

결국 최대치까지 도달더 이상 쓰레드 자원이 없는 서버는

 

클라이언트의 요청에도 응답하지 못하는 사태가 벌어지는 거였습니다.





기본이 부족하니 이런 기본적인 문제에도 대응이 오래 걸릴 생각하니

 

한번 더 계속 공부를 해야함을 뼈저리게 느낍니다.

 

또한 여기서 배운 것들이 문제해결을 위한 얕은 공부였기 때문에

 

나중에라도 꼭 시간들여 공부할 예정입니다.

 

 

한가지 더 찾은 임시 방편은



그냥 최대 풀 사이즈를 늘리는 건데 이건 결국 50에 도달할 문제고

 

사실 해결법이 아니라 이렇게 수정도 가능하구나를 알 정도? 아니면

 

나중에 트랜잭션을 사용하지 않으면서도 서버가 부하가 갈만큼 사용자가 많아진다면

 

사용해야할 설정 같다.




추가 개념 살짝 ㅎㅎ

 

웹소켓과 SSE 두개의 특징과 차이점 또한 공부했습니다.

웹소켓 (양방향, 접속자 제한없음)

SSE (브라우저 하나당 최대 6, 단방향, 그래서 일반적 알림에 적합)

 

 

프론트 쪽 설명은 디자인 하면서 나중에 더 추가하겠습니다!

 

 

임시 추가본

 

프론트 쪽으로 넘어가 리액트 코드중 채팅글을 그대로 가져오는 것은

 

배열 추가는 아래 코드처럼 해줘야한다.





유튜브 참고 –> 메타코딩

https://www.youtube.com/watch?v=s6YR_kQqky8&list=PL93mKxaRDidHRYNYYFr1x3mLKIx1wFeFc&index=5

 

https://docs.spring.io/spring-data/mongodb/docs/3.3.0/reference/html/#mapping-usage.document-references

 

-몽고디비 공부에 도움이 되는 링크-

https://engineering.linecorp.com/ko/blog/LINE-integrated-notification-center-from-redis-to-mongodb

 

 

 

-커넥션 풀에 관한 지식-

https://techblog.woowahan.com/2664/

https://techblog.woowahan.com/2663/

 

 

-SSE를 쓸 때 고갈문제

https://tecoble.techcourse.co.kr/post/2022-10-11-server-sent-events/