1 of 52

임찬수 김자운 김용성

김금동 김주영 이도연

최세영 조은비

2조:: 오아오팀

oao-voice.com

2 of 52

올보이스: 전문 성우 오디오 매칭

we make voice: 텍스트 기반 AI 음성 제작

Mewpot: 부분 유료 효과음 제공

기존 보이스기반 서비스들

Project 배경

Project 소개

기술

고객반응 / 개선점

Frontend

Backend

최종성과 / 지표

Appendix

One And Only Voice

3 of 52

Project 배경

Project 소개

기술

고객반응 / 개선점

Frontend

Backend

최종성과 / 지표

Appendix

One And Only Voice

오아오

전문성이 요구되는 기존 서비스의 허들을 낮추고

자유롭게 목소리로 커뮤니케이션 할 수 있는 서비스로

보다 편하고 재미있게

목소리 재능을 소비할 수 있는

플랫폼을 만들고자 하였습니다.

4 of 52

하나뿐인 나의 목소리를 뽐내고 홍보도 하고 수익도 내보자 !

특별한 목소리가 필요한데?

특별한 목소리가 필요하면 직접의뢰를 해보세요!

목소리로 자유롭게 커뮤니케이션이 가능해요!

Project 배경

Project 소개

기술

고객반응 / 개선점

Frontend

Backend

최종성과 / 지표

Appendix

One And Only Voice

5 of 52

Project 배경

Project 소개

기술

고객반응 / 개선점

Frontend

Backend

최종성과 / 지표

Appendix

One And Only Voice

6 of 52

아키텍처

아키텍처

Project 배경

Project 소개

기술

고객반응 / 개선점

Frontend

Backend

최종성과 / 지표

Appendix

One And Only Voice

7 of 52

공통목표: 모든 디바이스에서 재생 가능한 환경 제공

데스크탑, 모바일(Android, iOS)

모든 디바이스에서 목소리 데이터를

재생 가능한 환경 만들기

Project 배경

Project 소개

기술

고객반응 / 개선점

Frontend

Backend

최종성과 / 지표

Appendix

One And Only Voice

8 of 52

Project 배경

Project 소개

기술

고객반응 / 개선점

Frontend

Backend

최종성과 / 지표

Appendix

One And Only Voice

공통목표: 모든 디바이스에서 재생 가능한 환경 제공

Android 녹음본 iOS에서 재생 불가

from Android

from

iOS

from Android

from

iOS

9 of 52

Project 배경

Project 소개

기술

고객반응 / 개선점

Frontend

Backend

최종성과 / 지표

Appendix

One And Only Voice

공통목표: 모든 디바이스에서 재생 가능한 환경 제공

MIME Type or 확장자의 문제?

브라우저 지원 상태의 문제?

컨버팅 문제?

컨버팅 프로그램을 사용한 경우

모든 디바이스 호환이 보장됨

을 통한 컨버팅 방법을 모색

10 of 52

Project 배경

Project 소개

기술

고객반응 / 개선점

Frontend

Backend

최종성과 / 지표

Appendix

One And Only Voice

공통목표: 모든 디바이스에서 재생 가능한 환경 제공

from

Android

from

iOS

컨버팅

from

Android

from

iOS

Android 녹음본만 컨버팅

S3

converted

audio

11 of 52

Project 배경

Project 소개

기술

고객반응 / 개선점

Frontend

Backend

최종성과 / 지표

Appendix

One And Only Voice

공통목표: 모든 디바이스에서 재생 가능한 환경 제공

호환성이 높은 mp3 포맷을 선택

12 of 52

클라이언트에

부담 줄이기

프론트엔드 목표

1.

Project 배경

Project 소개

기술

고객반응 / 개선점

Frontend

Backend

최종성과 / 지표

Appendix

One And Only Voice

브라우저 로딩이 길어지거나 이로 인해

업로드 등의 작업이 실패할 경우 대비

글로벌

상태관리

2.

플레이어, 채팅기능을 모든 페이지에서

재생하거나 알림을 받을 수 있도록하여

좀 더 편리한 앱사용을 가능하게함.

13 of 52

스켈레톤UI & 무한스크롤

Project 배경

Project 소개

기술

고객반응 / 개선점

Frontend

Backend

최종성과 / 지표

Appendix

One And Only Voice

많은 양의 데이터를 조회 해야하는 카테고리분류, 검색, 채팅 페이지에서 데이터를 한번에 받아오면 로딩 시간이 길어지고 브라우저가 렌더링 할 수 있는 양 보다 데이터가 많아질 수도 있는 위험성이 있음

사용성이 좋고 모바일 환경에서도 콘텐츠를 보여주기에 가장 직관적인 무한스크롤 적용

14 of 52

스켈레톤UI & 무한스크롤

Project 배경

Project 소개

기술

고객반응 / 개선점

Frontend

Backend

최종성과 / 지표

Appendix

One And Only Voice

많은 양의 데이터를 조회 해야하는 카테고리분류, 검색, 채팅 페이지에서 데이터를 한번에 받아오면 로딩 시간이 길어지고 브라우저가 렌더링 할 수 있는 양 보다 데이터가 많아질 수도 있는 위험성이 있음

사용성이 좋고 모바일 환경에서도 콘텐츠를 보여주기에 가장 직관적인 무한스크롤 적용

15 of 52

녹음 시 메모리 누수 관리

url등록되는 부분

해제

  • 메모리 누수를 방지하기 위해 생성된 URL을 해제

Project 배경

Project 소개

기술

고객반응 / 개선점

Frontend

Backend

최종성과 / 지표

Appendix

One And Only Voice

16 of 52

클라이언트에

부담 줄이기

프론트엔드 목표

1.

Project 배경

Project 소개

기술

고객반응 / 개선점

Frontend

Backend

최종성과 / 지표

Appendix

One And Only Voice

브라우저 로딩이 길어지거나 이로 인해

업로드 등의 작업이 실패할 경우 대비

글로벌

상태관리

2.

플레이어, 채팅기능을 모든 페이지에서

재생하거나 알림을 받을 수 있도록하여

좀 더 편리한 앱사용을 가능하게함.

17 of 52

Project 배경

Project 소개

기술

고객반응 / 개선점

Frontend

Backend

최종성과 / 지표

Appendix

One And Only Voice

글로벌 상태관리: 목소리 플레이어

  • 모든 페이지에서 하나의 상태로 어떻게 관리 할 것인가?
  • 플레이어와 플레이 리스트의 상태를 어떻게 같게 할 것인가?

18 of 52

Project 배경

Project 소개

기술

고객반응 / 개선점

Frontend

Backend

최종성과 / 지표

Appendix

One And Only Voice

글로벌 상태관리: 목소리 플레이어

  • 모든 페이지에서 하나의 상태로 어떻게 관리 할 것인가?
  • 플레이어와 플레이 리스트의 상태를 어떻게 같게 할 것인가?

GlobalPlayer Component

const getPlayerInstance = () => {

const player = PlayerRef.current.audio.current;

dispatch(playerActions.setPlayer(player));

};

Redux store - globalPlayer module

const initialState = {

playerInstance: null,

play_list: [],

now_track: {},

};

각 컴포넌트에서 플레이 정보를 렌더링 할때�playerIntance.pause 상태 / now_track 정보를 참조하여

다시 그려질 화면정보를 바꾸어줌

컴포넌트 마운트 시점에서 audio 정보를 리덕스 상태에 저장

오디오가 플레이 될때마다 현재 재생되고있는 오디오 정보를 저장

19 of 52

Project 배경

Project 소개

기술

고객반응 / 개선점

Frontend

Backend

최종성과 / 지표

Appendix

One And Only Voice

글로벌 상태관리: 실시간 채팅 메시지

  • 채팅방 밖에서 신규 메시지 수신상태를 어떻게 확인 할 수 있을까?

useEffect(() => {

const uid = newGetCookie("uid");

if (!uid) {

return;

}

chat?.on("list", (data) => {

receiveGlobalMessage(data);

});

}, [chat]);

  • 자신이 속한 채팅방 최신 메시지 정보상태를 저장하여 확인

20 of 52

Project 배경

Project 소개

기술

고객반응 / 개선점

Frontend

Backend

최종성과 / 지표

Appendix

One And Only Voice

백엔드 개발 목표

보안 구성 강화

1.

비용절감 서버 구축

2.

21 of 52

To recover your lost Database send 0.005 Bitcoin (BTC) to our Bitcoin address: bc1qwdv2mky6a5cqcspg4yju2zhtmk3msxrqdwdagh After this, contact us by email with your Server IP or Domain Name and a Proof of Payment (Payment ID). Your Database is downloaded and backed up on our servers. Backups that we have right now: Z_README_TO_RECOVER, voice. Any email without your server IP Address or Domain Name and a Proof of Payment together will be ignored. If we don’t receive your payment in the next 10 Days, we will delete or leak your sensitive information.

Database 해킹 이슈

  • Database 안에 모든 데이터가 사라지고 경고문구만 남음.

  • 이후 Database 보안 강화를 위해 VPC 보안 구성 강화�(network acl, security group, public subnet, private subnet)

Project 배경

Project 소개

기술

고객반응 / 개선점

Frontend

Backend

최종성과 / 지표

Appendix

One And Only Voice

보안 구성 강화

22 of 52

Project 배경

Project 소개

기술

고객반응 / 개선점

Frontend

Backend

최종성과 / 지표

Appendix

One And Only Voice

보안 구성 강화

23 of 52

비용절감 서버 구축

Project 배경

Project 소개

기술

고객반응 / 개선점

Frontend

Backend

최종성과 / 지표

Appendix

One And Only Voice

원인 : t2.medium 서버 사용

해결 : t2.micro 서버로 변경

1. 젠킨스로 build할때 프론트 서버 다운

t2.medium => t2.micro변경하면서 생기는 문제

2. (ndriver controller+ 젠킨스) 서버 다운

3. 성능문제

서버 비용 과다 부과

24 of 52

Project 배경

Project 소개

기술

고객반응 / 개선점

Frontend

Backend

최종성과 / 지표

Appendix

One And Only Voice

t2.medium=>t2.micro변경하면서 생기는 문제 _ 1

→ 젠킨스로 build할때 프론트 서버 다운

프론트 build 안하고 있을때 메모리 사용량 : 138MB

젠킨스로 프론트 build할 때 메모리 사용량 : 757MB ~ 950MB

비용절감 서버 구축

ㅇㅇ메모리 부족

25 of 52

Project 배경

Project 소개

기술

고객반응 / 개선점

Frontend

Backend

최종성과 / 지표

Appendix

One And Only Voice

kswapd0(가상메모리 관리 프로그램) → cpu과다점유 → 프론트 빌드 서버 다운

  • 해결 방안 : t2.micro(메모리: 1GB) → t2.small(메모리: 2GB)

비용절감 서버 구축

t2.medium=>t2.micro변경하면서 생기는 문제 _ 1

→ 젠킨스로 build할때 프론트 서버 다운

26 of 52

Project 배경

Project 소개

기술

고객반응 / 개선점

Frontend

Backend

최종성과 / 지표

Appendix

One And Only Voice

원인 : ngrinder-controller(550MB) + jenkins(500MB)> t2.micro(1GB)

비용절감 서버 구축

t2.medium=>t2.micro변경하면서 생기는 문제 _ 2

→ (ngrinder controller+ 젠킨스) 서버 다운

  • 해결 방안 : t2.micro(메모리: 1GB) → t2.small(메모리: 2GB)

27 of 52

Project 배경

Project 소개

기술

고객반응 / 개선점

Frontend

Backend

최종성과 / 지표

Appendix

One And Only Voice

안정적

불안정적

동시접속 100명 5분 요청

t2.medium

t2.micro

비용절감 서버 구축

t2.medium=>t2.micro변경하면서 생기는 문제 _ 3

→ t2.micro 서버의 성능 문제

28 of 52

Project 배경

Project 소개

기술

고객반응 / 개선점

Frontend

Backend

최종성과 / 지표

Appendix

One And Only Voice

불안정하지만 서버 유지

3분 후 서버다운

동시접속 150명 5분요청

t2.medium

t2.micro

비용절감 서버 구축

t2.medium=>t2.micro변경하면서 생기는 문제 _ 3

→ t2.micro 서버의 성능 문제

29 of 52

Project 배경

Project 소개

기술

고객반응 / 개선점

Frontend

Backend

최종성과 / 지표

Appendix

One And Only Voice

해결 방안 : auto scaling 적용 후 부하 테스트 진행

scale out/in 조건

�5분에 cpu 40% 이상 이면 ec2하나씩 늘어남

�5분에 cpu 10% 이하 되면 ec2하나씩 줄어듦

비용절감 서버 구축

t2.medium=>t2.micro변경하면서 생기는 문제 _ 3

→ t2.micro 서버의 성능 문제

동시접속 50명, 30분

scale out (MAX 3ea)

동시접속 100명, 30분

scale out (MAX 4ea)

30 of 52

Project 배경

Project 소개

기술

고객반응 / 개선점

Frontend

Backend

최종성과 / 지표

Appendix

One And Only Voice

0.0576USD/hour * 1198 won/USD * 24hour *7(t2.medium)

= 11,592won

ec2 유지비용 85%절감

0.0288USD/hour * 1198won/USD * 24hour *2(t2.small) + 프리티어(0원)

= 1,656won

비용절감 서버 구축

t2.medium=>t2.micro변경하면서 생기는 문제 _ 3

→ t2.micro 서버의 성능 문제

t2.medium

t2.small�t2.micro�(+ auto scaling)

31 of 52

  • OAO 서비스의 대해 만족스러웠던 기능은 무엇이 있을까요 ?

  • 개선해야 할 점
  • 목소리를 올리는 것의 그치지 않고 무언가 흥미를 유발시켜야 할 요소가 필요함
  • UX의 대해서 개선해야 할 점 존재 (프로필 수정시 건너뛰기가 오른쪽 아래에 있는점/ 픽스 완료)
  • 추천태그기능이나 관련검색어 기능추가/ 직접태그설정 기능
  • 채팅기능의 분명한 목적의 가이드라인 제시(녹음의뢰, 바로녹음, 파일첨부 등등)

Project 배경

Project 소개

기술

고객반응 / 개선점

Frontend

Backend

최종성과 / 지표

Appendix

One And Only Voice

32 of 52

Project 배경

Project 소개

기술

고객반응 / 개선점

Frontend

Backend

최종성과 / 지표

Appendix

One And Only Voice

프로필 편집 후 우측 하단의

건너뛰기 버튼을 누르게 된다는

사용자 의견

33 of 52

Project 배경

Project 소개

기술

고객반응 / 개선점

Frontend

Backend

최종성과 / 지표

Appendix

One And Only Voice

프로필 편집 후 우측 하단의

건너뛰기 버튼을 누르게 된다는

사용자 의견

ux를 고려하여 버튼 위치와 크기 변경

34 of 52

Project 배경

Project 소개

기술

고객반응 / 개선점

Frontend

Backend

최종성과 / 지표

Appendix

One And Only Voice

채팅을 어디서 해야할지 모르겠다는 사용자 의견

35 of 52

Project 배경

Project 소개

기술

고객반응 / 개선점

Frontend

Backend

최종성과 / 지표

Appendix

One And Only Voice

채팅을 어디서 해야할지 모르겠다는 사용자 의견

다른 페이지에도 버튼을 추가하여

경로를 더 직관적으로 보이게 함

36 of 52

Project 배경

Project 소개

기술

고객반응 / 개선점

Frontend

Backend

최종성과 / 지표

Appendix

One And Only Voice

채팅에서 샘플요청 할 수 있다는 것을 인지하지 못함

37 of 52

Project 배경

Project 소개

기술

고객반응 / 개선점

Frontend

Backend

최종성과 / 지표

Appendix

One And Only Voice

채팅에서 샘플요청 할 수 있다는 것을 인지하지 못함

기능을 학습할 수 있는 ui로 변경

38 of 52

OAO 팀의 개발 스토리가 궁금하시다면

2조 부스를 찾아주세요!

끝까지 들어주셔서 감사합니다.

39 of 52

  1. UI, UX 디테일에 대해 디자이너에게 맡기지 않고 프론트엔드 개발자로서 참여하였나요?

  • 단순하게 디자이너분들의 작업물을 받아서 구현하는게 아니라 , UX/UI 적으로 불편한 요소가 있다면 매일 미팅하여 조금 더 사용자에게 편리한 공간을 만들기 위해 노력하였습니다.

  • 검색이나 태그 설정시 추천기능은 없나요 ? 만약 추가한다면 어떤식으로 구현이 될까요?

  • 추가기능으로 고려했엇던 사항이였고 검색페이지가 비어있어 추천검색어나 관련검색어 같은 걸 넣으면 좋겠다는 생각을 했다. 지금 바로 생각되는 기능으로는 HTML Datalist Tag를 사용하여 넣을 수 있을거 같다고 생각한다.

  • LCP 측정은 해보셨는지 ? 결과값은 얼마인지 ?

  • 22.5초가 나왔고 최종 성능 점수는 53 점이 나왔다.

만족스럽지 않은 결과이고 이를 개선하기 위해

필요하지않은 주석 및 콘솔을 삭제하고 렌더링 최적화를

위해서 노력하겠습니다. 그리고 로딩이 길어도 지루하지

않도록 SkeletonUI를 만들어 로딩중에도 심심하지 않게

만들었습니다.

Project 배경

Project 소개

기술

고객반응 / 개선점

Frontend

Backend

최종성과 / 지표

Appendix

One And Only Voice

40 of 52

4. 재방문율을 높이기 위해 랭크 시스템을 만들어보았습니다.

  • 저희 사이트에 굳이 재방문해야할 이유가 없다고 느껴서, 사용자들이 다시 한번더 들어오고 , 사용 할 수 있게 랭크시스템을 도입 했고 ,랭크시스템은 좋아요갯수,댓글수 , 게시물등록수를 측정하여 랭크를 측정하였고, 가장 랭킹이 높은 순위를 주별로 모아서 상품을 나눠드리려고 하였습니다.

5. 공급자와 수요자(의뢰자)간의 직접연결을 위하여 채팅기능을 넣었습니다.

  • 연결을 위해 직접채팅을 만들었고 채팅방 안에서 기능으로 샘플요청, 녹음, 이미지업로드, 파일첨부 등의 기능을 넣어서 채팅창 안에서도

사용자간의 원활한 수요 공급이 이루어 질 수 있도록 하였습니다.

Project 배경

Project 소개

기술

고객반응 / 개선점

Frontend

Backend

최종성과 / 지표

Appendix

One And Only Voice

41 of 52

Project 배경

Project 소개

기술

고객반응 / 개선점

Frontend

Backend

최종성과 / 지표

Appendix

One And Only Voice

1. MYSQL, sequelize 사용

  • 테이블 간에 연관되어 있는 데이터가 많기 때문에 수정, 삭제가 일괄적으로 이루어질 수 있게 채택

2. 녹음 파일 컨버팅

  • 안드로이드에서 녹음한 파일이 아이폰 환경에서 재생이 안되는 현상이 발생함. 이에 ffmpeg를 사용해 .mp3 확장자로 컨버팅 후 업로드함. (아이폰에서 ffmpeg를 사용하게 되면 재생시간이 1초로 줄어드는 현상이 발생했기 때문에 사용자의 디바이스가 아이폰이면 컨버팅을 진행하지 않게함)�
  • 트랙 업로드 api에서 컨버팅 이후 s3에 업로드 이전에 클라이언트로 리턴되는 경우가 발생함. → 트랙 업로드 api가 순차적으로 작동될 수 있게 수정.

3. helmet, express-rate-limit, hpp 사용

  • 데이터베이스 해킹 이후에 보안 라이브러리 적용, 1초에 최대 15번의 요청만 가능하게 적용

42 of 52

Project 배경

Project 소개

기술

고객반응 / 개선점

Frontend

Backend

최종성과 / 지표

Appendix

One And Only Voice

4. 공통된 요소를 모듈화 하려고 노력

  • 1. errorHandler�→ 모든 api 에서 사용할 수 있는 공통된 에러 모듈�
  • 2. auth-middleware�→ 사용자 인증이 필요한 api에서 사용하는 인증 모듈�
  • 3. uploader, converter, s3Uploader�→ 이미지, 녹음파일 업로드에 사용할 모듈�→ 메인페이지 녹음파일 업로드와 채팅 녹음파일 업로드에 �사용할 컨버팅모듈�→ AWS S3 업로드를 위한 모듈

43 of 52

Project 배경

Project 소개

기술

고객반응 / 개선점

Frontend

Backend

최종성과 / 지표

Appendix

One And Only Voice

5. jenkins를 이용한 자동배포 인프라 구축

  • 개발 인원들 끼리 서로 맞춰가며 기능의 수정이나 추가할 일이 빈번했기 때문에 자동배포 인프라를 구축 하였음.�
  • 개발용 테스트 서버와 프로덕션용 서버를 분리하였음. release 브랜치에 푸쉬할 경우 개발용 테스트 서버로 자동 배포되고, �main 브랜치에 푸쉬할 경우 프로덕션용 서버로 자동 배포 되게 구축.�

개발용 테스트 서버 스크립트

프로덕션용 서버 스크립트

44 of 52

Project 배경

Project 소개

기술

고객반응 / 개선점

Frontend

Backend

최종성과 / 지표

Appendix

One And Only Voice

6. 프론트 자동배포를 위한 노력

  • 처음 프론트는 firebase에서 배포하고 벡엔드는�aws에서 배포하여 젠킨스로 통합하여 관리하기 불편

  • 프론트배포까지 aws로 관리하여 자동배포 인프라 구성

  • github 브랜치에 변경사항을 푸시 또는 머지하면

젠킨스에서 프론트 빌드를 한 후 정적파일을 aws s3에 올린 후

aws cloudfront가 CDN서버에서 정적파일을 제공하는 구조�

7. 개발자가 Private subnet에 있는 RDS와 통신하는 방식

  • 개발을 하면서 실제 데이터베이스를 보면서 테스트를 해야하는데 rds가 � private subnet에 있고 public access를 제한하여 직접적으로 통신할 수 없음�
  • bastion host방식으로 특정 ec2를 거쳐야만 workbench를 통해 rds의 데이터를 볼 수 있도록 하였음

실제 젠킨스 서버가 실행하는 스크립트

45 of 52

Project 배경

Project 소개

기술

고객반응 / 개선점

Frontend

Backend

최종성과 / 지표

Appendix

One And Only Voice

8. Auto scaling의 scale out/in의 기준

  • t2.micro는 동시접속자 25명일때 안정적으로 받아줄 수 있음�50명부터 불안정해짐

  • 동접 50명이 5분간 들어오는 걸 테스트한 결과 cpu사용률 50%,�동접 100명일때 5분간 들어오면 cpu사용률 70%�동접 150명일때는 서버다운�
  • 이 데이터를 기준으로 5분동안 cpu사용률 40% 이상이면�1개씩 늘림(최대 3개)�
  • 최대 3개인 이유는 t2.micro 하나당 storage 8GB이고�t2.micro storage를 30GB이상 쓰면 storage유지비용이 �나가기 때문에 최대 3개까지만 늘려서 동접이 많아져서 �3개가 유지되도 storage 유지비용은 안내도록함�
  • 어떤 서비스를 이용해도 cpu사용률이 10%가 넘지 않기 때문에�scale in의 기준은 5분간 cpu사용률 10%이하로 잡아서� 차등적으로 1개씩 줄어들음�
  • 결과적으로 50~100명이 동시에 들어와도 안정적인 서비스 제공�(단, 실제로는 워밍업 시간까지 포함하여 12~13분에 �서버가 3개까지 생겼을 때를 가정)�

CPU 사용률

50명 동시접속 5분=>cpu 50%�(2번요청)

100명 동시접속 5분=>cpu 70%

6분

12분

46 of 52

Project 배경

Project 소개

기술

고객반응 / 개선점

Frontend

Backend

최종성과 / 지표

Appendix

One And Only Voice

9. Auto scaling group의 Launch template버전 문제

  • 단일 ec2를 썼을 때는 젠킨스로 그 ec2에 대해서만�버전 업그레이드하면 웹서버에 적용됨.�
  • auto scaling의 경우 기존 방식대로 할 수 없어서 �launch template버전이 업그레이드 안됨.�
  • 먼저, launch template이 생성될 때 업그레이드된 �버전으로 시작하기 위해서 user data를 이용하여 �ec2가 생성되자마자 업그레이드 된 버전으로 적용됨�
  • 이미 생성된 ec2는 인스턴스는 젠킨스를 이용하여 �인스턴스 새로고침으로 버전을 업그레이드함�

Auto scaling group에 적용된 사용자 데이터

47 of 52

Project 배경

Project 소개

기술

고객반응 / 개선점

Frontend

Backend

최종성과 / 지표

Appendix

One And Only Voice

10. socket-io 를 활용한 채팅 기능 구현

  • socket-io는 레퍼런스가 많고, 러닝커브가 낮아 짧은 기간에 채팅 기능을 구현하기에 적합하다고 판단 (namespace, room)�
  • 채팅방을 제외한 글로벌에서 채팅에 대한 실시간 알림을 받기 위해 사용자 로그인 시 각각 개인의 room으로 join하게 구현하였음.

48 of 52

트러블 슈팅 관련

글로벌 플레이어 상태 동기화

DB 해킹 이슈

Checkbox 중복 불가 처리

!

녹음 데이터 업로드

!

!

태그 삭제 시 데이터 관리하기

!

!

에러 미들웨어 customized

!

49 of 52

트러블 슈팅

Input Checkbox 기능

  • 처음에는 input radio 기능을 사용하여 관리하려고 하였으나, 체크해제가 안되는 문제점 발견

  • radio 를 체크가 되게끔 하는 로직을 구현하려 하였으나 정보 부족으로 checkbox로 갈아탐

  • checkbox를 중복이 안되게끔 하기 위해 구글링하여 코드 참조

  • 상위 컴포넌트에서 Ref 을 사용해 check된 인풋을 특정하고 ,

그인풋의 데이터를 하위컴포넌트로 넘겨준다 ,

하위컴포넌트에서 querySelectorAll 을 사용해 모든 인풋을 불러오고

all인풋의 checked된 속성이 >=1 일때

상위에서 불러온 인풋만 빼고 all인풋을 checked 속성을 false로 만들어 주었습니다 .

50 of 52

트러블 슈팅

목소리 녹음 기능

  • 녹음한 정보를 재생하려면?
  • 업로드를 위한 파일은 어떻게 만들것인가?

�글로벌 플레이어 상태관리

  • 모든 페이지에서 하나의 상태로 어떻게 관리 할 것인가?
  • 플레이어와 플레이 리스트의 상태를 어떻게 같게 할 것인가?

const getVoiceBlobUrl = () => {

const voice_blob = new Blob(chunks, { type: "audio/mp4" });

const url = URL.createObjectURL(voice_blob);

// 실제 서버로 넘길 보이스 파일 데이터 객체

setVoiceFile({

file: voice_blob,

type: "record",

url,

});

return url;

};

<audio /> 참조�playerRef.current.src = url

chunks data -> blob object

51 of 52

트러블 슈팅

목소리 녹음 기능

  • 녹음한 정보를 재생하려면?
  • 업로드를 위한 파일은 어떻게 만들것인가?

글로벌 플레이어 상태관리

  • 모든 페이지에서 하나의 상태로 어떻게 관리 할 것인가?
  • 플레이어와 플레이 리스트의 상태를 어떻게 같게 할 것인가?

GlobalPlayer Component

// 컴포넌트 마운트 시점에서 audio 정보를 리덕스 상태에 저장

const getPlayerInstance = () => {

const player = PlayerRef.current.audio.current;

dispatch(playerActions.setPlayer(player));

};

Redux store - globalPlayer module

const initialState = {

playerInstance: null,

play_list: [],

now_track: {}, // 오디오가 플레이 될때마다 현재 재생되고있는 오디오 정보를 저장

};

각 컴포넌트에서 플레이 정보를 렌더링 할때�playerIntance.pause 상태 / now_track 정보를 참조하여

다시 그려질 화면정보를 바꾸어줌

52 of 52

트러블 슈팅

선택한 태그들을 history.push로 url값에 넣어서 받아오는 걸로 구현하려고 했다.

내가 생각한 로직

1.useParams를 사용해서 태그들을 가져온다.

2.가져온 params값을 useEffect와 useState를 이용해서 바뀐 tag값을 만들어 주고 tag를 map돌려서 출력

->삭제버튼에 onclick을 달아서 필터링하여

삭제기능을 구현

문제

url값이 삭제되지 않아 이 방법으로는

구현하기가 어려울 것 같음

최종=>

1.history를 이용하여 객체형태로 state넘기기

2.props로 넘겨준 state를 받아와서 삭제된 데이터를 다시 dispatch하고 다시 load해오기

태그 삭제하기

1

3

2