항해 99

항해 99 5기 TIL_71

Dream Herb 2022. 3. 22. 04:18

▶ Today I Learned

 

<실전 프로젝트>

 

[Mysql 사용하면서 Mongo DB에 일부 데이터 옮겨 둘을 동시에 사용]

 

현재 DB는 MySQL을 사용하고 있지만 여기서 시간기록과 관련된 데이터를는 Mongo DB 넣는 식으로 진행해보려한다.

 

조금 과거의 글이기는 하지만 스택오버플로우를 찾아보니 둘의 공존은 가능하다.

 

MongoDB and MySQL are completely separate applications. They have no way to communicate with each other except through your application. That means if a request needs data from both sources, it needs to query both separately.

둘은 완전히 다른 애플리케이션이므로 두 DB로 부터의 데이터를 요청한다면 쿼리문을 각각 실행해야 한다고 말한다.

 

https://stackoverflow.com/questions/34355632/how-to-use-mysql-and-mongodb-together

 

 

시간 기록의 경우 MySQL의 User테이블과 원래 join되어 있었다.

MySQL의 User와 MongoDB의 weekRecord, monthRecord를 어떻게 이어줄까 고민하던 중

weekRecord, monthRecord에 userId라는 열을 만들고 그 곳에 User 테이블의 id를 넣어서 접점을 만들기로 했다.

 

회원가입할 때 둘 간의 접점 생성 부분

 await WeekRecord.insertMany([
        { userId: user.id, category: "beauty" },
        { userId: user.id, category: "sports" },
        { userId: user.id, category: "study" },
        { userId: user.id, category: "counseling" },
        { userId: user.id, category: "culture" },
        { userId: user.id, category: "etc" },
      ]);

이렇게 하면 weekRecord라는 테이블에 시간관련 카테고리를 모두 넣으면서도 특정 유저임을 인식시켜줄 수 있다.

user.id는 MySQL의 User 테이블의 id이다.

 

스키마 코드도 알맞게 짜두었고

서버 실행 파일에 MongoDB 연결 코드도 작성완료, 로컬 및 카카오 로그인과 동시에 MongoDB에 주간기록, 월간기록 두 테이블 생성,

방에서 나갈 때 특정 유저의 특정 카테고리에 대한 시간을 주간기록에서부터 특정 요일 불러와 더해줌,

(특정 유저의 특정 카테고리) 요일별 시간 전체를 총합한 것을 기준으로 뱃지 지급 여부 결정, 필요 값 리턴하였음.

 

실제 테스트는 아직 해보지 못했고 불필요한 주석이나 코드는 없는지, 흐름대로 짠 것이 정말 맞는지 검증이 아직 필요하다.

내일 한번 점검해보아야겠다.

 

 

 

<CS>

 

[DB인덱스]

 

추가적인 쓰기 작업과 저장 공간을 활용하여 DB 테이블의 검색 속도를 향상시키기 위한 자료 구조,

인덱스를 활용하면 테이블의 모든 데이터를 검색할 필요가 없다.

 

장점

- 테이블을 조회하는 속도와 그에 따른 성능을 향상시킬 수 있다.

(SELECT, UPDATE DELETE를 할 때 전체 테이블을 조회할 필요가 없으므로)

 

단점

- 인덱스를 관리하기 위해 DB의 약 10%에 해당하는 저장 공간이 필요하다.

- 인덱스를 관리하기 위해 추가 작업이 필요하다.

- 인덱스를 잘못 사용할 경우 오히려 성능이 저하되는 역효과가 발생할 수 있다.

(DELETE와 UPDATE의 경우 기존의 인덱스를 삭제하지 않고 '사용하지 않음'처리를 해준다.

예를 들어 어떤 테이블에서 두 연산이 빈번하게 발생한다면 데이터는 10만 건이지만 인덱스는 100만 건이 넘어가게 되어

SQL문 처리시 비대해진 인덱스로 인해 오히려 성능이 떨어질 수 있는 것이다.)

 

대표적인 자료구조로는 해시 테이블과 B+Tree라는 것이 있다.

 

출처:

https://mangkyu.tistory.com/96

 

▶ 느낀 점

 

코드를 짜는 데 있어 팀원 분에게 도움을 받았다.

자신의 일을 하면서도 도움을 주신 팀원 분에게 감사하며

나도 얼른 더 잘해서 여유를 가지며 업무도 마치고 팀원들도 도와줄 수 있는

멋진 사람이 되고 싶다 :)

+

두 가지 DB를 동시에 쓴다는 것이 생각보다 쉽지 않은 일이었다.

그런 사례가 있는지 한글, 영문으로 구글링, Quara, stackoverflow의 글을 읽어가며 찾아보았는데

둘을 공존이 가능하지만 둘이 연결된 데이터가 필요하다면 각각에서 따로따로 불러와야 한다는 내용을 보았다.

시간과 관련된 부분을 손보면서 그에 맞춰 병합하는데 적어도 7시간 정도는 걸린 것 같다.

꽤나 많은 시간을 들였지만 덕분에 또 한번도 해본 적 없는 도전에 어느정도 성공했다.

물론 검증까지 끝나야 비로소 완전한 성공이겠지만 그래도 우선 테스트해볼 로직을 모두 짜냈다는 게 중요하다.

내일도 열심히 해야지! 화이팅팅! :3

 

▶ 공부 시 참고 링크들

 

https://hyunjun19.github.io/2018/03/23/package-lock-why-need/

 

package-lock.json은 왜 필요할까?

package-lock.json은 왜 필요할까? 2018-03-23 package-lock.json은 왜 필요할까? 어느 날 부터 인가 npm을 사용하면 package-lock.json 파일이 같이 생기기 시작했습니다. 이 파일의 정체가 궁금했지만 바쁘다는 핑

hyunjun19.github.io

 

https://www.inflearn.com/questions/271602

 

몽고디비와 mysql을 연결할 수 있을까요? - 인프런 | 질문 & 답변

운동관련 서비스를 만들면서 사용자가 작성한 운동종목만 따로 가져와서 포스팅하려고 하는데  이를 위해서 mysql과 몽고디비를 연결해서 사용하고자 합니다. mysql에서 사용자가 작성한 운동종

www.inflearn.com

 

https://www.geeksforgeeks.org/mongoose-insertmany-function/

 

Mongoose | insertMany() Function - GeeksforGeeks

A Computer Science portal for geeks. It contains well written, well thought and well explained computer science and programming articles, quizzes and practice/competitive programming/company interview Questions.

www.geeksforgeeks.org