Skip to content

Study-Hub-09/StudyHub_BE

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

663 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

🌳 STUDY HUB 🌳

졜고의 인기 ν”„λ‘œμ νŠΈμƒ_μŠ€ν„°λΈŒ

1

πŸ§‘β€πŸ’» 개발 κΈ°κ°„ : 2023.05.19 ~ 2023.06.30

πŸ‘‰ μ„œλΉ„μŠ€ URL : https://www.study-hub.shop

πŸ… ν•­ν•΄14κΈ° 졜고의 인기 ν”„λ‘œμ νŠΈμƒ μˆ˜μƒ!


🌱 μ„œλΉ„μŠ€ μ†Œκ°œ

2 3 4


🌿 핡심 κΈ°λŠ₯

πŸ§‘β€πŸ’» 화상 μŠ€ν„°λ””
- μŠ€ν„°λ””λ£Έμ— μ ‘μ†ν•œ μœ μ €λŠ” webRTCλ₯Ό ν™œμš©ν•˜μ—¬ 본인의 화면을 μ†‘μΆœν•˜λŠ” λ™μ‹œμ—, λ‹€λ₯Έ μœ μ €μ˜ κ³΅λΆ€ν•˜λŠ” λͺ¨μŠ΅μ„ μ‹€μ‹œκ°„μœΌλ‘œ 확인

1 ν™”λ©΄ μ†‘μΆœ μ‹œ

2 ν™”λ©΄ 차단 μ‹œ

⌨️ κ·Έλ£Ή μ±„νŒ…
- μ†ŒμΌ“ 톡신을 λ°”νƒ•μœΌλ‘œ μŠ€ν„°λ”” λ£Έμ—μ„œ μ±„νŒ… κΈ°λŠ₯ 제곡

3

πŸ•‘ 타이머 κΈ°λŠ₯ & 톡계
- 맀일 μžμ •μ„ κΈ°μ€€μœΌλ‘œ DB에 μ €μž₯된 곡뢀 μ‹œκ°„μ„ μ°Έμ‘°ν•˜μ—¬, 일일 κ³΅λΆ€μ‹œκ°„ 및 λˆ„μ  κ³΅λΆ€μ‹œκ°„ 확인

톡계

πŸͺ΄ Project Architecture

STUB architecture


🌲 기술적 μ˜μ‚¬ κ²°μ •

BACK-END

μ‚¬μš© 기술 기술 μ„€λͺ…
CI/CD - EC2 + Github Action & Nginx ν”„λ‘ νŠΈ νŒ€μ΄ μ›ν™œν•˜κ²Œ μž‘μ—…ν•˜κΈ° μœ„ν•΄μ„œλŠ” μ΅œλŒ€ν•œ 빨리 μ„œλ²„κ°€ λ„μ›Œμ Έμ•Ό ν•œλ‹€κ³  μƒκ°ν–ˆμœΌλ©°,
dev branch에 μ½”λ“œκ°€ merge 될 λ•Œλ§ˆλ‹€ 배포λ₯Ό μœ„ν•΄ 반볡적인 μž‘μ—… μ΅œμ†Œν™”ν•˜κ³  μ„œλ²„ κ°œλ°œμ—λ§Œ 집쀑할 수 μžˆλ„λ‘ CI/CD ν™˜κ²½μ„ κ΅¬μΆ•ν•˜κΈ°λ‘œ κ²°μ •ν•˜μ˜€μŠ΅λ‹ˆλ‹€.
Jenkins와 github action + EC2 두 κ°€μ§€ 선택지 쀑 GitHub Action이 GitHub μ™€μ˜ 연동이 νŽΈν•˜κ³  λΉ λ₯Έ μ‹œκ°„ 내에 배포할 수 μžˆλŠ” μž₯점이 있으며,
GitHubμ—μ„œ λ°œμƒν•˜λŠ” 이벀트λ₯Ό μ²˜λ¦¬ν•  수 μžˆλ‹€λŠ” 점을 톡해 ν•΄λ‹Ή 선택지λ₯Ό λ„μž…ν•˜κ²Œ λ˜μ—ˆμŠ΅λ‹ˆλ‹€.
λ˜ν•œ 배포할 λ•Œλ§ˆλ‹€ μ„œλ²„κ°€ μž μ‹œ μ€‘λ‹¨λ˜λŠ” 상황에 μ˜ν•΄ μœ μ €λ“€μ΄ μ„œλΉ„μŠ€λ₯Ό 이용 쀑에 μ€‘λ‹¨λ˜λŠ” λΆˆνŽΈν•¨μ΄ μžˆμ–΄ 무쀑단 배포인 Nginxλ₯Ό λ„μž…ν•˜κ²Œ λ˜μ—ˆμŠ΅λ‹ˆλ‹€.
OpenVidu NλŒ€N 화상 μ±„νŒ…μ„ κ΅¬ν˜„ν•˜κΈ° μœ„ν•΄μ„œ μ‹œκ·Έλ„λ§ μ„œλ²„λ₯Ό ν†΅ν•΄μ„œ P2P둜 μ—°κ²°ν•˜λŠ” 방식과 λ―Έλ””μ–΄ μ„œλ²„λ₯Ό λ‘λŠ” 방식이 μ‘΄μž¬ν•˜λŠ”λ° P2P둜 κ΅¬ν˜„ν•˜κΈ°μ—λŠ” ν΄λΌμ΄μ–ΈνŠΈμ— 뢀담이 λ„ˆλ¬΄ 크며, OpenVidu ν”Œλž«νΌμ„ μ΄μš©ν•˜μ—¬ λ―Έλ””μ–΄ μ„œλ²„λ₯Ό λ‘ κ³Ό λ™μ‹œμ— μ‹œκ·Έλ„λ§ μ²˜λ¦¬λ„ λ§‘κΈΈ 수 있기 λ•Œλ¬Έμ— κ²°μ •ν•˜κ²Œ λ˜μ—ˆμŠ΅λ‹ˆλ‹€.
Stomp Stomp ν”„λ‘œν† μ½œμ€ λ©”μ‹œμ§€ 전솑을 μœ„ν•œ ν”„λ‘œν† μ½œλ‘œμ¨ pub/sub 기반으둜 λ™μž‘ν•˜λ©° λ©”μ‹œμ§€ 헀더λ₯Ό κ°€μ§€κ³  있기 λ•Œλ¬Έμ— λ©”μ‹œμ§€μ˜ 솑신, μˆ˜μ‹ μ— λŒ€ν•œ 처리λ₯Ό λͺ…ν™•ν•˜κ²Œ μ •μ˜ ν•  수 μžˆλŠ” μž₯점이 μžˆμŠ΅λ‹ˆλ‹€.
좔가적인 μž‘μ—… 없이 λ©”μ‹œμ§€ λ°œν–‰ μ‹œ μ—”λ“œν¬μΈνŠΈλ§Œ μ‘°μ •ν•˜μ—¬ μ‰¬μš΄ 전솑/μˆ˜μ‹  λ˜ν•œ κ°€λŠ₯ν•˜μ—¬ λ„μž…ν•˜κ²Œ λ˜μ—ˆμŠ΅λ‹ˆλ‹€.
Oauth2 μ†Œμ…œ λ‘œκ·ΈμΈμ„ λ„μž…ν•˜κ²Œ 된 κ°€μž₯ 큰 μ΄μœ λŠ” μ‚¬μš©μžμ˜ νŽΈμ˜μ„± μ¦λŒ€λ₯Ό μœ„ν•΄μ„œ μž…λ‹ˆλ‹€.
클릭 λͺ‡ 번 만으둜 λ‘œκ·ΈμΈμ„ ν•  수 μžˆλŠ” νŽΈλ¦¬μ„±μ„ 톡해 μ‚¬μš©μžλ“€μ΄ 이 웹을 더 찾을 수 μžˆλŠ” 이유λ₯Ό μ œκ³΅ν•˜κΈ° μœ„ν•΄μ„œ μž…λ‹ˆλ‹€.
Sentry SentryλŠ” μ‹€μ‹œκ°„ 였λ₯˜ λͺ¨λ‹ˆν„°λ§ 및 λ‘œκΉ… ν”Œλž«νΌμœΌλ‘œ, μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ λ°œμƒν•˜λŠ” μ˜ˆμ™Έ, 였λ₯˜, κ²½κ³  등을 μ‹€μ‹œκ°„μœΌλ‘œ μˆ˜μ§‘ν•˜κ³  μ€‘μ•™ν™”λœ λŒ€μ‹œλ³΄λ“œμ—μ„œ 확인할 수 μžˆλ„λ‘ μ§€μ›ν•©λ‹ˆλ‹€.
μ΄λŸ¬ν•œ 이유둜 Sentryλ₯Ό λ„μž…ν•˜μ—¬ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ λ‘œκΉ…κ³Ό μ˜ˆμ™Έ 처리λ₯Ό 효과적으둜 관리할 수 있게 λ˜μ—ˆμŠ΅λ‹ˆλ‹€.
Redis RedisλŠ” μ˜€ν”ˆ μ†ŒμŠ€ 인 λ©”λͺ¨λ¦¬ ν‚€ κ°’ 데이터 ꡬ쑰 μŠ€ν† μ–΄λ‘œμ„œ λΉ λ₯΄κ²Œ μ ‘κ·Όν•  ν•„μš”κ°€ μžˆλŠ” 데이터λ₯Ό μ €μž₯ν•˜λŠ”λ° μœ μš©ν•©λ‹ˆλ‹€. ν΄λΌμ΄μ–ΈνŠΈκ°€ 자주 μ ‘κ·Όν•˜λŠ” 토큰 μ •λ³΄λ‚˜ 데이터 캐싱에 μ‚¬μš©ν•˜κΈ° μœ„ν•΄μ„œ λ„μž…ν•˜μ˜€μŠ΅λ‹ˆλ‹€.
Spring Batch Spring BatchλŠ” λŒ€μš©λŸ‰ μΌκ΄„μ²˜λ¦¬ 편의λ₯Ό μœ„ν•œ λ‹€μ–‘ν•œ κΈ°λŠ₯을 μ œκ³΅ν•©λ‹ˆλ‹€.
νŠΉμ •ν•œ μ‹œμ μ— μŠ€μΌ€μ€„λŸ¬λ₯Ό 톡해 μžλ™ν™”λœ μž‘μ—…κ³Ό νŠΈλžœμž­μ…˜ 관리와 ν•¨κ»˜ 톡계 처리λ₯Ό λ§‘κΈ°κΈ° μœ„ν•΄ λ„μž…ν•˜μ˜€μŠ΅λ‹ˆλ‹€.
JUnit5 + Mockito ν…ŒμŠ€νŠΈ μ½”λ“œλ₯Ό μ‚¬μš©ν•˜λ©΄ 개발 κ³Όμ • 쀑에 λ°œμƒν•  수 μžˆλŠ” μ˜ˆμƒμΉ˜ λͺ»ν•œ 문제λ₯Ό 컴파일 μ‹œμ μ—μ„œ 찾을 수 μžˆμŠ΅λ‹ˆλ‹€.
μ΄λŠ” λŸ°νƒ€μž„ 였λ₯˜λ₯Ό λ°©μ§€ν•˜κ³ , 버그λ₯Ό 사전에 λ°œκ²¬ν•˜μ—¬ 디버깅 μ‹œκ°„μ„ μ ˆμ•½ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
λ˜ν•œ μž‘μ„±ν•œ μ½”λ“œκ°€ μ˜λ„ν•œ λŒ€λ‘œ λ™μž‘ν•˜λŠ”μ§€ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.
ν…ŒμŠ€νŠΈ μ½”λ“œλŠ” μ˜ˆμƒλ˜λŠ” μž…λ ₯κ³Ό 좜λ ₯을 μ •μ˜ν•˜κ³ , μ½”λ“œ μ‹€ν–‰ κ²°κ³Όλ₯Ό ν™•μΈν•˜μ—¬ μ½”λ“œμ˜ 정확성을 κ²€μ¦ν•˜λŠ” 역할을 ν•©λ‹ˆλ‹€.
이λ₯Ό 톡해 μ½”λ“œ λ³€κ²½μ΄λ‚˜ λ¦¬νŒ©ν† λ§ 후에도 κΈ°λŠ₯의 λ™μž‘μ΄ μ˜¬λ°”λ₯Έμ§€ 확인할 수 있기 λ•Œλ¬Έμ— λ„μž…ν•˜κ²Œ λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

🧨 νŠΈλŸ¬λΈ” μŠˆνŒ…

BACK END

πŸ’₯ OpenVidu μ„Έμ…˜μ΄ μ’…λ£Œλ˜λŠ” 이슈

문제

OpenVidu μ„œλ²„μ— μƒμ„±λœ μ„Έμ…˜μ΄ 주기적으둜 μ‚­μ œλ˜κ±°λ‚˜, ν•œλ²ˆμ΄λΌλ„ Connection이 λ°œμƒν•œ ν›„ Connection이 ν•˜λ‚˜λ„ μ‘΄μž¬ν•˜μ§€ μ•Šκ²Œλ  경우 μ„Έμ…˜μ΄ μ‚­μ œλ˜λŠ” 문제 λ°œμƒ

μ‹œλ„

  1. env νŒŒμΌμ„ μˆ˜μ •ν•˜μ—¬ OPENVIDU_SESSIONS_GARBAGE_INTERVAL 값을 0으둜 μˆ˜μ •ν•˜λ©΄ Garbage Collectorκ°€ λΉ„ν™œμ„±ν™”λ¨κ³Ό λ™μ‹œμ—OPENVIDU_SESSIONS_GARBAGE_THRESHOLD 속성 λ˜ν•œ λ¬΄νš¨ν™”κ°€ 되기 λ•Œλ¬Έμ— Interval 값을 0으둜 μˆ˜μ •
  2. μœ μ €κ°€ 이미 μ‚­μ œλœ μ„Έμ…˜μœΌλ‘œ μ ‘κ·Όν•  경우 μƒˆλ‘œμš΄ μ„Έμ…˜μ„ μƒμ„±ν•΄μ„œ ν•΄λ‹Ή μ„Έμ…˜μ— μœ μ €λ₯Ό μž…μž₯μ‹œν‚€λŠ” 방법

ν•΄κ²°

μŠ€ν„°λ””λ£Έμ— μœ μ € μž…μž₯ -> OpenVidu μ„œλ²„μ— ν™œμ„±ν™”λ˜μ–΄ μžˆλŠ” μ„Έμ…˜ λͺ©λ‘ λ‘œλ“œ -> μž…μž₯ν•˜κ³ μž ν•˜λŠ” μ„Έμ…˜ IDκ°€ μ‘΄μž¬ν•  경우 ν•΄λ‹Ή μ„Έμ…˜μœΌλ‘œ μž…μž₯ -> ν•΄λ‹Ή μ„Έμ…˜μ΄ 없을 경우 μž…μž₯ν•˜κ³ μž ν–ˆλ˜ μ„Έμ…˜ ID와 λ˜‘κ°™μ€ ID둜 Custom μ„Έμ…˜ 생성 및 μž…μž₯ 과정을 톡해 μœ μ € μž…μž₯에선 μ„Έμ…˜μ΄ μ’…λ£Œλ˜μ§€ μ•Šκ³  계속 μ‘΄μž¬ν•˜λŠ” κ²ƒμ²˜λŸΌ 인식할 수 μžˆλ„λ‘ μˆ˜μ •ν•˜μ—¬ ν•΄κ²°

ν•΄κ²° μ½”λ“œ

μŠ€ν¬λ¦°μƒ· 2023-06-27 023723
πŸ’₯ λ°© 생성 및 λ°© μž…μž₯ λ™μ‹œμ„± 이슈

문제

  1. ν•œ 방에 μž…μž₯은 9λͺ…κΉŒμ§€ κ°€λŠ₯
  2. λ°© 생성 μ‹œ ν•œ μœ μ € λ‹Ή 3개의 방을 생성 κ°€λŠ₯
  3. λ°© μž…μž₯ μ‹œ ν•œ μœ μ €κ°€ 같은 방을 μ—¬λŸ¬ 번 μž…μž₯ν•  수 μ—†κ³ , 이미 μž…μž₯ν•œ λ°© 이외에 λ‹€λ₯Έ λ°© μž…μž₯ λΆˆκ°€

μœ„ 쑰건듀에 λŒ€ν•œ μ˜ˆμ™Έ μ²˜λ¦¬λŠ” λ˜μ–΄μžˆμ§€λ§Œ, Jmeterλ₯Ό μ΄μš©ν•œ λ™μ‹œμ„± ν…ŒμŠ€νŠΈ κ²°κ³Ό μ „λΆ€ λ™μ‹œμ„± μ œμ–΄κ°€ λ˜μ§€ μ•Šμ•„ μ›ν•˜λŠ” λŒ€λ‘œ μ²˜λ¦¬κ°€ λ˜μ§€ μ•ŠμŒ

μ‹œλ„

  1. RabbitMQ와 같은 λ©”μ„Έμ§€ 브둜컀λ₯Ό μ΄μš©ν•˜μ—¬ μš”μ²­μ„ λ©”μ„Έμ§€ 큐에 λ‹΄μ•„μ„œ μ²˜λ¦¬ν•˜κ³  μš”μ²­ μžμ²΄μ— λŒ€ν•œ λ™μ‹œμ„± μ œμ–΄λ₯Ό μ‹œλ„
  2. 동기화 기법 및 DB Lock μ‚¬μš©

ν•΄κ²°

Pessimistic Lock을 μ΄μš©ν•˜μ—¬ DB에 λ™μ‹œ 접근을 λ§‰μ•„μ„œ ν•΄κ²°

ν•΄κ²° μ „, ν›„ ν…ŒμŠ€νŠΈ

μ „ ν•΄κ²° μ „ ν›„ ν•΄κ²° ν›„


πŸ“Š κ°œμ„  사항

BACK END

β•λ§ˆμ΄νŽ˜μ΄μ§€ 쑰회 μ„±λŠ₯ κ°œμ„ μ„ μœ„ν•œ Redis 캐싱 λ°©μ•ˆ

기술 λ„μž… λ°°κ²½

μœ μ €λ‘œλΆ€ν„° 접근이 μž¦μ€ λ§ˆμ΄νŽ˜μ΄μ§€λ₯Ό μ‘°νšŒν•  λ•Œλ§ˆλ‹€ 톡계λ₯Ό κ³„μ‚°ν•˜κ³  μ‘°νšŒν•˜λŠ” 쿼리가 μƒμ„±λ˜κ³  μžˆλŠ”λ° 이λ₯Ό κ°œμ„ ν•  μˆ˜λŠ” μ—†μ„κΉŒ?

기술 κ΅¬ν˜„ κ³Όμ •

Redis에 톡계 데이터λ₯Ό μ €μž₯ν•˜μ—¬ 캐싱을 μ μš©ν•˜κ³ , μˆ˜μ •μ΄ ν•„μš”ν•œ 당일 데이터에 변경이 일어날 λ•Œλ§Œ 톡계 데이터에 값을 μˆ˜μ •.
이에 따라, λ§ˆμ΄νŽ˜μ΄μ§€λ₯Ό μ‘°νšŒν•  λ•Œλ§ˆλ‹€ 쿼리λ₯Ό μƒμ„±ν•˜μ§€ μ•Šμ•„λ„λ˜κ³  데이터λ₯Ό μ‘°νšŒν•˜λŠ” 속도 λ˜ν•œ ν–₯상될 수 μžˆλ„λ‘ ν•˜μ˜€λ‹€.

κ³ λ―Ό

λ‹¨μˆœνžˆ Key Value ꡬ쑰둜만 μ €μž₯ν•˜κΈ°μ—λŠ” λͺ¨λ“  λ©€λ²„μ˜ 일별, 주별, 월별 데이터λ₯Ό λ‹€λ₯Έ 멀버듀과 κ΅¬λΆ„λ˜κ²Œ λ„£κΈ°κ°€ μ–΄λ €μš΄λ°, μ–΄λ–€ 방법이 μžˆμ„κΉŒ?

ν•΄κ²° λ°©μ•ˆ

Redisκ°€ μ œκ³΅ν•˜λŠ” 자료ꡬ쑰 쀑 Value둜 또 λ‹€λ₯Έ Key Value Map을 넣을 수 μžˆλŠ” Hash 자료 ꡬ쑰λ₯Ό μ΄μš©ν•˜μ—¬ λͺ¨λ“  λ©€λ²„λ“€μ˜ 톡계 데이터λ₯Ό κ΅¬λΆ„ν•΄μ„œ 넣을 수 μžˆλ„λ‘ ν•˜μ˜€λ‹€.

β•μŠ€ν„°λ”” λ£Έ 만료 μ²˜λ¦¬μ™€ μžλ™ν™”λœ 톡계 데이터 관리 방법

기술 λ„μž… λ°°κ²½

λ§Œλ£ŒκΈ°ν•œμ΄ 된 μŠ€ν„°λ””λ£Έ μ²˜λ¦¬μ™€ ν•¨κ»˜ 톡계 데이터λ₯Ό 효과적으둜 μžλ™ν™”ν•΄μ„œ μ²˜λ¦¬ν•  수 μžˆλŠ” 방법이 무엇이 μžˆμ„κΉŒ?

기술 κ΅¬ν˜„ κ³Όμ •

λŒ€μš©λŸ‰ μΌκ΄„μ²˜λ¦¬ κΈ°λŠ₯을 μ œκ³΅ν•˜λŠ” Spring Batch와 μž‘μ—…μ„ μžλ™ν™”ν•  수 μžˆλŠ” Spring Schedularλ₯Ό μ‚¬μš©ν•˜μ˜€λ‹€. μŠ€μΌ€μ€„λŸ¬λ₯Ό 맀일 μžμ •μ— ν•œλ²ˆ μ”© μˆ˜ν–‰λ˜λ„λ‘ μ„€μ •ν•˜κ³  1. 만료된 방을 μ‚­μ œ 2. μ‚¬μš©λ˜μ§€ μ•ŠλŠ” OpenVidu μ„Έμ…˜ μ‚­μ œ 3. 톡계 데이터 μ €μž₯ 을 3개의 Step으둜 κ΅¬μ„±ν•˜μ—¬ 일괄 처리λ₯Ό μžλ™ν™”ν•˜μ˜€λ‹€.

κ³ λ―Ό

처리 방식을 μ–΄λ–»κ²Œ μ •ν•  것인가?

ν•΄κ²° λ°©μ•ˆ

μ‹€ν–‰ν•  μž‘μ—…μ΄ λ³΅μž‘ν•˜κ³  읽기, 처리 쓰기와 κ΄€λ ¨λœ μž‘μ—…μ„ μˆ˜ν–‰ν•΄μ•Όν•˜λŠ” 톡계 μž‘μ—…μ€ Chunk λ°©μ‹μœΌλ‘œ μ²˜λ¦¬ν•˜μ˜€κ³ , λΉ„κ΅μ μœΌλ‘œ μ²˜λ¦¬κ°€ λ‹¨μˆœν•˜κ³  μ²˜λ¦¬λŸ‰μ΄ λ§Žμ§€ μ•Šμ€ λ‚˜λ¨Έμ§€ μž‘μ—…λ“€μ€ Tasklet λ°©μ‹μœΌλ‘œ μ²˜λ¦¬ν•˜μ˜€λ‹€.


πŸ‘¨β€πŸ‘©β€πŸ‘§β€πŸ‘¦ μŠ€ν„°λΈŒ νŒ€

  • Front: κ°•ν•œλΉ›(Github), κΉ€μ‹œμ˜₯(Github), μ‹ λ―Όμ² (Github)
  • Back: 김근보(Github), λ°•μ„±μš°(Github), ν•œμŠΉν¬(Github))
κ°•ν•œλΉ› κΉ€μ‹œμ˜₯ πŸš©μ‹ λ―Όμ²  πŸš©κΉ€κ·Όλ³΄ λ°•μ„±μš° ν•œμŠΉν¬
image (7) image (3) image (2) image (6) image (5) image
FRONT-END FRONT-END FRONT-END BACK-END BACK-END BACK-END

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors