-
Notifications
You must be signed in to change notification settings - Fork 0
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Voice Room API 개발 #65
Conversation
add LiveKit dependency in build.gradle add LiveKit Cloud enviroment value in application.yml
add 2 Session Dto add 1 Token Request Dto
- add create Token code - add get Session & get RoomList code - add get participant code
add 5 seconds in RestTemplate request
now can connect LiveKit Room in web use token in https://meet.livekit.io/?tab=custom this controller use by Test controller (not apply Authorization)
- add dto - add dao & repository - add service & utils - add VoiceRoom Controller
test success
fix "showParticipant" return format ( [] & null ) add limit parameter -> Active Room first fix host url Env
voiceRoom.update(newName,newOrder); | ||
voiceRoomRepository.save(voiceRoom); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
해당 부분은 Dao로 옮기겠습니다.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
좋습니다! 영속 관련 코드를 다오단으로 옮기는 것이 더 좋아보입니다
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
livekit 공식문서가 복잡해보이던데 고생하셨습니다!! 다만 한번의 pr에 많은 양의 코드가 담겨있어 pr의범위를 조금 줄여주시면 코드를 이해하기 더 좋을거같습니다(사실 제가 보이스룸과 livekit 관련 로직을 잘 몰라서 발생한 이슈인 듯 합니다 하하)
추가적으로 컨트롤러단에서 request의 유효성 검사 이외의 더 강한 유효성 검사를 이야기 하셨는데, 서비스단과 영속성 계층에서의 어떤 유효성 검사를 이야기 하시는 걸까요??
저는 영속성 계층에서 db를 접근하여 얻어온 값이 우리가 원하는 형태인지를 확인하는 작업이 추가되어야 한다는 의미로 이해했는데, 이게 맞을까요??
@@ -43,7 +43,7 @@ public class VoiceRoomController { | |||
|
|||
//VoiceRoom 생성/수정 | |||
@PostMapping("") | |||
public BaseResponse<Boolean> createRoom( | |||
public BaseResponse<PostVoiceRoomDto.Response> createRoom( | |||
@PathVariable("spaceId") @NotNull long spaceId, | |||
@JwtLoginAuth Long userId, | |||
@Validated @RequestBody PostVoiceRoomDto.Request voiceRoomRequest, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
dto의 내부 클래스로 request, response를 분리하니 가독성이 더 좋은거 같네요! 저도 리펙토링시에 참고하겠습니다!!
voiceRoom.update(newName,newOrder); | ||
voiceRoomRepository.save(voiceRoom); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
좋습니다! 영속 관련 코드를 다오단으로 옮기는 것이 더 좋아보입니다
네 맞습니다. db에서 가져온 값이 유효한지, 원하는 값이 맞는지 확인하는 과정을 service단에 추가해야한다는 뜻이었습니다. 예를 들어, 요청한 voiceRoomId값이 실제로 존재하는지 검사하는 코드가 controller에 있습니다. 그래서 Service에서는 무조건 해당 id로 DB 검색을 하면 entity를 얻는다고 (null이 아니라고) 가정하고 코드를 작성했습니다. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
코드량이 꽤 많네요.. 고생하셨습니다!!
DTO 내부에 req, res 분리하는 방법 적용하는 걸 잊고 있었는데 덕분에 리마인드했습니다
저도 리팩토링 시에 적용해보겠습니다~
Space space = spaceUtils.findSpaceBySpaceId(spaceId); | ||
//이미 userSpace 존재 여부를 검사해서 null 검사는 생략함 | ||
|
||
if(!userSpaceDao.findUserSpaceByUserAndSpace(user,space).get().getUserSpaceAuth().toString().equals(MANAGER.getAuth())){ |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
p3: 해당 부분이 MemoryUserSpaceUtils
클래스 내에 isUserManager
메소드로 구현되어있는데 따로 사용하신 이유가 있을까요?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
유저가 해당 space 내에서 매니저 권한을 갖고 있는지 확인하는 메서드는 다른 컨트롤러에서도 공통적으로 사용될꺼같아 작성했습니다
아하 이해했습니당 이런 경우는 보이스룸 관련 api 뿐만아니라 공통적인 사항인거 같으니 DatabaseException 을 생성하여 "db 오류가 있습니다" 같은 에러메시지를 500 코드와 함께 띄워주는 방법도 있다고 들은거 같습니다! |
📝 요약
이슈 번호 : #49
Voice Room API 개발입니다.
등 API 명세서에 기반한 기능입니다.
자세한 request/response는 명세서를 참고해주세요.
🔖 변경 사항
주의
/Dto/LiveKitDto 파일에 하위 객체들인
GetTokenRequest
/LiveKitSession
/LiveKitSessionResponse
들과,LiveKitController
/LiveKitService
객체들은 LiveKit 연결 확인을 위한 테스트 객체입니다.따라서 무시하셔도 됩니다.
( LiveKit~ 붙은 클래스중
LiveKitUtil
을 제외하면 전부 테스트 용입니다.)공통 사항
soft delete를 JPA에서 처리 하기 위한 공통 코드 혹은 규칙
데이터를 삭제하기 위해
BaseEntity
에 status값을 "INACTIVE
" or "DELETED
"로 바꿔줘야합니다.그리고 모든 jpa 쿼리에
status
를 필터링해서 값을 검색해야 합니다.이 과정을 하나의 코드로 어떻게 처리 할 건지 한번 통일하면 좋을 것 같습니다.
Exception과 response
통일된 처리와 handler를 정의해야합니다.
따로 Issue 등록해서 올리겠습니다.
VoiceRoom API
Dto 객체 복잡성
dto 객체가 많고 변환과정이 복잡합니다.
LiveKit Room API, LiveKit participant API, DB에서 가져온 객체들과 응답에 담기 위한 객체들이 많습니다.
좀 더 단순화할 방법을 찾거나, 이름 정리 리팩토링 필요합니다.
더 강한 유효성 검사 필요
보이스룸에 참가 중일때 보이스룸의 정보가 수정되는 경우
LiveKit WebRTC server와 백엔드 서버가 분리되어있어서, DB와 livekit server 데이터 간에 일관성이 깨지는 경우를 더 고려할 필요가 있습니다.
controller 이후에 DB가 변경되는 경우
현재 유효성 검사 관련 코드가 Controller에 몰려 있습니다.
막상 개발을 다하고 나니, 'controller에서 유효성 검사를 통과했는데, service 단에서 다른 사용자가 DB를 수정하면 예외가 발생 할 수 있겠다'라는 사실을 뒤늦게 깨달았습니다.
Service 계층과 Dao 계층에도 유효성 검사 코드를 추후에 추가 하겠습니다.
병렬성 추가 및 반복문 리팩토링
LiveKit은 별도의 서버입니다. 현재 Room의 정보 or 참가자 정보를 가져오기 위해서는 우리 서버에서 다른 서버로 API요청을 보내야합니다. 따라서 지연이 발생합니다.
또 room과 참가자는 List이기 때문에, 현재 반복문을 통해 liveKit API를 호출합니다.
참가자가 많거나 방의 개수가 많을 경우 지연이 더더 늘어나게 됩니다. (O(n)?)
Room
안에Participant
이 있는 구조라서 반복문도 중첩되는 코드라서 최적화 리팩토링이 필요합니다.테스트 코드 작성 필요성
위 문제들이 복잡해서 이를 검증하는 테스트 코드가 있으면 좋겠다고 생각한다.
또한 Postman을 사용하는 검증 과정이 느리고 한계도 있기 때문에 더더욱 필요하다.
📸 확인 방법 (선택)
application.yml에 LiveKit 관련 환경변수를 추가하고 주입해줘야합니다. (노션->KEY->LiveKit)
"token"을 발급 받는 API를 통해서 liveKit 토큰을 발급받아서(응답
Authorization Header
) 다음 페이지에서 LiveKit의 WebRTC 연결을 테스트 해볼 수 있습니다."https://meet.livekit.io/?tab=custom"
LiveKit Server URl 칸에 "wss://space-biwhq7u2.livekit.cloud" 입력
Token 창에 발급 받은 token 입력