문제상황
우리팀은 WebRTC가 정상적으로 실행하는 것에도 어려움을 겪었기 때문에 데이베이스는 없는 상태로 서비스를 만들었다.
- ELK를 사용할때 데이터값이 휘발됨
- 쿠버네티스 환경에서 다수의 프론트 파드, 서비스 파드가 생겼을때 데이터베이스가 없으니 커넥션 문제도 생겼다.
- 급하게 데이터베이스를 적용시키기 위해 데이터베이스를 관리하는 서비스 로직을 구현해야했다
이곳은 지옥....
Swagger를 보면 알 수 있듯이 처음에는 room, user를 나누어서 만들었다. 그러나 일반적인 서비스와 달리 회원가입을 하지 않고 방을 생성하면서 유저도 생성하기 때문에 로직 변경이 필요했다.
게시판 형태의 코드만 짜보다가 이번 프로젝트는 여러가지로 도전을 해본게 좋았다. 특히 깃을 적극적으로 사용해서 프로젝트를 만든적이 없는데 API가 적은만큼 두명에서 깃허브를 잘 사용해보기로 했다.
- Issue
- Project
- Git-Convension & branch
기능이 몇개 없기 때문에 dev 브렌치를 만들어서 issue에 적은 목표치 만큼 달성하면 main으로 merge해주었다
이틀만에 후다닥 만들어야 해서 작업량을 정확하게 이등분시킬수 없었다.(그러기엔 기능이 너무 적다) 그래서 어느정도 시간텀을 정해서 할 수 있는 만큼 구현했다
이런식으로 작업을 하면 더없이 이상적이지만 팀원 모두가 이를 정해서 단기성의 프로젝트를 수행하기에는 쉽지 않다. 기능 구현이 우선순위이고, 이런 규칙들이 익숙하지 않은 팀원이 있을 경우 서로 힘들고 지쳐버린다.
issue, project, branch 등을 잘 이용해서 프로젝트를 할일이 없었는데 경험해보아서 좋았음!
근데 이렇게 사용하는게 맞는거겠지?
기능 | Method | URI | Input Vlaue | Output Value |
---|---|---|---|---|
방 생성 | GET | /room | userNickname, roomName, roomPassword,roomCapacity | userNickname, roomId, roomName, roomPassword,roomCapacity, roomEnterUser, roomCreateAt |
방 검색 | POST | /room/{roomName} | roomId, roomName, roomPassword, roomCapacity,roomEnterUser, roomCreateAt | |
방 입장 + 유저 생성 | PATCH | /room/enter | userNickname, roomName, roomPassword,roomCapacity, socketId | socketId:userNickname |
사용자 나가기 + 없으면 방 종료 | POST | /room/exit?socketId={socketId} | ||
사용자 방생성 검증 | POST | /room/valid/create | roomName | True/False |
사용자 입장 검증 | POST | /room/valid/enter | userNickname, roomId,roomPassword | password_error, capacity_error, nickname_error |
전체 방 조회 | GET | /room | roomId, 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 반환 | |
전체 방 조회 | 전체방 리스트를 조회한다. |
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}"]]