μ°λ¦¬λ¬Έν
νκΆλ
λ₯Ό μΈκ³μ ν보νκΈ° μν μΉ κΈ°λ°AI 체νν μ½ν μΈ
μλΉμ€,Black Belt: Master of Taekwondo
μ§μμ μ½κ³ μ¬λ―Έμκ² νκΆλλ₯Ό νμ΅ν μ μμ΅λλ€.
AI pose detection κΈ°μ μ΄ μ¬λ°λ₯Έ νκΆλ λμμ νμ΅ν μ μλλ‘ λμμ€λλ€.
μΆ©λΆν μ°μ΅ νμλ κ΅κΈ°μκ³Ό λμΌν λ°©μμΌλ‘ μ¬μ¬λ₯Ό λ°μ 보μΈμ. μ¬μ¬μ ν΅κ³Όνλ©΄ λ¨μ¦μ νλν©λλ€.
겨루기 κΈ°λ₯μ ν΅ν΄ μλμ 1:1λ‘ λ°°νμ μ§ννμ¬ μΉν¨λ₯Ό κ°λ¦΄ μλ μμ΅λλ€
νκΆλ μ§±μ΄ λκ³ μΆλ€λ©΄ μ§κΈλΆν° BlackBeltλ‘ μλ ¨μ μμνμΈμ!
β 3-1. Front-end
β 3-2. Back-end
β 3-3. AI
- νλ‘μ νΈλͺ : κ²μλ νλ 리며 [Black Belt: Master of Taekwondo]
- μλΉμ€ νΉμ§: AI λͺ¨μ μΈμμ ν΅ν νκΆλ νμ΅ web service
- μ£Όμ κΈ°λ₯
- νκΆλ λμ νμ΅ λͺ¨λΈ κΈ°λ° νκΆλ μ°μ΅ λ° μ¬μ¬
- WebSocketμ ν΅ν 겨루기 맀μΉ
- WebRtcκΈ°μ μ νμ©ν 겨루기 νλ©΄
- μ£Όμ κΈ°μ
- react 17.0.2
- recoil 0.6.1
- sockjs-client 1.6.0
- styled-components 5.3.3
- axios 0.26.1
- teachablemachine-pose 0.8.6
- spring boot 2.6.4
- maven 3.8.4
- nodejs 16.13.1
- openjdk 11
- ubuntu 20.04 LTS
- mysql 8.0.28
- docker + jenkins
- μ°Έμ‘° 리μμ€
- openvidu - webRtc
- λ°°ν¬ νκ²½
- κΈλ‘λ² μλΉμ€λ₯Ό μ§ν₯νλ μ ν¬ λΈλ벨νΈλ, λ²μ μλΉμ€λ₯Ό μ 곡ν©λλ€
- λ€λΉκ²μ΄μ λ°μμ μΈμ λ μ§ μνλ μΈμ΄λ‘ νΈνκ² λ°κΎΈμ΄λ³΄μ€ μ μμ΅λλ€
- μ°μ΅λͺ¨λ, μ¬μ¬λͺ¨λ, κ²¨λ£¨κΈ°λ‘ λλμ΄μ Έ μμ΅λλ€
- νκΆλ μμμ λ°°κ²½μΌλ‘ λμ΄ μ μ₯ν¨μ λνμ΅λλ€
1. κΈ°λ³Έλμ
- νκΆλμ 7κ°μ§ κΈ°λ³Έλμλ€μ νμ΅ν©λλ€
- λ 벨μ λ°λΌ μ€ν μ΄μ§μ μ κΈμ΄ ν΄μ λ©λλ€
- ν΄λΉ μ€ν μ΄μ§λ₯Ό ν΄λ¦¬μ΄ νλ©΄ μ νλμ λ°λΌ λ³μ 1κ°λΆν° 3κ°κΉμ§ μ»μ μ μμ΅λλ€
- λμ μΉ΄λ μμ λ§μ°μ€λ₯Ό μ¬λ € λμμ λν κ°λ¨ν μ€λͺ μ νμΈν μ μμ΅λλ€
- μμΈν μ€λͺ μ, μΉ΄λλ₯Ό ν΄λ¦μ μ°μ΅ νλ©΄μμ νμΈν μ μμ΅λλ€
2. μ°κ²°λμ & νμ
- νλμ νμλ₯Ό 4λ¨λ½μΌλ‘ λλμ΄ μ°μ΅ν μ μλλ‘
μ°κ²°λμ
μ½λλ₯Ό λ§λ€μμ΅λλ€ - μ°κ²°λμμ μ νν μ΅ν ν νμλ₯Ό μ°μ΅ν΄λ³΄μΈμ!
- μΉ΄λλ₯Ό λλ¬ μ°μ΅ μ€ν μ΄μ§λ‘ μ μ₯νλ©΄, μλ¨μ λμ μμκ° λͺ μλ©λλ€
- λͺ μλ λμμ μ ννκ² μ·¨νλ©΄ λ€μ λμμΌλ‘ λμ΄κ° μ μμ΅λλ€
-
겨루기 μΌλ°λͺ¨λμμλ μνλ μ¬μ©μλ₯Ό μ§μ ν΄ κ²¨λ£¨μ΄λ³Ό μ μμ΅λλ€
-
μλμ λλ€μμ κ²μνκ³ κ²¨λ£¨κΈ° μ μ²μ 보λ΄λ³΄μΈμ!
-
λ¨, μλκ° λ€λ₯Έ μ¬λκ³Ό 겨루기μ€μ΄κ±°λ λ‘κ·Έμμμ΄κ±°λ νΉμ μ¬μ¬μ€μΈ κ²½μ°, 겨루기 μ μ²μ λ³΄λΌ μ μμ΅λλ€
-
μ μ μ μνλ λλ€μ κ²μμ νλ©΄ μ΄λ¦ λ°λ‘ μλμ λνλ©λλ€
- μλκ° κ²¨λ£¨κΈ° μ μ²μ μλ½νλ©΄, νμ΄μ§μ μλμ μ λ³΄κ° λνλκ³ κ²¨λ£¨κΈ° μμ λ²νΌμ΄ νμ±νλ©λλ€
겨루기 μμ
λ²νΌμ λλ¬ κ²¨λ£¨κΈ°λ₯Ό μμν΄λ΄ μλ€!
- μλλ°©μ λν μμλ₯Ό κ°μΆκ³
νκΆλ κΈ°λ³Έ μ€λΉλμ
μ μ·¨νλ©΄, μΈκ³΅μ§λ₯μ΄ μ΄λ₯Ό μΈμνκ³ κ²¨λ£¨κΈ°κ° μμλ©λλ€ - λ°©μ΄ λμμ μ±κ³΅νλ©΄ μλ¨μ λ Έλμ λ°©ν¨ μ΄λͺ¨ν°μ½μ΄ λνλλ©°, 곡격μ μ±κ³΅νλ©΄ μλμκ² λ°λ―Έμ§ μ΄ννΈκ° λ€μ΄κ°λλ€
- 30μ΄ λμ μλμ 곡격μ λ§κ±°λ, 곡격μ νλ©΄μ μ΄μ¬ν 겨루μ΄λ΄ μλ€!
- λ΄ μ 보λ₯Ό νλμ νμΈν μ μλ λ§μ΄νμ΄μ§μ λλ€
- μ§κΈκΉμ§ νλν λ λ° λ¨μ¦μ νμΈν μ μμΌλ©° 겨루기μ κ΄λ ¨λ μ μ μ νμΈν μ μμ΅λλ€
- νλ‘νμ¬μ§ λ³κ²½ λ° λλ€μ λ³κ²½λ κ°λ₯ν©λλ€
- Reactλ₯Ό μ΄μ©ν΄ μΉ νμ΄μ§λ₯Ό ꡬννκ³ Recoil λ° React Queryλ₯Ό μ΄μ©ν΄ μνκ΄λ¦¬λ₯Ό μ§ννμ΅λλ€
- Styled Componentsλ₯Ό μ΄μ©ν΄ cssλ₯Ό ꡬννμ΅λλ€
- 겨루기λ₯Ό μν μΉμμΌμ SockJSλ₯Ό μ΄μ©νμ΅λλ€
- Atomic λ°©μμΌλ‘ κ°λ°μ μ§ννμ¬ μ»΄ν¬λνΈμ μ¬μ¬μ©μ±μ λμ΄κ³ νμκ³Ό λμμΈ ν΅μΌμ±μ λ§μ·μ΅λλ€
βββ _foundation
βΒ Β βββ colors
βΒ Β βββ icons
βΒ Β βββ translation
βΒ Β βββ typography
βββ api
βββ components
βΒ Β βββ atoms
βΒ Β βΒ Β βββ Buttons
βΒ Β βΒ Β βΒ Β βββ GoogleButton
βΒ Β βΒ Β βββ Evaluation
βΒ Β βΒ Β βββ Icons
βΒ Β βΒ Β βββ Texts
βΒ Β βΒ Β βββ Videos
βΒ Β βββ molecules
βΒ Β βΒ Β βββ Carousel
βΒ Β βΒ Β βββ DialogExtension
βΒ Β βΒ Β βββ Gyeorugi
βΒ Β βΒ Β βββ Layout
βΒ Β βΒ Β βββ Navbar
βΒ Β βΒ Β βββ Stream
βΒ Β βββ organisms
βΒ Β βΒ Β βββ ChangeNickModal
βΒ Β βΒ Β βββ LoginModal
βΒ Β βΒ Β βββ PushAlarm
βΒ Β βΒ Β βββ SignupModal
βΒ Β βΒ Β βββ TaekwondoModal
βΒ Β βΒ Β βββ Timer
βΒ Β βΒ Β βββ VideoRoom
βΒ Β βββ templates
βββ hooks
βββ pages
βΒ Β βββ Gyeorugi
βΒ Β βΒ Β βββ GyeorugiStage
βΒ Β βΒ Β βΒ Β βββ models
βΒ Β βΒ Β βββ Normal
βΒ Β βΒ Β βββ Rank
βΒ Β βββ MainPage
βΒ Β βΒ Β βββ SlideInfo
βΒ Β βββ Mypage
βΒ Β βββ Practice
βΒ Β βββ Promotion
βββ recoils
βββ style
βββ utils
Web Socket
- Spring Frameworkμμ λ μμ μ μΈ SockJS λΌμ΄λΈλ¬λ¦¬λ₯Ό μ ννμ¬ μΉμμΌ ν΅μ μ ꡬννμ΅λλ€
- ν΅μ κ·μ½μ μν΄ λ©μμ§ νλ‘ν μ½ STOMPλ₯Ό μ¬μ©νμ΅λλ€
-
λμ λ°©μ
- httpβws ν΅μ ν€λ μμ²μΌλ‘ νλ‘ν μ½ upgrade
- ServerμΈ‘ endpoiont μ€μ
- Client μΈ‘ μ§μ endpointλ‘ socket κ°μ²΄μμ±
- Server μΈ‘ μμ ν λ°μ΄ν° μ¬λ°ννλ λ©μλ μμ±
- Client μμΌλ°μ΄ν° send, receive
-
WebSocket API
κΈ°λ₯ | νλ‘ν μ½ | λμ | api | λ©μμ§ Type |
---|---|---|---|---|
κ°μΈμΈμ μμ± | ws | sub | api/que/user | LOGIN |
겨루기 μ μ² | ws | pub | api/que/user/{κ²μ€νΈ id} | INVITE |
μ μ² μλ½/κ±°μ | ws | pub | api/que/user/{νΈμ€νΈ id} | ACCEPT/REFUSE |
λκΈ°λ°© μ μ₯ | ws | pub | api/que/user/{νΈμ€νΈ id} | ENTER |
Server
- μλ² μ μ μ 보
server ip : j6a506.p.ssafy.io
client id : ubuntu
client pw : pemνμΌλ‘ λ체 (MM첨λΆνμΌ νμΈ, νμ μ΄μΈμ 곡μ κΈμ§)
- ν¬νΈ μ 보
ν¬νΈ λ²νΈ | μ΄λ¦ |
---|---|
22 | SSH |
53 | DNS |
80 | Redirected to Port 443 by nginx (docker) |
443 | Redirected to Port 3000 by nginx (docker) |
3000 | Frontend (Docker) |
5050 | MySQL (Docker) |
8000 | Backend (Docker) |
8080 | Jenkins Controller Web UI |
8447 | openvidu server https (Docker) |
8448 | openvidu server http (Docker) |
8888 | kurento media server (Docker) |
8888 | jupyter notebook (λΉνμ±ν) |
50000 | Jenkins TCP Agent Listener Port (Docker) |
- μλ² μ€κ³ μμΈ λ΄μ©
-
μ£ΌνΌν° μ μ μ 보 λ° μμΈ μ€λͺ - >
- server ip : j6a506.p.ssafy.io:8888
- httpsλ‘ νκΈ°μν΄ μ¬μ€ cert ν€λ‘ μ§νν΄μ ν¬λ‘¬μμ μμ νμ§ λͺ»ν νμ΄μ§λ‘ μΈμν©λλ€.
- μ£ΌνΌν° λ ΈνΈλΆ μ€μΉκ³Όμ
ꡬνν λͺ¨λΈ
-
κΈ°λ³Έλμ - 13κ°μ§ κΈ°λ³Έλμμ νλ¨ν΄μ£Όλ μΈκ³΅μ§λ₯ λͺ¨λΈ
-
μ°μλμ/νμ - 1μ₯~8μ₯, κ³ λ €, κΈκ° λ± νμλ³ 4κ°μ ꡬκ°μΌλ‘ λλ μ ν΄λΉ ꡬκ°μ λμμ ꡬλΆνλ μΈκ³΅μ§λ₯ λͺ¨λΈ
-
겨루기 - μΌκ΅΄λ§κΈ°, λͺΈν΅μ§λ₯΄κΈ°, λ°μ°¨κΈ° λ±μ λμμ ꡬλΆνλ μΈκ³΅μ§λ₯ λͺ¨λΈ
μ μ κ³Όμ
- μΈμμ μ νμ±μ λμ΄κΈ° μν΄ Teachable Machine μ¬μ©νμ΅λλ€
- κ° λμλ³ λ°μ΄ν°λ₯Ό μ§μ μμ§νκ³ μ μ νμ¬ νμ΅μμΌ°κ³ , κ° ν΄λμ€κ° μ ννκ² λμΆλλμ§ κ²μ¦νμ΅λλ€
- νμ΅λ λͺ¨λΈμ Frontendμ μ λ¬νμ¬ μλΉμ€λ₯Ό μμ±νμ΅λλ€