[프로젝트 진행] ERD & SpringBoot-Backend Code 구현

Nam_JU·2022년 11월 20일
0

WebRTC-Project

목록 보기
9/18
post-thumbnail

문제상황

우리팀은 WebRTC가 정상적으로 실행하는 것에도 어려움을 겪었기 때문에 데이베이스는 없는 상태로 서비스를 만들었다.

  • ELK를 사용할때 데이터값이 휘발됨
  • 쿠버네티스 환경에서 다수의 프론트 파드, 서비스 파드가 생겼을때 데이터베이스가 없으니 커넥션 문제도 생겼다.
  • 급하게 데이터베이스를 적용시키기 위해 데이터베이스를 관리하는 서비스 로직을 구현해야했다
    이곳은 지옥....

서비스 로직


  • 여태까지 프론트 서버와 Signaling Server역할을 해준 Flask 두개만 사용하여 서비스를 운영했다.
  • 여기서 데이터베이스가 필요해지면서 프론트 요청을 Validation해줄 서비스를 만들 필요성이 생겼고 시간이 촉박하기 때문에 익숙한 언어인 스프링부트를 사용하여 처리해주기로 했다.
  • 즉, 스프링부트는 Signaling Server가 커넥션 맺기 전에 예외처리와 데이터베이스 저장 역할을 해준다
  • 서비스 흐름 : 클라이언트 요청 -> 프론트서버 요청 -> 백엔드는 서버 요청에 따른 데이터베이스를 확인 후 응답 -> 프론트는 응답결과에 따른 내용을 Signaling Server에게 전달 -> 커넥션

ERD


  • 테이블이 두개밖에 없으니 간단하다고 생각했었던 과거의 우리 ...
  • 데이터 값 자체가 어느정도 정규화 되어있었기 때문에 R-DBMS를 사용
  • 시그널링 서버와 커넥션 문제로도 많은 에러를 겪을것을 직감했기에 채팅 테이블은 만들지 않았다

API


  • 일반적으로 회원가입을 하고 난뒤 방을 만드는 서비스와 다르게 Eyes-Talk은 방을 생성과 동시에 유저도 생성이 된다.
  • 화상통화 룸 입장도 마찬가지로 입장과 동시에 유저가 생성이 된다
    Table 두개가 동시에 처리되어야 하는 것....!


Srping boot Code



Swagger를 보면 알 수 있듯이 처음에는 room, user를 나누어서 만들었다. 그러나 일반적인 서비스와 달리 회원가입을 하지 않고 방을 생성하면서 유저도 생성하기 때문에 로직 변경이 필요했다.

  • 화상통화 룸을 만들때 방 생성,유저 생성의 값이 동시에 들어와 데이터가 쌓여야 함으로 Common DTO, Common Service, Controller 를 만들어 두 데이터를 조건에 따라 넣을 수 있도록 했다.
  • 화상 통화 룸에 입장할때 사용자는 수용인원과 방 비밀번호를 만들어서 생성할수있다
  • 화상 통화 룸 입장시, 입장한 인원을 count하고 생성된 유저는 roomId갖도록 한다. 수용인원보다 입장인원이 많을경우 에러코드 반환.
  • 화상 통화 룸을 나갈경우, 입장한 인원을 -1 count한다 이때 방의 인원이 1명 이하인경우에서 유저가 나가면 유저와 방도 동시에 삭제가 된다

기능 명세


image

Github

게시판 형태의 코드만 짜보다가 이번 프로젝트는 여러가지로 도전을 해본게 좋았다. 특히 깃을 적극적으로 사용해서 프로젝트를 만든적이 없는데 API가 적은만큼 두명에서 깃허브를 잘 사용해보기로 했다.

  • Issue


  • Project


  • Git-Convension & branch
    기능이 몇개 없기 때문에 dev 브렌치를 만들어서 issue에 적은 목표치 만큼 달성하면 main으로 merge해주었다

    이틀만에 후다닥 만들어야 해서 작업량을 정확하게 이등분시킬수 없었다.(그러기엔 기능이 너무 적다) 그래서 어느정도 시간텀을 정해서 할 수 있는 만큼 구현했다
    이런식으로 작업을 하면 더없이 이상적이지만 팀원 모두가 이를 정해서 단기성의 프로젝트를 수행하기에는 쉽지 않다. 기능 구현이 우선순위이고, 이런 규칙들이 익숙하지 않은 팀원이 있을 경우 서로 힘들고 지쳐버린다.
    issue, project, branch 등을 잘 이용해서 프로젝트를 할일이 없었는데 경험해보아서 좋았음!
    근데 이렇게 사용하는게 맞는거겠지?


SpringBoot 최종 정리

☀️ API 명세서

기능MethodURIInput VlaueOutput Value
방 생성GET/roomuserNickname, roomName, roomPassword,roomCapacityuserNickname, roomId, roomName, roomPassword,roomCapacity, roomEnterUser, roomCreateAt
방 검색POST/room/{roomName}roomId, roomName, roomPassword, roomCapacity,roomEnterUser, roomCreateAt
방 입장 + 유저 생성PATCH/room/enteruserNickname, roomName, roomPassword,roomCapacity, socketIdsocketId:userNickname
사용자 나가기 + 없으면 방 종료POST/room/exit?socketId={socketId}
사용자 방생성 검증POST/room/valid/createroomNameTrue/False
사용자 입장 검증POST/room/valid/enteruserNickname, roomId,roomPasswordpassword_error, capacity_error, nickname_error
전체 방 조회GET/roomroomId, roomName, roomPassword, roomCapacity,roomEnterUser, roomCreateAt

☀️ 기능 명세서

방 생성사용자는 방 제목(roomName), 수용인원(roomCapactiy)을 입력하여 회의실를 생성할 수 있다. 이때 사용자의 데이터도 작성해야 한다 닉네임(userNickName)
room 테이블에 저장되는 데이터 {roomId, roomName(100), roomCapacity, roomPassword(100), roomCreateAt, roomEnterUser}user 테이블에 저장되는 데이터 {userId, userNickName, userCreateAt, roomEntity}
1. 동일한 방 이름이 있는지 체크한다. 중복이 있을경우, DUPLICATE_RESOURCE 에러코드 반환
2. 동일한 닉네임으로 생성된 룸이 있는지 체크한다, 중복이 있을 경우 INVALID_NICKNAME 에러코드 반환
3. 위의 모든 조건이 충족되면 유저정보를 저장한다이때 방 정보에서 현재 방에 입장한 인원(roomEnterUser)값을 1 증가시킨다변경된 방 정보를 저장후 저장된 데이터들을 반환한다
방 검색사용자는 방 이름(roomName)으로 방을 검색할 수 있다.
1. 방 이름이 없는 경우 ROOM_IS_EMPTY에러코드 반환
2. 방 이름을 찾으면 데이터 값을 반환한다
방 입장사용자는 닉네임(userNickName), 비밀번호(userPassword)를 입력하여 방에 입장할 수 있다. 이때 PatchVariable로 roomId값이 필요하다
1. 방 아이디가 있는지 체크한다. 없을경우, ROOM_IS_EMPTY 에러코드 반환
2. 방 비밀번호가 맞는지 체크한다. 맞지 않을경우, INVALID_PASSWORD 에러코드 반환
3. 동일한 닉네임으로 생성된 룸이 있는지 체크한다, 중복이 있을 경우 INVALID_NICKNAME 에러코드 반환
4. 수용인원과 현재 입장한 인원수를 비교한다. 수용인원이 찼을경우 FULL_CAPACITY 에러코드 반환
5. 위의 모든 조건이 만족되면 유저를 생성하고 저장한 유저의 값과 방의 데이터를 반환한다
사용자 나가기 & 방 삭제현재 방에 입장한 인원(roomEnterUser)이 1일때 사용자 나가기 요청이 오면 방은 사용자와 함께 자동으로 삭제된다 입장한 인원이 2명이상 남아 있을 때 사용자만 나가게된다
1. 방 아이디(roomId)가 없을경우 ROOM_IS_EMPTY 에러코드 반환
2. 유저 아이디 (userId)가 없을경우 MEMBER_NOT_FOUND 에러코드 반환
3. 현재 방에 입장한 인원(roomEnterUser)이 1보다 클때 방의 입장한 인원을 1명 줄이고 update된 방 정보를 저장 후 유저의 값을 삭제한다 입장인원이 1보다 작을경우, 유저와 방을 모두 삭제한다
방 생성 검증사용자가 확인버튼을 누르면 방을 생성할 수 있는지 검증한다.
1. 방이름이 중복되는 경우에는 false 를 반환
2. 방이름이 중복되지 않는다면 True 를 반환
방 입장 검증사용자가 확인버튼을 누르면 방을 입장할 수 있는지 검증한다.
1. 같은방에 이미 같은 닉네임의 사용자가 있다면 nickname_error 를 반환한다.
2. 방의 정원이 이미 가득차있는 상태라면 capacity_error 를 반환한다.
3. 방의 비밀번호를 틀렸다면 password_error 를 반환한다.
4. 1~3 의 조건을 통과했다면 200 반환
전체 방 조회전체방 리스트를 조회한다.

☀️ Swagger

image

☀️ Dockerfile

  • 자동으로 jar 파일을 생성하기위해 코드 변경됨
FROM gradle:7.5.1-jdk11-alpine AS builder
RUN pwd
COPY ./EyesTalkDB ./EyesTalkDB
WORKDIR ./EyesTalkDB
RUN pwd
RUN chmod +x ./gradlew
RUN ./gradlew bootJar

FROM openjdk:11-jre-slim
COPY --from=builder /home/gradle/EyesTalkDB/build/libs/*.jar app.jar

EXPOSE 8080

ENTRYPOINT ["java", "-jar", "./app.jar", "-Dspring-boot.run.arguments=—SPRING_DATASOURCE_URL=${SPRING_DATASOURCE_URL}, —SPRING_DATABASE_USERNAME=${SPRING_DATABASE_USERNAME}, —SPRING_DATABASE_PASSWORD=${SPRING_DATABASE_PASSWORD}"]]
profile
개발기록

0개의 댓글