-
스프링부트5.0 채팅서버 만들기 01 - 환경 설정/몽고DB 및 스프링부트 5.0 개념스프링/스프링부트5.0 - 채팅 2021. 10. 26. 19:25
유투버 '데어 프로그래밍'님 강의 참조
- 이 프로젝트는 몽고DB 기반 및 앞선에서 배운 WEB-FLUX 개념의 리엑티브 WEB으로 진행 된다.
01 몽고 DB 설치
- 다음 링크(https://www.mongodb.com/try/download/community)로 가서 'msi'로 받아준 후 설치
설치 완료 후 작업관리자에 확인해보면 '실행 중' 이라고 뜬다. - 환경 변수 세팅
- cmd에서 'mongo'를 쳐서 접속이 되는지 테스트
02 프로젝트 세팅
JKD 버전을 11로 해줘야 나중에 쓰는 라이브러리를 쓸 수 있다. - yml 세팅
spring: data: mongodb: host: localhost port: 27017 database: chatdb
→ 몽고디비를 쓸때 하는 기본적인 세팅이다. 호스트와 포트는 고정이다.
서버가 정상적으로 작동 한다. 리액티브 웹은 스프링 5.0 기반이고 Netty라는 서버를 쓰고 이 서버는 싱글 스레드로 이루어 진다 03 몽고DB 알아 보기
- 몽고DB를 이야기할때 먼저 RDBMS와 NoSQL을 알아야 한다.
- RDBMS의 가장 기본 목적은 데이터를 공유 및 중복을 없애는 일이다. 예로 유저와 게시판 테이블을 만들고 게시판에 어떤 유저가 글을 썻는지에 대한 데이터를 남길때 유저테이블을 그대로 가져오는것이 아니라 게시판 테이블에 'userId'라는 컬럼을 따로 만들어서 남긴다. 이 RDBMS의 장점은 데이터가 중복이 안되고 테이블끼리의 참조가 명확하기때문에 유지보수가 쉽다(PK/FK의 장점).
- 반면 NoSQL(MongoDB등)은 보통 컬렉션이라고 불리는 형태로 저장이 되는데 이 컬렉션은 JSON기반이다. (컬렉션은 자바의 리스트 로직과 비슷 하다)
USER : [ {id:1, username:ssar, phone:010****}, {id:2, useranme:cos, phone:010****} ]
- 여기서 NoSQL과 RDBMS의 차이는 NoSQL은 유저 테이블, 게시판 테이블을 생성 후 게시판을 누가 썻냐라고 데이터를 테이블에 남기고 싶을때 참조형식이아닌 USER테이블의 내용을 그대로 가져와 JSON 형태로 입력 한다.
USER : [ {id:1, username:ssar, phone:010****}, {id:2, useranme:cos, phone:010****} ] BOARD : [ {id:1, title:title1, content:content1, username:ssar, phone:010****}, {id:2, title:title2, content:content2, username:ssar, phone:010****} ]
- NoSQL에서는 중복이 허용이되는데 이때 장점은 RDBMS가 조인을해서 테이블을 연결시키고 데이터 공유 및 중복을 제거하는 작업을 거친다면 NoSQL은 테이블끼리 조인을 할 필요도 없으며 데이터를 찾을때의 퍼포먼스가 몇배로 좋다. 특히 몇십만명이 하나의 데이터를 셀렉트해도 퍼포먼스가 RDBMS보다 좋다(조인작업없이 게시판테이블에서 셀렉트만 하면 된다)
- 단점으로는 INSERT 작업부터가 힘들며 데이터의 일관성 및 정확성이 많이 낮다(유저명이 바뀌면 게시판에도 직접 그 유저명을 바꿔줘야하는 번거로움이 있다. 즉 UPDATE도 힘듬)
04 스프링 5.0 알아보기
- 일반 스프링은 서블릿 기반으로 이루어지는데 이 서블릿 기반 서버는 사용자가 REQUEST할때마다 스레드를 형성 한다. 여러 사용자가 동시에 요청을하면 각각의 사용자에게 스레드를 배분하여 서버가 운영 된다. 스레드 기반의 단점은 스레드 요청이 점점 늘어날수록 컨텍스트 스위칭에 과부하가 걸리고 컨텍스트를 읽을때 Time Slicing이 점점 길어 지게 된다. 즉 사용자가 데이터를 요청하고 응답받는시간이 점점 길어지게 되는 것.
- 이 서블릿기반이 스프링 4.0까지였고 5.0 부터는 Netty라고 불리는 서버기반으로 비동기 서버기반으로 변경 되었다. 예로 서버가 비동기로 운영이 되기때문에 수많은 요청이 와도 각각의 요청에 대한 응답을 스레드 1개로 관리를 하게 되고 그 하나의 스레드로 수많은 요청에 대한 수많은 응답을 시간대별로 나눠서 관리를 하기 때문에 과부하가 걸릴 일이 없고 응답을 시간대별로 나누었으니 시간차가있는동안 다른일이 가능하다는 말이다. (A 요청 - 1초, B 요청 - 3초, C 요청 - 5초 라고 가정한다면 C 요청에 대한 응답이 나가기전에 A/B를 각각 처리하고 C에 대한 응답이 나가는 방식). 즉 컨텍스트 스위칭이 없다고 보면 되고 서버가 굉장히 빠르게 돌아 간다.
- 스프링 5.0 Netty 기반을 쓸때에는 당연히 MongoDB를 써야한다. 왜?
→ MongoDB가 비동기 기반이며 서버가 비동기이면 DB도 비동기가 되어야 위에서 설명한 스레드1개로 관리 및 처리가 되기 때문이다.
'스프링 > 스프링부트5.0 - 채팅' 카테고리의 다른 글
스프링부트5.0 채팅서버 만들기 03 - 서버 완성 (0) 2021.10.27 스프링부트5.0 채팅서버 만들기 02 - 서버 세팅/채팅화면 디자인 (0) 2021.10.26